vs/C++资源视图中的jpg图片格式如何加载进GDI中 (CREATEDC IMAGE类 GDI使用)

如果你将资源类型设置为 "IMAGE",并且将图片的资源 ID 设置为 "IMAGE01",以下是相应的代码修改示例:
HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_IMAGE01), L"IMAGE");
FindResource
函数用于查找指定资源的句柄。NULL
表示在当前可执行文件中搜索资源。MAKEINTRESOURCE(IDR_IMAGE01)
将资源 ID 转换为字符串类型,用于指定要查找的资源。"IMAGE"
是资源类型,与你在资源视图中设置的类型相匹配。hResource
是找到的资源的句柄。
HGLOBAL hGlobal = LoadResource(NULL, hResource);
LoadResource
函数用于加载指定资源的内容。NULL
表示在当前可执行文件中加载资源。hResource
是资源的句柄。hGlobal
是加载的资源的全局内存句柄。
LPVOID pResourceData = LockResource(hGlobal);
LockResource
函数用于锁定资源的全局内存句柄,并返回资源数据的指针。hGlobal
是资源的全局内存句柄。pResourceData
是指向资源数据的指针。
DWORD imageSize = SizeofResource(NULL, hResource);
SizeofResource
函数用于获取资源的大小(以字节为单位)。NULL
表示在当前可执行文件中计算资源大小。hResource
是资源的句柄。imageSize
是资源的大小。
HGLOBAL hMemory = GlobalAlloc(GMEM_MOVEABLE, imageSize);
LPVOID pMemoryData = GlobalLock(hMemory);
CopyMemory(pMemoryData, pResourceData, imageSize);
GlobalAlloc
函数用于分配全局内存块。GMEM_MOVEABLE
标志表示分配的内存块可移动。hMemory
是分配的全局内存句柄。GlobalLock
函数用于锁定全局内存句柄,并返回内存块的指针。pMemoryData
是指向锁定的内存块的指针。CopyMemory
函数用于将资源数据从pResourceData
复制到pMemoryData
中,以便后续使用。
IStream* pStream = NULL;
CreateStreamOnHGlobal(hMemory, TRUE, &pStream);
CreateStreamOnHGlobal
函数用于创建基于内存块的流。hMemory
是全局内存句柄。TRUE
表示释放内存时同时释放内存块。pStream
是创建的流对象的指针。
Image* pImage = Image::FromStream(pStream);
Image::FromStream
是 GDI+ 图像类的静态成员函数,用于从流中加载图像。pStream
是包含图像数据的流对象。pImage
是加载的图像
GlobalUnlock(hMemory);
pStream->Release();
流对象是一种抽象概念,它表示数据的序列或数据流。在编程中,流对象用于以一种统一的方式处理输入和输出。
流对象可以与各种数据源和目标进行交互,例如文件、内存、网络连接等。它们提供了一组通用的方法和操作,使得读取和写入数据变得简单和一致。
流对象通常用于以下操作:
从数据源读取数据,如读取文件内容或从网络连接接收数据。
将数据写入目标,如将数据写入文件或将数据发送到网络连接。
进行数据操作和转换,如复制、压缩、加密等。
在代码示例中,通过使用 CreateStreamOnHGlobal
函数,创建了一个基于内存块的流对象 (IStream* pStream
)。这个流对象可以用于加载图像数据,并提供了一组方法来访问和操作图像数据。
使用流对象的好处是,它提供了一种抽象层,使得无论数据源是文件、内存还是其他类型的资源,我们都可以使用相同的方式读取和处理数据。这种统一的接口简化了数据处理的操作,并提供了更高的灵活性和可移植性。
CreateStreamOnHGlobal(hMemory, TRUE, &pStream)
的作用是将内存中的图像数据存储到流对象中。
CreateStreamOnHGlobal
函数用于创建一个基于内存块的流对象,并将内存块中的数据与该流对象关联起来。参数 hMemory
是全局内存块的句柄,它包含了图像数据。参数 TRUE
表示在释放流对象时同时释放内存块。
通过调用 CreateStreamOnHGlobal
函数并传递内存块的句柄,以及用于存储流对象地址的指针 &pStream
,函数将创建一个与内存块关联的流对象,并将该流对象的地址存储在 pStream
指向的位置。
这样一来,我们就可以通过 pStream
这个流对象来访问和操作内存中的图像数据,比如加载图像、读取图像信息等。
如果你已经成功地将图片资源加载到内存中,并创建了一个 Image 对象(例如 pImage),接下来你可以在 GDI 中使用该图片进行绘制。下面是一个简单的示例,展示如何在 GDI 中使用图片对象进行绘制:
HDC hdc; // 设备上下文句柄
// 在窗口的绘图过程中使用 hdc
// 获取图片的宽度和高度
int imageWidth = pImage->GetWidth();
int imageHeight = pImage->GetHeight();
// 创建兼容的内存设备上下文
HDC memDC = CreateCompatibleDC(hdc);
// 创建位图句柄
HBITMAP hBitmap = NULL;
BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = imageWidth;
bmi.bmiHeader.biHeight = -imageHeight; // 负值表示顶部向下的位图
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32; // 假设图片为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)
{
// 将位图选入内存设备上下文
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);
// 恢复内存设备上下文的原始位图
SelectObject(memDC, oldBitmap);
}
// 释放位图资源
if (hBitmap)
DeleteObject(hBitmap);
// 释放内存设备上下文
DeleteDC(memDC);
在上述示例中,首先获取了图片的宽度和高度,然后创建了一个兼容的内存设备上下文 memDC
。接着,创建了一个位图句柄 hBitmap
,用于绘制图片。使用 GDI+ 的 Graphics
对象将图片绘制到位图中。最后,使用 BitBlt
函数将位图从内存设备上下文绘制到窗口的设备上下文 hdc
中。
这只是一个简单的示例,实际使用中可能需要根据具体的需求和绘图操作进行相应的调整。