Einzelnen Beitrag anzeigen

David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#3

AW: Farbton eines Bildes ändern

  Alt 8. Dez 2010, 11:45
Danke an Blup du hast mich auf die richtige Idee gebracht.

Ich hab aus dem Orginalbild ein Bild nur mit Alphakanal gemacht, darauf kommt es mir ja auch eigentlich nur an. (siehe Anhang)

hier dann der Code:
Delphi-Quellcode:
uses
  ShLwApi; // für RGBToHLS und HLSToRGB

function LoadPNG(Name: string; NewColor: TColor): Graphics.TBitmap;
var
  PNGImage : TPngObject;
  hLib : THandle;
  NewHue, NewLuminance, NewSaturation : Word;
  x, y: Integer;
  pb : pByteArray;
begin
  Result := Graphics.TBitmap.Create;
  try
    hLib := LoadLibrary(...);

    PNGImage := TPngObject.Create;
    PNGImage.LoadFromResourceName(hLib, Name);
    PNGImage.Transparent := true;

    ColorRGBToHLS(NewColor, NewHue, NewLuminance, NewSaturation);

    with PNGImage do
    begin
      for y := 0 to Height - 1 do
      begin
        pb := AlphaScanline[y];
        for x := 0 to Width - 1 do
        begin
          Pixels[x, y] := ColorHLSToRGB(NewHue, Trunc((pb^[x] + NewLuminance) / 2), NewSaturation);
        end;
      end;
    end;

    Result.Canvas.Brush.Color := clBtnFace;
    Result.Width := PNGImage.Width;
    Result.Height := PNGImage.Height;
    Result.Canvas.StretchDraw(Rect(0, 0, PNGImage.Width, PNGImage.Height), PNGImage);

    PNGImage.Free;
  except
  end;
end;
Im nachhinein eigentlich ganz einfach.

1. PNGImage laden (hier über LoadFromResourceName)
2. die neue Farbe des Bildes in HLS umwandeln
3. mit AlphaScanline den Alphakanal des Bildes laden
4. die Pixel mit der neuen Farbe und dem richtigen Alphawert setzen
5. da ich hier ein TBitmap zurückgebe, die Hintergrundfarbe setzen das PNGImage zeichnen

Gruß David
Angehängte Grafiken
 
  Mit Zitat antworten Zitat