欢迎光临散文网 会员登陆 & 注册

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

2023-06-02 20:50 作者:-最后的雨-  | 我要投稿

如果你将资源类型设置为 "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 中。

这只是一个简单的示例,实际使用中可能需要根据具体的需求和绘图操作进行相应的调整


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

分享到微博请遵守国家法律