2009-07-29 11 views

答えて

1

HOW TO USE IMAGESOURCE (NO HANDLER) IN WINFORMS AS SYSTEM.DRAWING.BITMAP (HBITMAP)を参照してください。

簡単にあなたがこの 記事から学んだWPF ImageSourceはにリサイズ System.Drawing.Bitmapを変換する方法。今日、私はどのように行うか説明します それは逆です。実際には、 に彼が持っているすべてのですが、 たBitmapSourceからハンドラを抽出することである、しかし、このようなアプローチ は、サポートされていないので、私たちにできる唯一のこと は たBitmapSource(またはBitmapFrame)のピクセルを単にコピーされ バイト配列にして、それらをHBitmapの ポインタにコピーします。

+0

これと前回の記事はどちらも同じアプローチです:バイト配列にビットマップのスキャンラインをコピーして、メモリブロックからビットマップを作成します。ビットマップは、ビットマップ・ライフタイム中にメモリ・ブロックに走査線が含まれていることを前提としています。ただし、固定(バイト* pB =ビット)コードを残した後、.netメモリマネージャによってメモリが上書きされ、ビットマップが破損することがあります。解決策は、Marshal.AllocHGlobalを使用することですが、この場合、メモリブロックはユーザーコードによってメンテナンスする必要があります(Marshal.FreeHGlobalによって使用後に解放する必要があります)。 –

9

これまでのOPでも、dll interopやクリップボードのハッキングがなくても、よりクリーンなソリューションを見つけるには時間がかかりました。

これは私のために働いた、あなたはファイルに保存する前に画像のサイズを削減するためにpngencoderを使用することができますまたはRTFストリーム

private System.Drawing.Image ImageWpfToGDI(System.Windows.Media.ImageSource image) { 
    MemoryStream ms = new MemoryStream(); 
    var encoder = new System.Windows.Media.Imaging.BmpBitmapEncoder(); 
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(image as System.Windows.Media.Imaging.BitmapSource)); 
    encoder.Save(ms); 
    ms.Flush();  
    return System.Drawing.Image.FromStream(ms); 
} 
+0

アルファチャンネル(透過部分を含む)で画像を変換する必要がある場合は、System.Windows.Media.Imaging.BmpBitmapEncoder()の代わりにSystem.Windows.Media.Imaging.PngBitmapEncoder()を使用してください。 –

+0

@DariuszWasacz私はこの答えを得ることができません。それはimage.Sourceが動作しないと文句を言う:** 'System.Drawing.Image'は 'Source'の定義を含んでおらず、 'System.Drawing.Image'タイプの最初の引数を受け入れる拡張メソッド 'Source'見つかった** 私はMSDNをチェックし、ImageはSourceプロパティを持っていません。何を修正する必要があるか考えていますか? –

+1

@kayleeFrye_onDeck:System.DrawingとSystem.Windows.Mediaの両方の名前空間にクラス 'Image'が含まれています。引数 'System.Windows.Media.Image image'のネームスペースを省略したように見え、 'System.Drawing.Image'はステートメントを使用したものです。あなたのコードが上記とまったく同じかどうか確認してください。 –

関連する問題