我周围中搜索使用谷歌为位图,但我对如何从资源加载的图像(PNG在我的情况)完全糊涂了,然后在内存中转换为位图用于我的启动画面。我已经阅读了关于GDI +和libpng的内容,但我并不知道如何去做我想做的事情。谁能帮忙?加载从资源的图像和转换内存
0
A
回答
0
我最终使用PicoPNG到PNG转换为我然后手动从一个池莉构建位图的二维矢量。我的最终代码看起来像这样:
HBITMAP LoadPNGasBMP(const HMODULE hModule, const LPCTSTR lpPNGName)
{
/* First we need to get an pointer to the PNG */
HRSRC found = FindResource(hModule, lpPNGName, "PNG");
unsigned int size = SizeofResource(hModule, found);
HGLOBAL loaded = LoadResource(hModule, found);
void* resource_data = LockResource(loaded);
/* Now we decode the PNG */
vector<unsigned char> raw;
unsigned long width, height;
int err = decodePNG(raw, width, height, (const unsigned char*)resource_data, size);
if (err != 0)
{
log_debug("Error while decoding png splash: %d", err);
return NULL;
}
/* Create the bitmap */
BITMAPV5HEADER bmpheader = {0};
bmpheader.bV5Size = sizeof(BITMAPV5HEADER);
bmpheader.bV5Width = width;
bmpheader.bV5Height = height;
bmpheader.bV5Planes = 1;
bmpheader.bV5BitCount = 32;
bmpheader.bV5Compression = BI_BITFIELDS;
bmpheader.bV5SizeImage = width*height*4;
bmpheader.bV5RedMask = 0x00FF0000;
bmpheader.bV5GreenMask = 0x0000FF00;
bmpheader.bV5BlueMask = 0x000000FF;
bmpheader.bV5AlphaMask = 0xFF000000;
bmpheader.bV5CSType = LCS_WINDOWS_COLOR_SPACE;
bmpheader.bV5Intent = LCS_GM_BUSINESS;
void* converted = NULL;
HDC screen = GetDC(NULL);
HBITMAP result = CreateDIBSection(screen, reinterpret_cast<BITMAPINFO*>(&bmpheader), DIB_RGB_COLORS, &converted, NULL, 0);
ReleaseDC(NULL, screen);
/* Copy the decoded image into the bitmap in the correct order */
for (unsigned int y1 = height - 1, y2 = 0; y2 < height; y1--, y2++)
for (unsigned int x = 0; x < width; x++)
{
*((char*)converted+0+4*x+4*width*y2) = raw[2+4*x+4*width*y1]; // Blue
*((char*)converted+1+4*x+4*width*y2) = raw[1+4*x+4*width*y1]; // Green
*((char*)converted+2+4*x+4*width*y2) = raw[0+4*x+4*width*y1]; // Red
*((char*)converted+3+4*x+4*width*y2) = raw[3+4*x+4*width*y1]; // Alpha
}
/* Done! */
return result;
}
1
编辑:GDI+ documentation提供了一些关于如何在DLL中使用GDI +的建议。就你而言,最好的解决方案可能是定义客户端代码需要调用的初始化和拆卸函数。
+0
好吧。看起来我无法使用GDI +来处理我正在做的事情,因为这些都是在DllMain中完成的,而且它们所调用的函数都完成了。你有什么其他的建议? – 2010-10-26 09:43:08
+0
如果我可以编辑调用dll的程序,我会这样做(我读过它),但是我不能。所以我真的不认为我可以使用GDI +。我目前正在研究使用WIC将我的PNG转换为HBITMAP – 2010-10-26 11:06:18
相关问题
- 1. C#:FileNotFoundException当从资源加载图像
- 2. 从嵌入式资源加载图像
- 3. 排球图像 - 从资源加载
- 4. Android资源:如何从资源中加载位图来处理内存?
- 5. 从nl.siegmann.epublib获取资源的位图资源加载资源
- 6. 的WebView:从资源(或资产)加载图像
- 7. 从资源加载图像到图像控制
- 8. android,drawable资源加载到内存?
- 9. SKTexture:错误加载图像资源
- 10. 在ViewAdapter上加载图像资源
- 11. 加载图像和转换图像的像素颜色
- 12. 从内存中加载Picturebox图像?
- 13. Android,图像加载和内存分配
- 14. 从资源中挑选图像并加载到网络视图
- 15. NullExceptionError当试图从资源加载图像
- 16. 从加载的程序集访问图像资源
- 17. SkImageDecoder工厂在加载从资源的图像返回null
- 18. 如何从vb 2010中的资源文件加载图像expresss?
- 19. 无法从spring maven项目中的资源加载图像
- 20. 如何从Java资源加载图标?
- 21. 无法从资源加载位图
- 22. 从firebase和缓存加载图像swift3
- 23. 加载位图有效地从内部存储,而不是资源的
- 24. 从资源加载文件
- 25. 如何加载从资源
- 26. 从资源窗口加载图像不工作
- 27. 使用Glide库从应用程序资源中加载图像
- 28. 从外部资源加载图像时执行jQuery代码
- 29. 如何使用asyncTask从资源加载图像
- 30. QWebView能否从Qt资源文件加载图像?
如果您可以使用JPEG代替,那么OleLoadPicture和朋友应该做的伎俩。 – 2010-10-25 06:54:11
但我不认为有没有办法来存储JPEG文件没有它压缩...而我需要保持阿尔法通道 – 2010-10-25 06:56:13