1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| type TRGB = packed record b, g, r: Byte end; TRGBA = packed record b, g, r, a: Byte end; TRGBAArray = array[0..0] of TRGBA;
function PNG4TransparentBitMap(bmp:TBitmap):TPNGImage; 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;
end; |