AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PNG zur Laufzeit in ImageList einfügen

Ein Thema von bezarre · begonnen am 1. Mai 2010 · letzter Beitrag vom 12. Feb 2011
Antwort Antwort
Seite 3 von 4     123 4      
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#21

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 19:21
@Thom: und das Ganze funktioniert auch noch mit TImageList?
Ja. Hier der Beweis:
imagelist_1.jpg
Das rechte obere Smiley ist ein TImage mit dem Original-PNG-Bild. Im FormShow-Event wird dieses Bild in eine normale Image-Liste kopiert (siehe erstes Beispiel). Diese Image-Liste wird vom Button zur Darstellung des Icons genutzt (ohne jeglichen eigenen Quelltext). Das Quadrat unteren ist ein TShape-Objekt, das in seiner rechten oberen Ecke von einer kleinen PaintBox überlagert ist und in die mit
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  ImageList1.Draw(PaintBox1.Canvas,0,0,0);
end;
gezeichnet wird. Mehr ist das nicht: Keine Magie, keine Tricks...
Eine Vergrößerung zeigt, das der Alpha-Kanal wirklich vorhanden ist:
imagelist_2.jpg

GDI+ ist auf allen Systemen enthalten.
Nein. Zum Beispiel auf Windows 98 und Windows 2000 noch nicht.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 19:25
Ich möchte bezweifeln das der AlphaChannel korrekt angezeigt wird..
Schon mal den AlphaChannel auf 75% Durchsichtigkeit verändert und dann anzeigen lassen ?

es sollte ja dann Transparent über deinen Panel liegen (Durchscheinend)

So in der art .. Siehe Pic
Hintergrundbild mit aufgesetztem PNG AlphaChannel 50%

gruss

