Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Randpixel von Icons glätten oder Imagelist mit PNG? (https://www.delphipraxis.net/71650-randpixel-von-icons-glaetten-oder-imagelist-mit-png.html)

Rudy 18. Jun 2006 23:47


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.

chaosben 19. Jun 2006 05:20

Re: Randpixel von Icons glätten oder Imagelist mit PNG?
 
Hi Rudy ... und Herzlich Willkommen in der DP! :hi:
Zitat:

Zitat von Rudy
Kennt jemand eine Imagelist-Komponente, die sich für die Ausgabe und Speicherung von PNG-Grafiken eignet?

Ich hab nicht ganz verstanden was du damit meinst. Deshalb hoffe ich, das ich nun folgend nicht so sehr an dir vorbeirede. :)
Ich selbst nutze in meinen Programmen nur noch PNG's und gehe dabei so vor:
1. PNG's besorgen ;) (siehe www.kde-look.org) [Da gibts so viele schöne Icons das man gar nicht weiß welche man nehmen soll]
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:

Zitat von 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.

Solche Einsteiger in die DP wünsch ich mir immer. :)

Rudy 19. Jun 2006 19:06

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:

Ich hab nicht ganz verstanden was du damit meinst.
Gut, ich versuchs mal anders auszudrücken... es gibt ja zahlreiche Komponenten, wie beispielsweise das Actionmenu oder der VirtualGrid, welche CustomImagelists als property akzeptieren und den untergeordneten Elementen die Grafik dann anhand des ImageIndex zuweisen. Der Haken an der Sache ist, dass ich vorerst ja gar nicht weiß, welchen Hintergrund die PNGs erhalten werden, es kann ein Verlauf sein (ich hab da so meine Komponenten) oder sonst irgendeine benutzerdefinierte Anzeigeneinstellung, welche auch zur Laufzeit geändert werden könnte - ganz banal: ich ändere das XP-Theme von Blau auf Silber.

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.

Manne 19. Jun 2006 19:24

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.

Rudy 19. Jun 2006 21:23

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 TPngObject, welches ja u.a. eine Draw-Methode auf TCanvas hat und dieser Implementation einer PNG Imagelist, die ich schließlich auf einer niederländischen Seite fand - verstehe zwar kein Wort von dem was der nette Mensch da erklärt, aber Code kann ich noch lesen :) - und ... funktioniert. :wink:

Schönen Gruß,
Rudy

Codewalker 20. Jun 2006 10:51

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 http://www.thany.org empfehlen. Da gibt es eine TPNGImageList. Diese kann man wie die normale ImageList verwenden, d.h. auch ActionManagern etc. zuordnen, sie kann aber PNGs einlesen mit vollständiger Alpha-Transparenz.

Mfg

Codewalker

Rudy 21. Jun 2006 19:39

Re: Randpixel von Icons glätten oder Imagelist mit PNG?
 
Hi Codewalker,

Klasse Tip, Danke! Inzwischen verwende ich auch ähnliche Komponenten, die ich mehr durch Zufall entdeckt habe - das hat einige Vorteile gegenüber der Runtime-Imagelist, die selbst abgeleitet beispielsweise keinen nutzbaren Editor hat.

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

glkgereon 20. Feb 2007 19:25

Re: Randpixel von Icons glätten oder Imagelist mit PNG?
 
*Thread wieder rauskram*

Zitat:

Zitat von chaosben
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)

Wie genau machst du dieses Abmischen?
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!

Reinhard Kern 21. Feb 2007 00:18

Re: Randpixel von Icons glätten oder Imagelist mit PNG?
 
Zitat:

Zitat von glkgereon
*Thread wieder rauskram*

Zitat:

Zitat von chaosben
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)

Wie genau machst du dieses Abmischen?
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!

Doch ist es, wenn du Käntenglättung willst - dazu musst du nämlich die Vordergrund- UND die Hintergrundfarbe kennen, aber die Hintergrundfarbe ergibt sich erst zur Laufzeit. Du kannst z.B. die Glättung durchrechenen lassen für weiss, aber das sieht dann eben auf einem schwarzen Hintergrund noch schlechter aus als ungeglättet.

Vielleicht hast du ja hellseherische Fähigkeiten, aber ob du die auch deiner Software beibringen kannst?

Gruss Reinhard

chaosben 21. Feb 2007 05:59

Re: Randpixel von Icons glätten oder Imagelist mit PNG?
 
Zitat:

Zitat von glkgereon
Wie genau machst du dieses Abmischen? [...] Das kann doch nicht so schwer sein!

Das ist einfacher als du denkst. Hier ein Paar Ausschnitte aus der Unit:
Delphi-Quellcode:

//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;
Natürlich könnte man das alles noch viel schöner schreiben (und vielleicht auch schneller). Aber es funktioniert und das reicht mir. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr.
Seite 1 von 2  1 2      

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