2

透かしの印刷に使用される透明な TMetaFile を Canvas に描画したいと思います。

問題は、AlphaBlend 関数が TMetaFile.Handle をソースとして認識しないことです。キャンバス ハンドルが必要です。

透明度のある 32 ビット ビットマップを作成しましたが、その上に描画すると背景が白くなるため、Canvas ではアルファ ブレンドされた四角形が表示されます。透明な TMetaFile をスクリーン/プリンター Canvas にペイントするにはどうすればよいですか?

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

1 に答える 1

4

MSDNの公式ドキュメントを確認すると、次のステートメントが表示されます:http: //msdn.microsoft.com/en-us/library/dd183351 (VS.85).aspx

ソースデバイスコンテキストが拡張メタファイルデバイスコンテキストを識別する場合、エラーが発生します(そして関数はFALSEを返します)。

私の最初の推測では、MSDNがソースデバイスコンテキストについてのみ話している場合でも、コードは2つのビットマップ間で機能することを目的としたAlphaBlendでは機能しません。

ただし、2回目の調査の後、メタファイル列挙型に専用のTEMRAlphaBlendレコードタイプがあります。したがって、期待どおりに機能するはずです。

メタファイルを表示するために何を使用していますか?ここでメタファイルを表示するために使用するコードが必要になります。

私のアドバイスは、メタファイルをemfファイルに保存してから、emfexplorerを使用してそのコンテキストを検査することです。

SynGdiPlusという名前のオープンソースユニットを開発しました。GDI+を使用してメタファイルを描画するため、純粋なDelphiでアンチエイリアシングを使用します。ただし、TEMRAlphaBlendレコードタイプはまだ実装していません。アプリにアンチエイリアシング描画を含めることに興味がある場合は、それを実装することを検討できます。

于 2010-10-22T11:57:19.407 に答える