Geändert von EWeiss ( 9. Jul 2019 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#23

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 19:49
OK - Hier der Versuch mit Geister-Smileys:
imagelist_3.jpg
Die Transparenz ist gut zu erkennen. Allerdings wird auch sichtbar, daß die Objekte (TImage und TButton) offenbar etwas unterschiedliche Zeichenalgorithmen verwenden, da die Farbsättigung differiert.

P.S.:
@EWeiss: Dein Bild sieht natürlich besser aus!
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (10. Feb 2011 um 20:00 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#24

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 19:52
OK - Hier der Versuch mit Geister-Smileys:
Anhang 33337
Die Transparent ist gut zu erkennen. Allerdings wird auch sichtbar, daß die Objekte (TImage und TButton) offenbar etwas unterschiedliche Zeichenalgorithmen verwenden, da die Farbsättigung differiert.
Supi..
Danke das du mich überzeugen konntest.
Denke damit kann man leben

Zitat:
P.S.:
@EWeiss: Dein Bild sieht natürlich besser aus!
Jo denke auch
hehehehe

gruss

Geändert von EWeiss ( 9. Jul 2019 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#25

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 20:04
Danke das du mich überzeugen konntest.
Keine Ursache - gern geschehen!

P.S.:
Dein Bild wird ja immer besser!
Gefällt mir!
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (10. Feb 2011 um 20:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.084 Beiträge
 
Delphi 12 Athens
 
#26

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 21:23
Ja, TBitmap unterstütz den Alpha-Kanal.
Gut, wenn man es über in ein TBitmap reinquetzt und keine delphieigenen Komponenten/Befehle verwendet, um es anzuzeigen oder zu bearbeiten, dann mag es gehen, wenn man das PalettenByte als Alphakanal mißbraucht und das TBitmap quasi nur als Speichermedium verwendet. Von den "normalen" Delphi/Windows-Funktionen würde der "Alpha"-Kanal aber bestimmt nur als Palette behandelt.


Hab nochmal schnell nachgeguck:
Zitat von OH:TColor:
Hat das höchstwertige Byte den Wert Null, erhalten Sie eine Farbe, die derjenigen in der Systempalette am ähnlichsten ist. Ist das höchstwertige Byte Eins ($01 bzw. 0x01), ergibt das eine Farbe, die derjenigen in der aktiven Palette am ähnlichsten ist. Wenn Sie das höchstwertige Byte auf Zwei ($02 bzw. 0x02) setzen, wird der Wert an die ähnlichste Farbe in der logischen Palette des aktuellen Gerätekontexts angepasst.
Und dann noch:
Delphi-Quellcode:
clSystemColor = $FF000000;
clNone = TColor($1FFFFFFF);
clDefault = TColor($20000000);

Genauso kann ich ja Binärdaten in einem (Ansi)String zwischenspeichern und es ist dennoch nicht sofort ein lesbarer/anzeigbarer "Text".
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Feb 2011 um 21:25 Uhr)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#27

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 11. Feb 2011, 12:21
Es geht

So um nur noch mein Ergebnis zu präsentieren:

1. Mit TImageList hat es NICHT geklappt. Was wohl auch an mir liegt. Ich hatte vergessen zu sagen das Bild selbst hat unterschiedliche Transparenz ich will das Bild nicht mit eine Gesamttransparenz zeichnen.

Hier der Code mit dem es geht und unten dann die Erklärung dazu:
Delphi-Quellcode:
      if Image <> nil then
      begin
        if Color <> clNone then
        begin
          Image2 := TPngImage.CreateBlank(COLOR_GRAYSCALE, 1, 16, 16);

          Image2.Canvas.Brush.Style := bsClear;

          Image2.Canvas.Font. Name := 'Small Fonts';
          Image2.Canvas.Font. Size := 5;
          Image2.Canvas.Font. Color := clWhite;

          Image2.Canvas.TextFlags := Image2.Canvas.TextFlags or ETO_OPAQUE;
          Image2.Canvas.TextOut(16 - Image2.Canvas.TextWidth(Text), - 2, Text);
        end;
      end;

      with Image do
      begin
        for y := 0 to Height - 1 do
        begin
          pb := AlphaScanline[y];
          for x := 0 to Width - 1 do
          begin
            ColorRGBToHLS(ImageColor, NewHue, NewLuminance, NewSaturation);

            if Image2.Pixels[x, y] = clWhite then
            begin
              Pixels[x, y] := clBlack;
              pb^[x] := 255;
            end
            else
              Pixels[x, y] := ColorHLSToRGB(NewHue, Trunc((pb^[x] + NewLuminance) / 2), NewSaturation);
          end;
        end;
      end;

      if Image <> nil then
      begin
        Liste.AddPng(Image);
      end;
1. TPngImage.CreateBlank(COLOR_GRAYSCALE, 1, 16, 16); erzeugt ein SCHWARZES Bild, ergo muß ich Weiß als Textfarbe nehmen.
2.
Delphi-Quellcode:
            if Image2.Pixels[x, y] = clWhite then
            begin
              Pixels[x, y] := clBlack;
              pb^[x] := 255;
            end
Das ist der eigentliche Knackpunkt, hier muß ich den Alphachannel auch noch setzen.

Vielen Dank an alle
David
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#28

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 11. Feb 2011, 16:49
Sind hier nur Skeptiker unterwegs!?
Gut, wenn man es über in ein TBitmap reinquetzt und keine delphieigenen Komponenten/Befehle verwendet, um es anzuzeigen oder zu bearbeiten, dann mag es gehen, wenn man das PalettenByte als Alphakanal mißbraucht und das TBitmap quasi nur als Speichermedium verwendet. Von den "normalen" Delphi/Windows-Funktionen würde der "Alpha"-Kanal aber bestimmt nur als Palette behandelt.
Im Bitmap kann die Farbtiefe über die Eigenschaft PixelFormat eingestellt werden. pf1bit erzeugt zum Beispiel ein Schwarz-Weiß-Bild. In einem Byte sind also (Windows-)intern (!!!) 8 nebeneinanderliegende Pixel enthalten. Kannst Du gern über ScanLine überprüfen. Wenn Du da mit der 32-Bit-TColor-Keule draufhauen würdest, würdest du dem Tapferen Schneiderlein Konkurrenz machen und auf einmal sogar 32 Pixel erschlagen! Die Methoden GetPixel und SetPixel des Windows API's (gekapselt in der Eigenschaft Canvas.Pixels[x,y]) rechnen die tatsächlich im Bitmap enthaltenen Werte um. Bei einem Schwarz-Weiß-Bild könnte ich natürlich ohne Fehlermeldung den Wert clRed übergeben - darf mich aber dann natürlich nicht wundern, wenn das nicht im Bitmap ankommt!

Ich habe irgendwie den Eindruck, daß Du nach dem Motto gehts: Was nicht sein darf, das kann nicht sein.
Probier's doch einfach aus: Lade ein beliebiges PNG-Bild in eine TImage-Komponente, kopiere zur Laufzeit das Bild in ein temporäres Bitmap und laß es in einer PaintBox anzeigen. Du wirst sehen: Die Transparenz des PNG-Bildes bleibt erhalten. Und jetzt kommt die (rhetorische) Frage: Wer hat das Bitmap auf den Bildschirm gezaubert? Das war Windows. Also kommt Windows (unter Berücksichtigung einiger Bedingungen) tatsächlich mit Alpha-Werten in Bitmaps zurecht!

Damit Du's und alle anderen, die es nicht glauben (wollen/können) habe ich eine kleine Demo fertig gemacht:
transparenz.jpg

Der Kern des Ganzen:
Delphi-Quellcode:
procedure TForm2.PaintBox1Paint(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp:=TBitmap.Create;
  try
    Bmp.Assign(Image1.Picture.Graphic);
    PaintBox1.Canvas.Draw(0,0,Bmp);
  finally
    Bmp.Free;
  end;
end;
Der Alpha-Kanal wird vom PNG-Bild korrekt in das Bitmap übernommen und von Windows wiederum richtig auf den Bildschirm dargestellt.
w.z.b.w.
q.e.d.

Sowohl die PaintBox als auch das Image sind auf dem Hintergrund verschiebbar. Wer's dann immer noch nicht glaubt, dem kann ich auch nicht mehr helfen...
Angehängte Dateien
Dateityp: zip Transparenz.zip (854,2 KB, 39x aufgerufen)
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (11. Feb 2011 um 16:59 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 11. Feb 2011, 17:37
Zitat:
Wer's dann immer noch nicht glaubt, dem kann ich auch nicht mehr helfen...
Ich bin nicht gläubig.
Aber in dem Fall schon

Dafür muss ich das nicht extra laden..
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#30

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 11. Feb 2011, 18:32
Etwas OT:
Ich bin nicht gläubig.
Ich auch nicht... Deshalb finde ich Matthias Eissing's Berufsbezeichnung auch immer etwas befremdlich, wenn ich wieder einmal darüber stolpere: National Evangelist Germany. Ich weiß: Das ist wohl eher im Sinne eines Technology Evangelisten gemeint - aber trotzdem hat es für mich einen merkwürdigen Beigeschmack. Tja, ja - die Ammis (Embarcadero) mit ihrem Sendungsbewußtsein...

Mal sehen, was himitsu dazu meint... (Damit meine ich nicht die Glaubensfrage sondern die Transparenzfähigkeit von Bitmaps.)
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz