Thema: GR32_PNG.pas

Einzelnen Beitrag anzeigen

Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#8

Re: GR32_PNG.pas

  Alt 2. Sep 2006, 22:28
Nur mal so nebenbei, ich habe mit das einfach mal so (siehe D.-Code) umgeschrieben. Dann kann man auch auf die extra Unit verzichten und die handhabung ist für mich einfacher/fexibler.

Delphi-Quellcode:
// Function: PNGToBitmap32(DstBitmap: TBitmap32; Png: TPngObject): Boolean;
// Das Result ist TRUE wenn das PNG-Image einen Alphachannel hat.
//////////////////////////////////////////////////////////////////////////////

function PNGtoBitmap32(DstBitmap: TBitmap32; Png: TPngObject): Boolean;
var
  TransparentColor: TColor32;
  PixelPtr: PColor32;
  AlphaPtr: PByte;
  X, Y: Integer;
begin
  DstBitmap.Assign(PNG);
  DstBitmap.ResetAlpha;

  case PNG.TransparencyMode of
    ptmPartial: // 8Bit Image
      begin
        if (PNG.Header.ColorType = COLOR_GRAYSCALEALPHA) or
           (PNG.Header.ColorType = COLOR_RGBALPHA) then
        begin
          PixelPtr := PColor32(@DstBitmap.Bits[0]);
          for Y := 0 to DstBitmap.Height - 1 do
          begin
            AlphaPtr := PByte(PNG.AlphaScanline[Y]);
            for X := 0 to DstBitmap.Width - 1 do
            begin
              PixelPtr^ := (PixelPtr^ and $00FFFFFF) or (TColor32(AlphaPtr^) shl 24);
              Inc(PixelPtr);
              Inc(AlphaPtr);
            end;
          end;
        end;
        Result := True;
      end;

    ptmBit: // 24 Bit Image
      begin
        TransparentColor := Color32(PNG.TransparentColor);
        PixelPtr := PColor32(@DstBitmap.Bits[0]);
        for X := 0 to (DstBitmap.Height - 1) * (DstBitmap.Width - 1) do
        begin
          if PixelPtr^ = TransparentColor then
            PixelPtr^ := PixelPtr^ and $00FFFFFF;
          Inc(PixelPtr);
        end;
        Result := True;
      end;

    ptmNone:
      Result := False;
  end;
end;
Delphi-Quellcode:
// Anwendungsbeispiel:

uses ..., GR32, PNGImage;

var
  PngImg: TPngObject;
  Bmp32: TBitmap32;

BEGIN
  Bmp32 := TBitmap32.Create;
  try
    PngImg := TPngObject.Create;
    try
      PngImg.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.png');
      // oder PngImg.LoadFromResource(...); etc.
      PNGToBitmap32(Bmp32, PngImg);
    finally
      PngImg.Free;
    end;

    Bmp32.Draw(...);

  finally
    Bmp32.Free;
  end;
end;
END.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat