我周圍中搜索使用谷歌爲位圖,但我對如何從資源加載的圖像(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. 圖像資源內存
- 2. Android:OutOfMemoryError加載圖像資源
- 3. 如何從資源加載圖像
- 4. 排球圖像 - 從資源加載
- 5. 從嵌入式資源加載圖像
- 6. C#:FileNotFoundException當從資源加載圖像
- 7. 從內存加載圖像
- 8. 從C#中的資源動態添加和加載圖像
- 9. 從資源加載位圖
- 10. Android資源:如何從資源中加載位圖來處理內存?
- 11. 從nl.siegmann.epublib獲取資源的位圖資源加載資源
- 12. 使用Glide for Android,我如何從資源和資源加載圖像
- 13. 的WebView:從資源(或資產)加載圖像
- 14. 從資源加載圖像到圖像控制
- 15. 從Kivy的內存中加載圖像
- 16. android,drawable資源加載到內存?
- 17. 圖像資源內存不足
- 18. 在ViewAdapter上加載圖像資源
- 19. SKTexture:錯誤加載圖像資源
- 20. Wikitude圖像資源加載錯誤
- 21. 圖像資源的存在
- 22. 加載圖像和轉換圖像的像素顏色
- 23. 從單罐內加載靜態資源
- 24. 從內存中加載Picturebox圖像?
- 25. Gdk pixbuf從內存加載圖像
- 26. 如何從內存中保存webkit頁面圖像資源?
- 27. 圖像預加載和內存問題
- 28. Android,圖像加載和內存分配
- 29. NullExceptionError當試圖從資源加載圖像
- 30. 從資源中挑選圖像並加載到網絡視圖
如果您可以使用JPEG代替,那麼OleLoadPicture和朋友應該做的伎倆。 – 2010-10-25 06:54:11
但我不認爲有沒有辦法來存儲JPEG文件沒有它壓縮...而我需要保持阿爾法通道 – 2010-10-25 06:56:13