3

我可以使用 GDIPlus 在 TImage 中显示一个 32 位图像,该图像具有部分(蒙版)透明度,但 alpha 值为 0 或 255,两者之间没有值。我尝试加载 PngImage,32 位位图和图标都产生相同的......蒙版透明度但不是完全透明度。

是否有另一种方法可以让 TImage 显示具有完全透明度的 GDI+ 图形,如所需结果图像中所示?

在此处输入图像描述 GDI Plus 开启后

在此处输入图像描述 期望的结果

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);

例如,如果图像采用默认彩色形式。

此时您已经知道该图像没有 Alpha 通道,但已使用合适的颜色对其进行了展平处理。'TBitmap'的Transparent..属性对部分透明度没有帮助。如果你设置 的Transparent属性,TBitmap当你把它放在不同颜色的背景上时,它仍然会像你问题的第一张图片,可能有更好的边缘颜色。无论如何,如果您使用它,请不要忘记将“TransparentColor”设置为“clBtnFace”而不是“clBlack”。

于 2012-04-14T01:59:18.593 回答