我想在用于打印水印的画布上画一个透明的tmetafile。

问题是Alphablend函数无法识别tmetafile.handle作为预期的画布手柄。

我创建了一个具有透明度的32位位图,但是在上面绘制它会迫使白色背景,因此在画布上您可以看到Alpha混合矩形。如何在屏幕/打印机帆布上绘制透明的tmetafile?

Tmetafile肯定是透明的,我已经使用具有非标准背景颜色的IE在简单的网页上进行了测试。源代码:

procedure TPainter.DrawAlpha(ACanvas: TCanvas; ARect: TRect; AGraphic: TMetafile; AAlpha: Byte);
var
  bmp: TBitmap;
  bf: BLENDFUNCTION;
begin
  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32bit;
    bmp.SetSize(ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
    bmp.Transparent := True;
    bmp.Canvas.Brush.Color := clNone;
    bmp.Canvas.Brush.Style := bsClear;
    bmp.Canvas.FillRect(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top));
    bmp.Canvas.StretchDraw(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top), AGraphic);

    bf.BlendOp := AC_SRC_OVER;
    bf.BlendFlags := 0;
    bf.SourceConstantAlpha := 230;
    bf.AlphaFormat := 0;

    AlphaBlend(
      ACanvas.Handle,
      ARect.Left,
      ARect.Top,
      ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top,
      bmp.Canvas.Handle,
      0,
      0,
      ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top,
      bf
    );
  finally
    bmp.Free;
  end;
end;
有帮助吗?

解决方案

如果您检查MSDN官方文档,您将获得此声明:http://msdn.microsoft.com/en-us/library/dd183351(vs.85).aspx

如果源设备上下文标识增强的metafile设备上下文,则会发生错误(并且函数返回false)。

我的第一个猜测是,即使MSDN仅谈论源设备上下文,您的代码也永远不会与Alphablend一起使用,Alphablend旨在在两个位图之间使用。

但是,经过第二次调查,在元文件枚举tyles中有专用的temralphand记录类型。因此,它应该按预期工作。

您用什么来显示元数据?我们需要您在此处显示元数据的代码。

我的建议是将您的metafile保存到EMF文件中,然后使用Emfexplorer检查其上下文。

我们已经开发了一个名为Syngdiplus的开源单元,用于使用GDI+绘制元文件,因此在纯delphi中具有抗缩影。但是我们尚未实施TemralPhablend记录类型。如果您发现在您的应用程序中具有抗氧化绘画的有趣,我可以看一下实施它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top