我对PNG格式有一点问题。为了读取和显示 PNG 文件,我使用GraphicEx
Mike Lischke 的库(在那儿找到了)。在我决定用透明背景绘制 PNG 文件之前,一切都很好。
我使用此代码在表单的画布上加载和绘制 PNG:
procedure TForm1.aButton1Click(Sender: TObject);
var
PNGGraph: GraphicEx.TPNGGraphic;
begin
PNGGraph := GraphicEx.TPNGGraphic.Create;
PNGGraph.PixelFormat := pf32bit; - added code line
PNGGraph.LoadFromFile('demo.png');
Form1.Canvas.Draw(10, 10, PNGGraph);
PNGGraph.Free;
end;
在互联网上搜索了几个小时后,我发现我应该使用多个 alpha 通道。我从这里得到一些代码(Mike Sutton 的回答):Fade in an alpha-blended PNG form in Delphi
procedure PreMultiplyBitmap(Bitmap: TBitmap);
var
Row, Col: integer;
p: PRGBQuad;
PreMult: array[byte, byte] of byte;
begin
// precalculate all possible values of a*b
for Row := 0 to 255 do
for Col := Row to 255 do
begin
PreMult[Row, Col] := Row*Col div 255;
if (Row <> Col) then
PreMult[Col, Row] := PreMult[Row, Col]; // a*b = b*a
end;
for Row := 0 to Bitmap.Height-1 do
begin
Col := Bitmap.Width;
p := Bitmap.ScanLine[Row];
while (Col > 0) do
begin
p.rgbBlue := PreMult[p.rgbReserved, p.rgbBlue];
p.rgbGreen := PreMult[p.rgbReserved, p.rgbGreen];
p.rgbRed := PreMult[p.rgbReserved, p.rgbRed];
inc(p);
dec(Col);
end;
end;
end;
上面的图片有黑色背景,同时看起来几乎是原始图像。
所以,我的问题是:如何正确绘制具有透明度且没有黑色背景的 PNG 文件?
我查看了 GraphicEx 的单位,但无法获得有关我的问题的足够信息。不敢相信像GraphicEx这样严肃的图形库不能毫无问题地绘制PNG文件。
PS
位图属性透明无法正常工作 - 图片上仍然有黑色背景。
感谢所有能给我建议的人!