所以......如标题。
虽然我能够在这里找到解决方案。
但解决方案是首先将图像写入临时文件并将其读入流中。
所以我一直在尝试修改解决方案,这是我尝试了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)
让我们试试......像其中一篇文章所说的那样获取像素数据。
我知道我可以通过调用 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来解决这个问题......
有人有解决方案吗?