我希望我的应用程序(适用于 RGBA8888 图像)能够从 Windows 剪贴板粘贴图像。所以它应该能够从剪贴板上读取来自任何常见光栅图像应用程序(如 Gimp、Photoshop、MSPaint 等)的图像。
通过阅读剪贴板功能,看来我应该可以调用GetClipboardData(CF_DIBV5)
几乎可以访问剪贴板上的任何位图类型,因为 Windows 会自动在它与 CF_BITMAP 和 CF_DIB 之间进行转换。但是通过阅读 DIB 格式,我发现位深度、RGB 顺序、可选压缩等的可能组合有很多。看起来我正在做的事情将是一项常见的任务,但我没有在 Windows API 中看不到任何转换函数(除非我不擅长搜索),这似乎需要一周的时间来编写以支持所有可能的格式。所以我想知道我是否忽略了一些明显的事情。或者,如果我可以做出某种假设来简化这一点……例如,如果所有流行的图像应用程序碰巧以未压缩/未索引的格式将图像复制到剪贴板。
更新:这是我到目前为止所拥有的:
HGLOBAL clipboard = GetClipboardData(CF_DIBV5);
exists = clipboard != NULL;
int dataLength = GlobalSize(clipboard);
exists = dataLength != 0;
if (exists) {
LPTSTR lockedClipboard = GlobalLock(clipboard);
exists = lockedClipboard != NULL;
if (exists) {
BITMAPV5HEADER *header = (BITMAPV5HEADER*)lockedClipboard;
LONG width = header->bV5Width;
LONG height = header->bV5Height;
BYTE *bits = header + sizeof(header) + header->bV5ClrUsed * sizeof(RGBQUAD);
//Now what? Need function to convert the bits to something uncompressed.
GlobalUnlock(clipboard);
}
}
更新 2:
澄清一下,我需要字面上未压缩的 32 位图像数据 (RRGGBBAA),我可以在跨平台应用程序中进行操作,但我喜欢它。我不需要使用 Windows API 来将此图像绘制到屏幕上。
我知道一个名为的第三方库stdb_image.h
可以将 .bmps、.jpgs 和 .pngs 加载到我需要的数据类型中。因此,如果有一种方法可以将剪贴板数据转换为位图或 png 文件数据而不会丢失 alpha,那么我的状态会很好。