AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Randpixel von Icons glätten oder Imagelist mit PNG?
Thema durchsuchen
Ansicht
Themen-Optionen

Randpixel von Icons glätten oder Imagelist mit PNG?

Ein Thema von Rudy · begonnen am 19. Jun 2006 · letzter Beitrag vom 23. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Rudy
Rudy

Registriert seit: 12. Jun 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#1

Randpixel von Icons glätten oder Imagelist mit PNG?

  Alt 19. Jun 2006, 00:47
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.
Rudy
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

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

  Alt 19. Jun 2006, 06:20
Hi Rudy ... und Herzlich Willkommen in der DP!
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 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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von Rudy
Rudy

Registriert seit: 12. Jun 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 19. Jun 2006, 20:06
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.
Angehängte Grafiken
Dateityp: bmp pixelding_194.bmp (21,2 KB, 153x aufgerufen)
Rudy
  Mit Zitat antworten Zitat
Benutzerbild von Manne
Manne

Registriert seit: 8. Okt 2003
Ort: Hirrlingen
82 Beiträge
 
Delphi 7 Personal
 
#4

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

  Alt 19. Jun 2006, 20:24
Servus,

schau mal diese topics an [dp]alpha* imagelist[/dp]. Weiß aber nicht, ob diese bei PNG funktionieren.
So 6 wie wir 5 gibt es keine 4 andere, denn wir 3 sind die 2 1sten
  Mit Zitat antworten Zitat
Benutzerbild von Rudy
Rudy

Registriert seit: 12. Jun 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 19. Jun 2006, 22:23
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.

Schönen Gruß,
Rudy
Rudy
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 20. Jun 2006, 11:51
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Rudy
Rudy

Registriert seit: 12. Jun 2006
7 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 21. Jun 2006, 20:39
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
Rudy
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#8

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

  Alt 20. Feb 2007, 20:25
*Thread wieder rauskram*

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!
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#9

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

  Alt 21. Feb 2007, 01:18
Zitat von glkgereon:
*Thread wieder rauskram*

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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#10

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

  Alt 21. Feb 2007, 06:59
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:26 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