Einzelnen Beitrag anzeigen

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