AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

png icon umfärben

Ein Thema von theoneand · begonnen am 4. Mär 2014 · letzter Beitrag vom 6. Mär 2014
Antwort Antwort
theoneand

Registriert seit: 21. Mär 2013
38 Beiträge
 
Delphi XE8 Professional
 
#1

png icon umfärben

  Alt 4. Mär 2014, 14:43
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
Angehängte Grafiken
   
Angehängte Dateien
Dateityp: zip color icons.zip (64,8 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: png icon umfärben

  Alt 4. Mär 2014, 15:57
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 MSDN-Library durchsuchenStretchBlt.

Geändert von nuclearping ( 4. Mär 2014 um 16:00 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#3

AW: png icon umfärben

  Alt 5. Mär 2014, 14:21
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;
  Mit Zitat antworten Zitat
theoneand

Registriert seit: 21. Mär 2013
38 Beiträge
 
Delphi XE8 Professional
 
#4

AW: png icon umfärben

  Alt 6. Mär 2014, 10:31
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....
Angehängte Grafiken
 
  Mit Zitat antworten Zitat
theoneand

Registriert seit: 21. Mär 2013
38 Beiträge
 
Delphi XE8 Professional
 
#5

AW: png icon umfärben

  Alt 6. Mär 2014, 16:04
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

Falls jemand interesse hat, hier der code:

Code:
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;
einfach für r,g und b die gewünschten Werte festlegen und gut ist
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: png icon umfärben

  Alt 6. Mär 2014, 20:01
Cool. 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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:12 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