把jpg文件读取到内存char* 再转换成CImage

本文介绍了一种将内存中的图像数据转换为CImage对象并绘制到设备上下文的方法。通过使用GlobalAlloc和CreateStreamOnHGlobal等API,可以实现从内存缓冲区加载图像并显示的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络上找到大神写的转换方法,不过就记下来,学习学习;

当然转成CImage之后就可以从CImage转换成HBITMAP 了

void DrawPic(CDC *pDC,char *buf,int len)
{
    //内存数据转换成流
    HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len);
    BYTE* pMem=(BYTE*)GlobalLock(hMem);
    memcpy(pMem,buf,len);
    IStream* pStream;
    HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);

    //画图
    CImage img;
    img.Load(pStream);
    img.Draw(pDC->GetSafeHdc(),CPoint(0,0));

    //清理
    img.Destroy();
    pStream->Release();
    GlobalFree(hMem);
}

 

帖子里同样也有了个疑问就是 GlobaLock 之后没有 unlock 大神给出的解释是:“这里用的固定块,GMEM_FIXED,没必要unlock”

----------------------------------------------------------------------------------

http://bbs.youkuaiyun.com/topics/390973788

在MFC中,可以使用`GetDIBits`函数将`HDC`中的数据换为`unsigned char*`类型。 以下是一个示例代码: ```cpp #include <afxwin.h> #include <atlimage.h> unsigned char* HDCtoUnsignedChar(HDC hdc, int width, int height) { CImage image; image.Create(width, height, 24); // 创建一个24位的图像对象 HDC hDCMem = CreateCompatibleDC(hdc); HBITMAP hBitmap = CreateCompatibleBitmap(hdc, width, height); SelectObject(hDCMem, hBitmap); // 将HDC中的数据绘制到内存DC中 BitBlt(hDCMem, 0, 0, width, height, hdc, 0, 0, SRCCOPY); // 将内存DC的数据复制到CImage对象中 image.Attach(hBitmap); // 创建一个unsigned char数组,用于保存图像数据 unsigned char* data = new unsigned char[width * height * 3]; // 使用GetDIBits函数将图像数据从CImage对象中提取到unsigned char数组中 BITMAPINFO bmpInfo = { 0 }; bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = width; bmpInfo.bmiHeader.biHeight = -height; // 负数表示从顶部到底部扫描 bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 24; bmpInfo.bmiHeader.biCompression = BI_RGB; GetDIBits(hDCMem, (HBITMAP)image.GetSafeHandle(), 0, height, data, &bmpInfo, DIB_RGB_COLORS); // 释放内存 DeleteDC(hDCMem); DeleteObject(hBitmap); return data; } ``` 在上述示例代码中,我们定义了一个名为`HDCtoUnsignedChar`的函数,该函数接受`HDC`、图像的宽度和高度作为参数。函数内部创建了一个24位的`CImage`对象,并使用`BitBlt`函数将`HDC`中的数据绘制到内存DC中。然后,我们使用`GetDIBits`函数将内存DC的数据提取到`unsigned char*`数组中。最后,我们释放了相关的内存资源,并返回该数组。 要使用上述代码,你可以将`HDC`和图像的宽度、高度传递给`HDCtoUnsignedChar`函数,如下所示: ```cpp HDC hdc; // 假设你有一个名为hdc的HDC对象 int width = 640; // 假设图像的宽度为640像素 int height = 480; // 假设图像的高度为480像素 unsigned char* imageData = HDCtoUnsignedChar(hdc, width, height); ``` 请注意,返回的`unsigned char*`数组是动态分配的内存,使用完毕后需要记得释放内存,以避免内存泄漏。可以使用`delete[]`运算符来释放内存: ```cpp delete[] imageData; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值