GDI 总结三: CImage类使用

喜欢古典文学的可以关注           头条号:古典小说            微信公众号:古典小说网

如果想关注计算机编程等方面的 ,可以关注头条号: 讨厌编程

前言

         CImage类是基于GDI+的,但是这里为什么要讲归于GDI?

         主要是基于这样的考虑: 在GDI+环境中,我们可以直接使用GDI+ ,没多少必要再使用CImage类

                                                       但是,如果再GDI环境中,我们要想使用GDI+,有点麻烦,还得加入头文件,加入启动GDI+的代码和关闭GDI+的代码,显得太罗嗦了,GDI  的CBitmap 处理功能又有局限,只能处理BMP格式的图片。 怎么办?这时,我们便可使用CImage类,因为这个类本身封装了GDI+得使用环境,所以无需我们手动设置,简化了我们的操作。  同时,又可以利用GDI+中强大的图片处理功能,及可以简便的与CBitmap对象进行转换 ,大大方便了在GDI环境下,进行各种图片处理工作 。

                                                        其实,将其称作 GDI/ GDI+ 混合编程,这样才更确切些。

        

    

 

为什么引入CImage类?

 

    CBitmap

  • 22
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
好的,如果您不想使用CImage,您可以使用Windows GDI API和文件I/O函数来加载、转换和保存位图文件。以下是一个示例代码,用于将24位位图文件压缩为RLE 8位格式并保存: ```cpp // 打开位图文件 CFile file(_T("test.bmp"), CFile::modeRead | CFile::typeBinary); BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; file.Read(&bmfh, sizeof(BITMAPFILEHEADER)); file.Read(&bmih, sizeof(BITMAPINFOHEADER)); // 计算行字节数 int rowSize = (bmih.biWidth * 3 + 3) & ~3; // 分配位图数据缓冲区 BYTE* pBits = new BYTE[rowSize * bmih.biHeight]; file.Read(pBits, rowSize * bmih.biHeight); // 关闭位图文件 file.Close(); // 创建DC HDC hDC = ::GetDC(NULL); HDC hMemDC = CreateCompatibleDC(hDC); // 创建调色板 RGBQUAD pal[256]; for (int i = 0; i < 256; i++) { pal[i].rgbBlue = i; pal[i].rgbGreen = i; pal[i].rgbRed = i; } // 创建位图 BITMAPINFO bmi = { 0 }; bmi.bmiHeader = bmih; bmi.bmiHeader.biBitCount = 8; bmi.bmiHeader.biCompression = BI_RLE8; bmi.bmiHeader.biClrUsed = 256; bmi.bmiHeader.biSizeImage = rowSize * bmih.biHeight; bmi.bmiColors[0].rgbRed = 0; bmi.bmiColors[0].rgbGreen = 0; bmi.bmiColors[0].rgbBlue = 0; bmi.bmiColors[0].rgbReserved = 0; memcpy(&bmi.bmiColors[1], pal, 256 * sizeof(RGBQUAD)); HBITMAP hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0); // 绘制位图 HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); StretchDIBits(hMemDC, 0, 0, bmih.biWidth, bmih.biHeight, 0, 0, bmih.biWidth, bmih.biHeight, pBits, &bmi, DIB_RGB_COLORS, SRCCOPY); SelectObject(hMemDC, hOldBitmap); // 保存位图 CFile outFile(_T("compressed.bmp"), CFile::modeWrite | CFile::modeCreate); outFile.Write(&bmfh, sizeof(BITMAPFILEHEADER)); outFile.Write(&bmih, sizeof(BITMAPINFOHEADER)); BYTE* pCompressedBits = NULL; DWORD dwSize = 0; GetBitmapBits(pBits, bmi.bmiHeader.biSizeImage, &pCompressedBits, &dwSize, BI_RLE8); outFile.Write(pCompressedBits, dwSize); outFile.Close(); // 释放资源 delete[] pCompressedBits; DeleteObject(hBitmap); DeleteDC(hMemDC); ::ReleaseDC(NULL, hDC); ``` 在上述代码中,我们首先打开位图文件并读取位图文件头和信息头。然后,我们计算每行的字节数,并分配位图数据缓冲区。接下来,我们创建一个DC和调色板,并使用CreateDIBSection函数创建一个新的8位位图。然后,我们使用StretchDIBits函数将原始位图绘制到新位图中。最后,我们使用GetBitmapBits函数将位图数据压缩为RLE 8位格式,并将其写入最终的位图文件中。最后,我们释放所有分配的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值