如何访问 win32 缩略图的图像数据
How to access image data of a win32 thumbnail
我正在尝试访问 win32 缩略图的图像数据,以使用以下步骤将其与另一个库一起使用:
- 从窗口缩略图缓存中获取缩略图(I哈雷德位图)
- 获取缩略图的 HBITMAP
- 使用 GetDIBits 获取像素数据
缩略图检索基于 https://stackoverflow.com/a/19529633/3165122
像素数据检索基于 https://stackoverflow.com/a/3688682/3165122
这是我到目前为止得到的:
// error checks omitted
LPCTSTR path = TEXT("<path-to-jpg-image>");
HRESULT hr = CoInitialize(nullptr);
// Get the thumbnail
IShellItem* item = nullptr;
hr = SHCreateItemFromParsingName(path, nullptr, IID_PPV_ARGS(&item));
IThumbnailCache* cache = nullptr;
hr = CoCreateInstance(
CLSID_LocalThumbnailCache,
nullptr,
CLSCTX_INPROC,
IID_PPV_ARGS(&cache));
ISharedBitmap* shared_bitmap;
hr = cache->GetThumbnail(
item,
1024,
WTS_EXTRACT,
&shared_bitmap,
nullptr,
nullptr);
// Retrieve thumbnail HBITMAP
HBITMAP hbitmap = NULL;
hr = shared_bitmap->GetSharedBitmap(&hbitmap);
HDC dc = GetDC(NULL);
HDC dc_mem = CreateCompatibleDC(dc);
// Get required buffer size
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(dc_mem, hbitmap, 0, 0, nullptr, &bmi, DIB_RGB_COLORS); // <- this fails
WTS_ALPHATYPE alpha_type;
hr = shared_bitmap->GetFormat(&alpha_type);
bmi.bmiHeader.biBitCount = alpha_type == WTSAT_RGB ? 24 : 32;
bmi.bmiHeader.biHeight = std::abs(bmi.bmiHeader.biHeight);
bmi.bmiHeader.biCompression = BI_RGB;
// Get image data
std::vector<char> buffer(bmi.bmiHeader.biSizeImage);
GetDIBits(dc_mem, hbitmap, 0, bmi.bmiHeader.biHeight,
&buffer[0], &bmi, DIB_RGB_COLORS);
// use buffer...
第一次调用 GetDIBits 以检索所需的缓冲区大小失败,返回值为 0。我猜我使用的是不兼容的 DC?如何获得兼容的 DC?
https://stackoverflow.com/a/14207674/3165122 指出"[...]如果你不知道你的HBITMAP指向什么,你就不能指望用它做任何有用的事情。
真的没有办法吗?我做错了什么吗?有没有不同的方法?
根据GetDIBits文档:"如果 lpvBits 为 NULL,并且 BITMAPINFO 的位计数成员初始化为零,则 GetDIBits 将填充 BITMAPINFOHEADER 结构 [...]"
在我的例子中,位计数成员没有初始化为零。在声明后立即调用ZeroMemory(&bmi, sizeof(BITMAPINFO))
修复了它。为我辩护:BITMAPINFO 是一个输出参数;)
非常感谢斯图尔特!
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 重新定位图像时如何前进到下一个内存块
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 为什么 BMP 图像上的 imwrite 会卡住/不返回?
- QT将图像从缩略图拖放到网格布局(QVTKOpenGLWidget)?
- 在 Qt 中显示多个图像缩略图
- 滚动条缩略图跟踪长度 基于图像的水平适合调整窗口大小时出现问题
- 如何访问 win32 缩略图的图像数据