我正在尝试绘制一个源图像(GR32 TBitmap32),该图像在正常(TBitmap)图像上包含一些完全透明和部分透明的像素,同时保留了源图像的透明度。

我用这个:

BMP32.DrawTo(BMP.Canvas.Handle, 0, 0);


但是图像不是透明绘制的。



码:
一切都很基本:我有一个背景位图(Bkg),在应用程序启动时在其中加载图像。
然后在“应用”过程中,从磁盘加载第二张图像(具有透明度的图像),然后将其绘制在背景上。

var Bkg: TBitmap;

procedure TfrmPhoto.FormCreate(Sender: TObject);
begin
 Bkg:= LoadGraphEx(GetAppDir+ 'bkg.bmp'); { Load bitmap from file }
 {
 Bkg.Transparent:= TRUE;
 Bkg.PixelFormat:= pf32bit;
 Bkg.TransparentColor:= clPink;
 }
end;


procedure TfrmPhoto.Apply2;
VAR
   Loader: TBitmap;
   BMP32: tbitmap32;
begin
 BMP32:= TBitmap32.Create;
 TRY

  Loader:= TBitmap.Create;
  TRY
   Loader.LoadFromFile('c:\Transparent.BMP');
   BMP32.Assign(Loader);
  FINALLY
   FreeAndNil(Loader);
  END;

  { Mix images }
  BMP32.DrawTo(Bkg.Canvas.Handle, 0, 0);    <----- The problem is here

  imgPreview.Picture.Assign(Bkg);    { This is a TImage where I see the result }
 FINALLY
  FreeAndNil(BMP32);
 END;
end;

最佳答案

它与TransparentBlt()一起工作(但有两个缺点)。


我对TransparentBlt处理半透明像素(旋转图像的边缘)的方式不满意。将src图像合并到背景中后,边缘看起来不好。
为了使用TransparentBlt,我必须在源图像中将颜色(clPink)定义为透明。这意味着,如果源图像中有一些粉红色,结果将看起来非常讨厌(将被视为透明)。让我们为非粉红色的图片祈祷!


如果您找到一种将图像(同时保持透明性)直接从Bitmap32传输到后台的方法,请发布,我会接受您的回答!

我在这里看到的一个解决方案(仍然是hack)是处理TBitmap32中的所有内容,然后将最终结果“导出”为TBitmap。我明天试试。



更新:
解:

这是在保留透明度的同时合并两个TBitmap32图像的方法:

 Dst.CombineMode:= cmBlend;
 Dst.DrawMode:= dmBlend;
 Src.Draw(0, 0, Dst);


Dst和Src是TBitmap32图像。它不适用于TBitmap。

10-07 19:20
查看更多