3

部分的な(マスクされた)透明度を持つGDIPlusを使用してTImageに表示される32ビット画像を取得できますが、アルファ値は0または255であり、間に値はありません。PngImageをロードしてみましたが、32ビットビットマップとアイコンはすべて同じものを生成します...マスクされた透明度ですが、完全な透明度ではありません。

望ましい結果の画像に示されているように、TImageに完全な透明度でGDI +グラフィックを表示させる別の方法はありますか?

ここに画像の説明を入力してください オープン後のGDIプラス

ここに画像の説明を入力してください 望ましい結果

procedure TFormMain.Open1Click ( Sender: TObject );
// Load a GDIPlus Bitmap into TImage
var
  GPBitmap: TGPBitmap;
  iHBitmap: HBITMAP;
  iStatus: TStatus;
const
  TRANS_COLOR = clBlack;
begin

  if OpenPictureDialog1.Execute then
  begin

    FilePath := OpenPictureDialog1.FileName;
    begin

      GPBitmap := TGpBitmap.Create ( FilePath );
      try

        iStatus := GPBitmap.GetHBITMAP ( aclBlack, iHBitmap );
        // As best as I can determine from the internet, the GetHBitmap which is needed to assign a GPbitmap to TImage
        // does not hold an alphachannel, so loaded images alpha are either 0 or 255, but drawing with alphachannel values does work.
        if iStatus = Ok then
        begin

          Image1.Picture.Bitmap.Handle := iHBitmap;
          Image1.Picture.Bitmap.TransparentColor := Image1.Picture.Bitmap.Canvas.Pixels [ 0, Image1.Picture.Bitmap.Height - 1 ];
          StatusBar1.Panels [ 0 ].Text := FileCtrl.MinimizeName ( ExtractFileDir ( FilePath ), Canvas, 200 ); // Folder
          StatusBar1.Panels [ 1 ].Text := FileCtrl.MinimizeName ( ExtractFileName ( FilePath ), Canvas, 75 ); // Filename
          StatusBar1.Panels [ 2 ].Text := 'Width: ' + IntegerToString ( Image1.Picture.Bitmap.Width ); // Width
          StatusBar1.Panels [ 3 ].Text := 'Height: ' + IntegerToString ( Image1.Picture.Bitmap.Height ); // Height
          StatusBar1.Panels [ 4 ].Text := BitDepthToColorString ( GetPixelFormatSize ( GPBitmap.GetPixelFormat ) ); // Bitdepth

          Image1.Refresh;

        end;

      finally
        GPBitmap.Free;
      end;

    end;

  end;

end;
4

1 に答える 1

2

あなたがする必要があるのは、画像が転送されるときに画像が描かれる表面と調和する背景色を選択することです。つまり、代わりに

iStatus := GPBitmap.GetHBITMAP ( aclBlack, iHBitmap );

使用する

iStatus := GPBitmap.GetHBITMAP(ColorRefToARGB(ColorToRGB(clBtnFace)), iHBitmap);

たとえば、画像がデフォルトの色付きのフォームにある場合。

この時点で、画像にアルファチャネルがないことはすでにわかっていますが、適切な色を使用して平坦化されています。Transparent..'TBitmap'のプロパティは、部分的な透過性には役立ちません。Transparentのプロパティを設定した場合TBitmapでも、別の色の背景に配置すると、質問の最初の画像のようになります。おそらく、エッジの色がより適切になります。いずれにせよ、それを使用する場合は、「TransparentColor」を「clBlack」ではなく「clBtnFace」に設定することを忘れないでください。

于 2012-04-14T01:59:18.593 に答える