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;
インターネットで何時間も検索した後、複数のアルファチャンネルを使用する必要があることがわかりました。私はここからいくつかのコードを取得します(Mike Suttonの答え): Fade in a 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
ビットマップ プロパティの透明が正しく機能しません - 画像に黒い背景が残っています。
アドバイスをくれる皆さん、ありがとう!
EDIT
を設定PixelFormat = pf32bitすると、ビットマップが視覚的に「壊れた」状態になります。
下の図は、この効果を示しています。







