c语言 解析jpg文件,把jpg文件读取到内存char* 再转换成CImage

这篇博客介绍了如何使用C语言将JPEG文件读取到内存的char*,然后转换成CImage对象。提供的代码示例展示了如何通过内存数据创建IStream,并加载到CImage中进行绘制。
摘要由CSDN通过智能技术生成

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

当然转成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(,));

//清理

img.Destroy();

pStream->Release();

GlobalFree(hMem);

}

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

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

http://bbs.csdn.net/topics/390973788

IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现

package cn.zhang.i

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在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、付费专栏及课程。

余额充值