![]() |
AW: PNG zur Laufzeit in ImageList einfügen
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Anhang 33334 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:
gezeichnet wird. Mehr ist das nicht: Keine Magie, keine Tricks...
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin ImageList1.Draw(PaintBox1.Canvas,0,0,0); end; Eine Vergrößerung zeigt, das der Alpha-Kanal wirklich vorhanden ist: Anhang 33335 Zitat:
|
AW: PNG zur Laufzeit in ImageList einfügen
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 |
AW: PNG zur Laufzeit in ImageList einfügen
Liste der Anhänge anzeigen (Anzahl: 1)
OK - Hier der Versuch mit Geister-Smileys:
Anhang 33337 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! 8-) |
AW: PNG zur Laufzeit in ImageList einfügen
Zitat:
Danke das du mich überzeugen konntest. Denke damit kann man leben :) Zitat:
hehehehe gruss |
AW: PNG zur Laufzeit in ImageList einfügen
Zitat:
P.S.: Dein Bild wird ja immer besser! 8-) Gefällt mir! |
AW: PNG zur Laufzeit in ImageList einfügen
Zitat:
Hab nochmal schnell nachgeguck: Zitat:
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". |
AW: PNG zur Laufzeit in ImageList einfügen
Es geht :dp:
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:
1.
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;
Delphi-Quellcode:
erzeugt ein SCHWARZES Bild, ergo muß ich Weiß als Textfarbe nehmen.
TPngImage.CreateBlank(COLOR_GRAYSCALE, 1, 16, 16);
2.
Delphi-Quellcode:
Das ist der eigentliche Knackpunkt, hier muß ich den Alphachannel auch noch setzen.
if Image2.Pixels[x, y] = clWhite then
begin Pixels[x, y] := clBlack; pb^[x] := 255; end Vielen Dank an alle David |
AW: PNG zur Laufzeit in ImageList einfügen
Liste der Anhänge anzeigen (Anzahl: 2)
Sind hier nur Skeptiker unterwegs!? :wink:
Zitat:
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: Anhang 33345 Der Kern des Ganzen:
Delphi-Quellcode:
Der Alpha-Kanal wird vom PNG-Bild korrekt in das Bitmap übernommen und von Windows wiederum richtig auf den Bildschirm dargestellt.
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; 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... :roll: |
AW: PNG zur Laufzeit in ImageList einfügen
Zitat:
Aber in dem Fall schon ;) Dafür muss ich das nicht extra laden.. |
AW: PNG zur Laufzeit in ImageList einfügen
Etwas OT:
Zitat:
![]() ![]() Mal sehen, was himitsu dazu meint... (Damit meine ich nicht die Glaubensfrage sondern die Transparenzfähigkeit von Bitmaps.) :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz