vs/C++資源視圖中的jpg圖片格式如何加載進(jìn)GDI中 (CREATEDC IMAGE類(lèi) GDI使用)

如果你將資源類(lèi)型設(shè)置為 "IMAGE",并且將圖片的資源 ID 設(shè)置為 "IMAGE01",以下是相應(yīng)的代碼修改示例:
HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_IMAGE01), L"IMAGE");
FindResource
函數(shù)用于查找指定資源的句柄。NULL
表示在當(dāng)前可執(zhí)行文件中搜索資源。MAKEINTRESOURCE(IDR_IMAGE01)
將資源 ID 轉(zhuǎn)換為字符串類(lèi)型,用于指定要查找的資源。"IMAGE"
是資源類(lèi)型,與你在資源視圖中設(shè)置的類(lèi)型相匹配。hResource
是找到的資源的句柄。
HGLOBAL hGlobal = LoadResource(NULL, hResource);
LoadResource
函數(shù)用于加載指定資源的內(nèi)容。NULL
表示在當(dāng)前可執(zhí)行文件中加載資源。hResource
是資源的句柄。hGlobal
是加載的資源的全局內(nèi)存句柄。
LPVOID pResourceData = LockResource(hGlobal);
LockResource
函數(shù)用于鎖定資源的全局內(nèi)存句柄,并返回資源數(shù)據(jù)的指針。hGlobal
是資源的全局內(nèi)存句柄。pResourceData
是指向資源數(shù)據(jù)的指針。
DWORD imageSize = SizeofResource(NULL, hResource);
SizeofResource
函數(shù)用于獲取資源的大?。ㄒ宰止?jié)為單位)。NULL
表示在當(dāng)前可執(zhí)行文件中計(jì)算資源大小。hResource
是資源的句柄。imageSize
是資源的大小。
HGLOBAL hMemory = GlobalAlloc(GMEM_MOVEABLE, imageSize);
LPVOID pMemoryData = GlobalLock(hMemory);
CopyMemory(pMemoryData, pResourceData, imageSize);
GlobalAlloc
函數(shù)用于分配全局內(nèi)存塊。GMEM_MOVEABLE
標(biāo)志表示分配的內(nèi)存塊可移動(dòng)。hMemory
是分配的全局內(nèi)存句柄。GlobalLock
函數(shù)用于鎖定全局內(nèi)存句柄,并返回內(nèi)存塊的指針。pMemoryData
是指向鎖定的內(nèi)存塊的指針。CopyMemory
函數(shù)用于將資源數(shù)據(jù)從pResourceData
復(fù)制到pMemoryData
中,以便后續(xù)使用。
IStream* pStream = NULL;
CreateStreamOnHGlobal(hMemory, TRUE, &pStream);
CreateStreamOnHGlobal
函數(shù)用于創(chuàng)建基于內(nèi)存塊的流。hMemory
是全局內(nèi)存句柄。TRUE
表示釋放內(nèi)存時(shí)同時(shí)釋放內(nèi)存塊。pStream
是創(chuàng)建的流對(duì)象的指針。
Image* pImage = Image::FromStream(pStream);
Image::FromStream
是 GDI+ 圖像類(lèi)的靜態(tài)成員函數(shù),用于從流中加載圖像。pStream
是包含圖像數(shù)據(jù)的流對(duì)象。pImage
是加載的圖像
GlobalUnlock(hMemory);
pStream->Release();
流對(duì)象是一種抽象概念,它表示數(shù)據(jù)的序列或數(shù)據(jù)流。在編程中,流對(duì)象用于以一種統(tǒng)一的方式處理輸入和輸出。
流對(duì)象可以與各種數(shù)據(jù)源和目標(biāo)進(jìn)行交互,例如文件、內(nèi)存、網(wǎng)絡(luò)連接等。它們提供了一組通用的方法和操作,使得讀取和寫(xiě)入數(shù)據(jù)變得簡(jiǎn)單和一致。
流對(duì)象通常用于以下操作:
從數(shù)據(jù)源讀取數(shù)據(jù),如讀取文件內(nèi)容或從網(wǎng)絡(luò)連接接收數(shù)據(jù)。
將數(shù)據(jù)寫(xiě)入目標(biāo),如將數(shù)據(jù)寫(xiě)入文件或?qū)?shù)據(jù)發(fā)送到網(wǎng)絡(luò)連接。
進(jìn)行數(shù)據(jù)操作和轉(zhuǎn)換,如復(fù)制、壓縮、加密等。
在代碼示例中,通過(guò)使用 CreateStreamOnHGlobal
函數(shù),創(chuàng)建了一個(gè)基于內(nèi)存塊的流對(duì)象 (IStream* pStream
)。這個(gè)流對(duì)象可以用于加載圖像數(shù)據(jù),并提供了一組方法來(lái)訪問(wèn)和操作圖像數(shù)據(jù)。
使用流對(duì)象的好處是,它提供了一種抽象層,使得無(wú)論數(shù)據(jù)源是文件、內(nèi)存還是其他類(lèi)型的資源,我們都可以使用相同的方式讀取和處理數(shù)據(jù)。這種統(tǒng)一的接口簡(jiǎn)化了數(shù)據(jù)處理的操作,并提供了更高的靈活性和可移植性。
CreateStreamOnHGlobal(hMemory, TRUE, &pStream)
的作用是將內(nèi)存中的圖像數(shù)據(jù)存儲(chǔ)到流對(duì)象中。
CreateStreamOnHGlobal
函數(shù)用于創(chuàng)建一個(gè)基于內(nèi)存塊的流對(duì)象,并將內(nèi)存塊中的數(shù)據(jù)與該流對(duì)象關(guān)聯(lián)起來(lái)。參數(shù) hMemory
是全局內(nèi)存塊的句柄,它包含了圖像數(shù)據(jù)。參數(shù) TRUE
表示在釋放流對(duì)象時(shí)同時(shí)釋放內(nèi)存塊。
通過(guò)調(diào)用 CreateStreamOnHGlobal
函數(shù)并傳遞內(nèi)存塊的句柄,以及用于存儲(chǔ)流對(duì)象地址的指針 &pStream
,函數(shù)將創(chuàng)建一個(gè)與內(nèi)存塊關(guān)聯(lián)的流對(duì)象,并將該流對(duì)象的地址存儲(chǔ)在 pStream
指向的位置。
這樣一來(lái),我們就可以通過(guò) pStream
這個(gè)流對(duì)象來(lái)訪問(wèn)和操作內(nèi)存中的圖像數(shù)據(jù),比如加載圖像、讀取圖像信息等。
如果你已經(jīng)成功地將圖片資源加載到內(nèi)存中,并創(chuàng)建了一個(gè) Image 對(duì)象(例如 pImage),接下來(lái)你可以在 GDI 中使用該圖片進(jìn)行繪制。下面是一個(gè)簡(jiǎn)單的示例,展示如何在 GDI 中使用圖片對(duì)象進(jìn)行繪制:
HDC hdc; // 設(shè)備上下文句柄
// 在窗口的繪圖過(guò)程中使用 hdc
// 獲取圖片的寬度和高度
int imageWidth = pImage->GetWidth();
int imageHeight = pImage->GetHeight();
// 創(chuàng)建兼容的內(nèi)存設(shè)備上下文
HDC memDC = CreateCompatibleDC(hdc);
// 創(chuàng)建位圖句柄
HBITMAP hBitmap = NULL;
BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = imageWidth;
bmi.bmiHeader.biHeight = -imageHeight; // 負(fù)值表示頂部向下的位圖
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32; // 假設(shè)圖片為32位顏色
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
BYTE* pBits = NULL;
hBitmap = CreateDIBSection(memDC, &bmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0);
if (hBitmap)
{
? ? // 將位圖選入內(nèi)存設(shè)備上下文
? ? HBITMAP oldBitmap = (HBITMAP)SelectObject(memDC, hBitmap);
? ? // 繪制圖片到位圖
? ? Graphics graphics(memDC);
? ? graphics.DrawImage(pImage, 0, 0, imageWidth, imageHeight);
? ? // 在窗口上繪制位圖
? ? BitBlt(hdc, 0, 0, imageWidth, imageHeight, memDC, 0, 0, SRCCOPY);
? ? // 恢復(fù)內(nèi)存設(shè)備上下文的原始位圖
? ? SelectObject(memDC, oldBitmap);
}
// 釋放位圖資源
if (hBitmap)
? ? DeleteObject(hBitmap);
// 釋放內(nèi)存設(shè)備上下文
DeleteDC(memDC);
在上述示例中,首先獲取了圖片的寬度和高度,然后創(chuàng)建了一個(gè)兼容的內(nèi)存設(shè)備上下文 memDC
。接著,創(chuàng)建了一個(gè)位圖句柄 hBitmap
,用于繪制圖片。使用 GDI+ 的 Graphics
對(duì)象將圖片繪制到位圖中。最后,使用 BitBlt
函數(shù)將位圖從內(nèi)存設(shè)備上下文繪制到窗口的設(shè)備上下文 hdc
中。
這只是一個(gè)簡(jiǎn)單的示例,實(shí)際使用中可能需要根據(jù)具體的需求和繪圖操作進(jìn)行相應(yīng)的調(diào)整。