2011-12-31 12 views
3

私は半透明のテスト画像を作成しました.128-alpha黒で塗りつぶしました。 WPFネイティブとGDI interopの2つの方法の間で交互に描画します。彼らはまったく違う。 WPFの1が正しく行われますが、GDIの描画される前に、白い最初に対してブレンドしていると思われます。WPF/GDI interop:正しいアルファを取得するにはどうすればよいですか?

example 1

写真に対して描かれている場合、GDIの一部はいても、その下に何を明るく

example 2

コードはこのように書き:

if (iteration % 2 == 0) 
    context.DrawImage(new BitmapImage(new System.Uri("I:/test.png")), 
         new Rect(0, 0, 80, 24)); 
else 
{ 
    var bmp = (D.Bitmap) D.Bitmap.FromFile("I:/test.png"); 
    var handle = bmp.GetHbitmap(); 
    var bmpSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, 
        Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
    context.DrawImage(bmpSource, new Rect(0, 0, 80, 24)); 
    WinAPI.DeleteObject(handle); 
    GC.KeepAlive(bmp); 
} 
,0,0,128色はその下にあるものは何でも暗くなければなりません

2番目の画像では、WPFのRectサイズが重複していないことを示すように変更しました。

半透明のGDIイメージを正しく描画するにはどうすればよいですか?

(はい、それは本当に複雑な理由のためにGDIのイメージである必要があります - 現実にはそれはファイルから、いくつかの外部コードから付属していませんが、問題は、ファイルを簡単に再生可能です)

答えて

1

私は今この呼び出しを回避し、生のビットマップデータをコピーするだけで解決しました。コード:

var writable = new WriteableBitmap(bmp.Width, bmp.Height, 
         bmp.HorizontalResolution, bmp.VerticalResolution, 
         PixelFormats.Bgra32, null); 

var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), 
         ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 

writable.WritePixels(new Int32Rect(0, 0, bmp.Width, bmp.Height), 
         data.Scan0, data.Stride * bmp.Height, data.Stride); 

GC.KeepAlive(bmp); 
context.DrawImage(writable, new Rect(0, 0, 80, 24)); 

(これはusingまたは2を必要とする場合があります)

書き込み可能なビットマップがImageのようなもののためのソースとして直接使用された場合も、その後、Freezeへの呼び出しは、更新時にちらつきを防止するのに役立ちます私はなぜそれが必要であるかわかりませんが。

0

半透明のGDIイメージを正しく描画するにはどうすればよいですか?このよう

:つまり

Bitmap targetBitmap = ... 
Bitmap bitmap = new Bitmap(filename); 
using (var g = Graphics.FromImage(targetBitmap)) 
    g.DrawImage(...); 

、GDIツーWPF相互運用性を気にしない(それが働いて明確ではありません)。中間のビットマップをファイルに保存し、WPFとGDIのみが必要な場合はGDIが必要なときにWPFのみを使用します。

+0

少なくとも、私は中間フォーマットとしてJPEGを使用することを提案していません...信じているかどうかは信じていますが、正確にそれを示唆する検索ヒットが数多くあります! –

関連する問題