1

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;

私が得たものは、下の写真で見ることができます:
あらかじめ乗算されたアルファなしの png

インターネットで何時間も検索した後、複数のアルファチャンネルを使用する必要があることがわかりました。私はここからいくつかのコードを取得します(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 画像を見ることができます。
ここに画像の説明を入力

だから、私の質問は:透明で黒い背景なしでPNGファイルを正しく描画する方法は?

GraphicEx のユニットを調べましたが、質問に関する十分な情報が得られません。GraphicEx のような本格的なグラフィック ライブラリが、問題なく PNG ファイルを描画できないとは信じられません。

PS
ビットマップ プロパティの透明が正しく機能しません - 画像に黒い背景が残っています。

アドバイスをくれる皆さん、ありがとう!

EDIT
を設定PixelFormat = pf32bitすると、ビットマップが視覚的に「壊れた」状態になります。
下の図は、この効果を示しています。
ビットマップ上のアーティファクト

4

1 に答える 1

2

問題は、Mike の PNG グラフィックが描画の透明度をサポートしていないことです。

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
    g: TGraphic;
begin
    g := TPNGGraphic.Create;
    g.LoadFromFile('D:\Temp\FolderOpen_48x48_72.png');
    PaintBox1.Canvas.Draw(0, 0, g);
end;

アルファチャンネルを考慮せずに出てきます:

ここに画像の説明を入力

TPNGオブジェクト

Delphi 2005 では、Gustavo Daud のpngdelphiライブラリ (後に Delphi に吸収されたクラスです) を使用できます。アルファ ブレンディングを使用した描画を完全にサポートしました。

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
    g: TGraphic;
begin
//  g := TPNGGraphic.Create;
    g := TPNGObject.Create;
    g.LoadFromFile('D:\Temp\FolderOpen_48x48_72.png');
    PaintBox1.Canvas.Draw(0, 0, g);
end;

それは正しく描画されます:

ここに画像の説明を入力

Windows イメージング コンポーネント

Borland がいつ Windows Imaging Component (WIC) を Delphi に追加したかはわかりません。しかし、Delphi 5 では、ヘッダーを自分で翻訳し、WIC を使用してすべての作業を実行するTGraphicTWicGraphicを作成しました。

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
    g: TGraphic;
begin
//  g := TPNGGraphic.Create;
//  g := TPNGObject.Create;
    g := TWicGraphic.Create;
    g.LoadFromFile('D:\Temp\FolderOpen_48x48_72.png');
    PaintBox1.Canvas.Draw(0, 0, g);
end;

また、正しく描画されます。

ここに画像の説明を入力

GDI+

GDI+もあります。また、ボーランドがいつ GDI+ のサポートを Delphi に追加したかもわかりません。しかし、Delphi 5 では、GDI+ を自分で翻訳し、すべての作業に GDI+ を使用するTGraphicTGDIPlusGraphicを作成しました。

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
    g: TGraphic;
begin
//  g := TPNGGraphic.Create;
//  g := TPNGObject.Create;
//  g := TWicGraphic.Create;
    g := TGDIPlusGraphic.Create;
    g.LoadFromFile('D:\Temp\FolderOpen_48x48_72.png');
    PaintBox1.Canvas.Draw(0, 0, g);
end;

また、正しく描画されます。

ここに画像の説明を入力


しかし、あなたの質問に答えるには:できません。TPNGGraphicアルファチャンネルをサポートするためにマイクを書き直さないわけにはいきません。

于 2016-08-16T15:05:35.010 に答える