だから.....タイトル通り。
私はここで解決策を見つけることができましたが。
ただし、解決策は、最初にイメージを一時ファイルに書き込み、それをストリームに読み込むことです。
だから私は解決策を修正しようとしてきました、これが私が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を作成します。
誰かが解決策を持っていますか?