デルファイのtcanvasで透明なtmetafileを描いています
-
10-10-2019 - |
質問
印刷透かしに使用されるキャンバスに透明なTメタフィルを描きたいと思います。
問題は、Alphablend関数がCanvasハンドルを期待するようにソースとしてtmetafile.handleを認識しないことです。
透明性を備えた32ビットビットマップを作成しましたが、それに描画すると、白い背景が強制され、キャンバスにアルファブレンドの長方形が見えます。画面/プリンターキャンバスで透明なTメタフィルをペイントするにはどうすればよいですか?
Tmetafileは確かに透明です。私は、標準以外の背景色のIEを使用してシンプルなWebページでテストしました。ソースコード:
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
ソースデバイスコンテキストが強化されたメタファイルデバイスコンテキストを識別すると、エラーが発生します(および関数はfalseを返します)。
私の最初の推測では、MSDNがソースデバイスのコンテキストについてのみ話している場合でも、コードは2つのビットマップ間で動作することを目的としたAlphaBlendで動作することはありません。
しかし、2回目の調査の後、Metaファイルの列挙タイレスには専用のTemralphablendレコードタイプがあります。したがって、それは期待どおりに機能するはずです。
メタファイルを表示するために何を使用していますか?ここでメタファイルを表示するために使用するコードが必要です。
私のアドバイスは、メタファイルをEMFファイルに保存してから、EMFEXPLORERを使用してコンテキストを検査することです。
Syngdiplusという名前のオープンソースユニットを開発しました。これは、GDI+を使用してメタファイルを描画し、したがって純粋なDelphiでアンチエイリアスを使用しました。しかし、Temralphablendレコードタイプはまだ実装していません。あなたのアプリにアンチエイリアスの描画を持っていることが面白いと思うなら、私はそれを実装することを調べることができます。