![]() |
png icon umfärben
Liste der Anhänge anzeigen (Anzahl: 4)
hallo zusammen, ich schreib gerade ein kleines Programm, um icons im PNG Format umzufärben.
Die icons sind immer einfarbig mit transparenz aussen. (siehe Bild Anhang1) Das Färben funktioniert auch soweit, das Problem ist, dass die PNG's am Rand leicht transparent sind, praktisch damit die Kanten besser aussehen. Ich hab erst versucht direkt das PNG zu färben und als zweites habe ich probiert das PNG in eine Bitmap zu wandeln und dann zu färben, letzteres führte zum Erfolg, nur wie gesagt ohne die Übergänge. (siehe Bild Anhang 2) Dann habe ich versucht von dem PNG die alpha-Werte in einem Array zwischenzuspeichern und diese Transparenzwerte nach umfärben wieder draufzulegen. (siehe Bild Anhang) Hat jemand eine Idee, wie ich diese Übergangstransparenz wieder bekomme?? Im Anhang 4 mein Source Code |
AW: png icon umfärben
Das Problem an den "transparenten Ecken" ist wohl, dass diese so auch in dem Grafikprogramm erstellt wurden (Photoshop / GIMP mit Layern). Also scheinbar wurden die Ränder da "künstlich" transparent gemacht. Und wenn du da mit nur einer Farbe drübermalst, dann hat das erstmal nichts mit dem Alpha-Channel zu tun.
Was du machen müsstest wäre entweder eine Funktion nachzuprogrammieren, wie sie Photoshop mit "Farbe ersetzen" anbietet. Oder was du mal ganz blöd versuchen kannst, wäre das, was man auch beim "Anti Aliasing" macht: Das Bild in eine viel höhere Auflösung hochrechnen, dann "drübermalen", dann wieder runterrechnen (zB mit einem bilinearen oder bikubischen Algorithmus (Google, gibts fertige Delphi-Implementierungen für, glaube auch hier in der DP) ...). PS: Vielleicht reicht zum hoch- und runterskalieren auch schon ![]() |
AW: png icon umfärben
Versuch mal so:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var filename: String; png1: TPNGObject; x, y : Integer; Line : PRGB32Array; R, G, B: Byte; begin R := 0; G := 0; B := 0; if OpenDialog1.execute then begin filename := OpenDialog1.FileName; if pos('.png', filename) > 0 then begin png1 := TPNGObject.create; try png1.LoadFromFile(filename); for y := 0 to png1.Height - 1 do begin line := png1.scanline[y]; for x := 0 to png1.Width-1 do begin //alpha Werte des Quell PNG's nicht verändern if (Line[x].R <> 255) or (Line[x].G <> 255) or (Line[x].B <> 255) then begin Line[x].R := R; Line[y].G := G; Line[x].B := B; end; end; end; png1.SaveToFile('test.png'); finally PNG1.Free; end; end; end; end; |
AW: png icon umfärben
Liste der Anhänge anzeigen (Anzahl: 1)
irgendwie scheint es, dass ich nicht alle pixel bekomme, bzw wenn ich es so mache wie du es gesagt hast,
kommt folgendes raus: (bild im anhang) er färbt mir gar nichts ein, er schneidet nur pixel raus.... |
AW: png icon umfärben
habs endlich hinbekommen.
Und zwar sind die PNG´s mit 8 bit Farbtiefe. Hab deshalb versucht die Farbpalette neu zu machen und siehe da, es geht :D Falls jemand interesse hat, hier der code:
Code:
einfach für r,g und b die gewünschten Werte festlegen und gut ist :D
procedure TForm1.setpalette;
var X, Y, PalCount: Integer; Line: Pointer; PaletteHandle: HPalette; Palette: array[Byte] of TPaletteEntry; png1: TPNGObject; begin png1 := TPNGObject.create; //png1.LoadFromFile('Quellbild.png'); try png1.LoadFromFile('kacke.png'); if png1.Header.ColorType = COLOR_PALETTE then begin PaletteHandle := png1.Palette; PalCount := GetPaletteEntries(PaletteHandle, 0, 256, Palette); for x := 0 to PalCount-1 do begin Palette[x].peRed := r; Palette[x].peGreen := g; Palette[x].peBlue := b; end; SetPaletteEntries(PaletteHandle, 0, PalCount, Palette); png1.Palette := PaletteHandle; end; png1.SaveToFile('kacke.png'); finally png1.free; end; end; |
AW: png icon umfärben
Cool. :thumb: Das ist auch in etwa das, was ich meinte mit der "Farbe ersetzen"-Funktion á la Photoshop. Da wird im Grunde auch nur die Palette manipuliert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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