0

だから.....タイトル通り。

私はここで解決策を見つけることができましたが。

ただし、解決策は、最初にイメージを一時ファイルに書き込み、それをストリームに読み込むことです。

だから私は解決策を修正しようとしてきました、これが私が6時間試みてきたケースです...:

ケース1)

代わりに、以下を使用してストリームから直接読み取ります。

internal static extern int GdipSaveImageToStream(GpImage *image, IStream* stream, GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);

これは次のようになります:

[DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
internal static extern int GdipSaveImageToStream(IntPtr image, IntPtr stream, [In] ref Guid Encoder, IntPtr encoderParams);

IntPtr.Zeroをストリームパラメータに渡そうとしましたが、IntPtrへの出力結果はまだゼロです...失敗...

ケース2)

試してみましょう...投稿の1つが言ったようにピクセルデータを取得します。

GetClipboardDataを呼び出すことでHBITMAPを取得できることはわかっています。

[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);

それでは、画像のサイズがわかっていると仮定して、GetBitMapBitsを使用してみましょう。

[DllImport("gdi32.dll")]
static extern int GetBitmapBits(IntPtr hbmp, int cbBuffer, [Out] byte[] lpvBits);

少なくともデータがコピーされているのを見ることができますが、GetBitMapBitsは16ビットウィンドウ用です...失敗

ケース3)

さて、GetDIBitsを使用してピクセルデータを取得する必要があります...

[DllImport("gdi32.dll")]
public static extern int GetDIBits(IntPtr hdc, IntPtr hbmp, uint uStartScan,
                                   uint cScanLines, [Out] byte[] lpvBits, ref BitmapInfo lpbmi, uint uUsage);

しかし、今問題は....クリップボードのデバイスコンテキストを取得できる場所です......

さらに、クリップボード画像の幅と高さをどのように知ることができますか.....

WPF / WinFormでは、FromHBitmapメソッドを使用して簡単に実行できます。ファイルに書き込んで読む以外の方法は考えられません。または、この問題を解決するためにCOMを作成します。

誰かが解決策を持っていますか?

4

1 に答える 1

0

グーグル、msdn、実験の数時間後...

IntPtr.Zero。を使用して、hBitmapから実際にBitmapInfoを取得できることがわかりました。

hDC = User32.GetDC(IntPtr.Zero);
Gdi32.GetDIBits(hDC, hBitmap, 0, 1, null, ref bi, DIB_RGB_COLORS);

これにより、画像の幅と高さを含むBitmapInfoが得られます。

次に、WidthとHeightを使用して、必要なバイト配列のサイズを計算できるようになったので、次を使用できます。

//Similiarly, hMemDC is also a device context that created using IntPtr.Zero.
Gdi32.GetDIBits(hMemDC, hBitmap, 0, (uint)pixelHeight, binaryData, ref bi, DIB_RGB_COLORS);

私のbinaryDataがあり、最終的にそれらをHeight、Width、Byte[]を使用してWriteableBitmapにマップできます:)

于 2012-05-09T18:18:40.460 に答える