Die beiliegende Routine dient dazu BMP's mit Alphakanalinfo's in PNG's zu speichern.
Nicht ganz das was Du brauchst, aber Du kannst erkennen wie es funktioniert und es für Deine Zwecke umschreiben.
Delphi-Quellcode:
function PNG4TransparentBitMap(bmp:TBitmap):TPNGImage;
//201011 Thomas Wassermann
var
x, y:Integer;
vBmpRGBA: ^TRGBAArray;
vPngRGB: ^TRGB;
begin
Result := TPNGImage.CreateBlank(COLOR_RGBALPHA, 8, bmp.Width , bmp.Height);
Result.CreateAlpha;
Result.Canvas.CopyMode:= cmSrcCopy;
Result.Canvas.Draw(0,0,bmp);
for y := 0 to pred(bmp.Height) do begin
vBmpRGBA := bmp.ScanLine[y];
vPngRGB:= Result.Scanline[y];
for x := 0 to pred(bmp.width) do begin
Result.AlphaScanline[y][x] := vBmpRGBA[x].A;
if bmp.AlphaFormat in [afDefined,afPremultiplied] then begin
if vBmpRGBA[x].A <> 0 then begin
vPngRGB^.b:= round(vBmpRGBA[x].b/vBmpRGBA[x].A*255);
vPngRGB^.r:= round(vBmpRGBA[x].r/vBmpRGBA[x].A*255);
vPngRGB^.g:= round(vBmpRGBA[x].g/vBmpRGBA[x].A*255);
end else begin
vPngRGB^.b:= round(vBmpRGBA[x].b*255);
vPngRGB^.r:= round(vBmpRGBA[x].r*255);
vPngRGB^.g:= round(vBmpRGBA[x].g*255);
end;
end;
inc(vPngRGB);
end;
end;