![]() |
Randpixel von Icons glätten oder Imagelist mit PNG?
Hallo liebe Delphi-Experten,
im Rahmen eines Projekt habe ich eine Sammlung von ca. 1000 Icons im BMP-Format erhalten, welche ich nun für verschiedene Zwecke nutzen möchte, wie im VirtualTree, im Actionmenu oder auf einfachen Buttons. Das Problem, das dabei auftritt, ist besonders die weiße Hintergrundfarbe, welche in die Randpixel der eigentlichen Grafik der Icons übergeht. Die Standard-Imagelist von Delphi unterstützt nur eine Farbe als Transparenz, kann aber beispielsweise die zwar weiß wirkenden, aber nicht völlig weißen Randpixel nicht in eine transparente Farbe umwandeln. Wenn diese Icons dann beispielsweise auf den Canvas mit der Standard-clBtnFace Farbe ausgegeben werden, ist der weiße Hintergrund zwar korrekt transparent, aber diese fast-weißen Randpixel sehen rissig aus. Gibt es eine Möglichkeit, womöglich eine bereits existierende Komponente, die dieses Problem löst? Oder einen Algorithmus, welcher ausgehend von einem Pixel - z.B. dem Eckpixel, ähnlich dem Photoshop-Zauberstabs mit der 'Glätten'-Option, die Farbe durch eine andere ersetzt? Eine einstellbare Toleranz für die Transparenz-Farbe anhand des Abstands auf der RGB-Palette habe ich schon programmiert, das Ergebnis hat zwar weniger weißliche Randpixel, aber immer noch sehr rissige Kanten. Ziel wäre ein sanfter Übergang der Transparenz in die Grafik. Falls nicht, was ist mit PNG-Grafiken? Diese unterstützen eine sehr effektive Transparenz, sie werden ja schon ewig in MacOS eingesetzt. Kennt jemand eine Imagelist-Komponente, die sich für die Ausgabe und Speicherung von PNG-Grafiken eignet? Oder kennt jemand hierfür eine andere effektivere Lösung? Wäre für jeden Tip dankbar. Schönen Gruß, Rudy PS: Da ich neu hier bin, dem ganzen Forum ein freundliches Hallo! Ich hoffe ich kann künftig auch mit Rat und Tat zur Seite stehen - wenn ich helfen kann, mach ich das gerne. |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Hi Rudy ... und Herzlich Willkommen in der DP! :hi:
Zitat:
Ich selbst nutze in meinen Programmen nur noch PNG's und gehe dabei so vor: 1. PNG's besorgen ;) (siehe ![]() 2. Die benötigten PNG's in die Resourcen der Anwendung legen 3. Zur Laufzeit (beim Start) die benötigten PNG's holen, auf die Hintergrund-Farbe des Ziel-Steuerelements abmischen und als BMP einer "normalen" ImageList hinterlegen (das merkt man zeitlich nicht) 4. Die ImageList wie immer nutzen Zitat:
|
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Ben,
erst mal vielen Dank für Deine Antwort und den tollen Link zur PNG-Bibliothek, ist echt klasse. Zitat:
Dann haben alle PNGs, welche ich beim Programmstart von der Ressource geladen, einen Hintergrund verpasst und in die Standard-Imagelist gesetzt habe den falschen Hintergrund und sehen aus wie Klötzchen-Sticker. Selbst wenn das Ändern der Farbeinstellungen nicht zutrifft, ich könnte beispielsweise das Icon auf nem Button mit Verlauf brauchen und zugleich im Actionmenu mit clBtnShadow als Iconhintergrund und zugleich im Virtualtree - wenns gut geht ist da nur weiß als Hintergrund (und es geht selten gut). Die Imagelist müsste also die PNGs mit Transparenz speichern (nicht nur mit einer Transparenten Farbe) und je nach Control bei der Ausgabe das PNG auf den Hintergrund draufmischen. Gibt es sowas überhaupt schon, oder warten da eine Menge Hürden auf mich? Deshalb auch die Idee mit der Maskierung der Randpixel á la Photoshop-Zauberstab mit Glätten, also quasi bei der Ausgabe die Transparenzen mit dem Hintergrund abmischen. Irgendein Tip in die richtige Richtung, wie man das anfangen könnte? Wäre super. |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Servus,
schau mal diese topics an [dp]alpha* imagelist[/dp]. Weiß aber nicht, ob diese bei PNG funktionieren. |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Auch Dir Manne ein herzliches Danke, ich habe mir die Artikel durchgelesen, und dann über Umwege schließlich gefunden, das allen Anforderungen gerecht wird.
Die Lösung ist eine Kombination aus dem echt klasse ![]() ![]() Schönen Gruß, Rudy |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Hallo Rudy.
Auch wenn du jetzt schon eine Lösung gefunden hast, möchte ich dir doch ![]() Mfg Codewalker |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Hi Codewalker,
Klasse Tip, Danke! Inzwischen verwende ich auch ![]() Nur muss ich mit Icons sparen, da sie alle 970 zusammen (in 4 Größen - 48x48, 24x24 - 32x32, 16x16 - in eine BPL gepackt und statisch gelinkt) das Laden _horrend_ verlangsamen. Das zu lösen habe ich leider noch keine Idee... direkt auf die Hauptform zu geben kommt sowieso nicht in Frage, da dauert auch noch das Kompilieren ewig. Schon etwas doof die Sache. Aber das Ausgangsproblem ist gelöst, vielen Dank für eure Hilfe. Schönen Gruß, Rudy |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
*Thread wieder rauskram*
Zitat:
Ich kriege hier gerade den totalen Anfall (da mir diese ganzen Bilder sowieso auf die Nerven gehen :? ) weil ich das nicht hinbekomme. Ich habe einfach Transparente PNG's (Crystal SVG) und möchte die für einen BitButton verwenden. Das kann doch nicht so schwer sein! |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Zitat:
Vielleicht hast du ja hellseherische Fähigkeiten, aber ob du die auch deiner Software beibringen kannst? Gruss Reinhard |
Re: Randpixel von Icons glätten oder Imagelist mit PNG?
Zitat:
Delphi-Quellcode:
Natürlich könnte man das alles noch viel schöner schreiben (und vielleicht auch schneller). Aber es funktioniert und das reicht mir. :)//Diese Funktion wollen wir später mal aufrufen function AddPNGToImageList(PNG: TPNGObject; Backcolor:Graphics.TColor;ImageList:TCustomImageList):Integer; var BMP:Graphics.TBitmap; begin BMP:=Graphics.TBitmap.Create; PNGtoBitmap(PNG, BMP, Backcolor, ImageList.Width, ImageList.Height); Result:=ImageList.AddMasked(BMP,BMP.Canvas.Pixels[BMP.Width-1,0]); BMP.Free; end; //Das ist das eigentliche Abmischen procedure PNGtoBitmap(PNG : TPNGObject; BMP : Graphics.TBitmap; BackColor : Graphics.TColor; Width, Height: Integer); begin BMP.PixelFormat:=pf16bit; BMP.Width:=Width; BMP.Height:=Height; BMP.Canvas.Brush.Color:=Backcolor; BMP.Canvas.FillRect(Rect(0,0,BMP.Width,BMP.Height)); if Assigned(PNG) then PNG.Draw(BMP.Canvas,Rect(0,0,BMP.Width,BMP.Height)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 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