使用MFC图形读取放大缩小源代码

时间:2014-06-18 08:18:05
【文件属性】:

文件名称:使用MFC图形读取放大缩小源代码

文件大小:4.57MB

文件格式:RAR

更新时间:2014-06-18 08:18:05

放大缩小

实现对BMP图像的读取,放大,缩小。HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio) { // 源图像的宽度和高度 LONG lWidth; LONG lHeight; // 缩放后图像的宽度和高度 LONG lNewWidth; LONG lNewHeight; // 缩放后图像的宽度(lNewWidth',必须是4的倍数) LONG lNewLineBytes; // 指向源图像的指针 LPSTR lpDIBBits; // 指向源象素的指针 LPSTR lpSrc; // 缩放后新DIB句柄 HDIB hDIB; // 指向缩放图像对应象素的指针 LPSTR lpDst; // 指向缩放图像的指针 LPSTR lpNewDIB; LPSTR lpNewDIBBits; // 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPINFOHEADER lpbmi; // 指向BITMAPCOREINFO结构的指针 LPBITMAPCOREHEADER lpbmc; // 循环变量(象素在新DIB中的坐标) LONG i; LONG j; // 象素在源DIB中的坐标 LONG i0; LONG j0; // 图像每行的字节数 LONG lLineBytes; // 找到源DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 获取图像的宽度 lWidth = ::DIBWidth(lpDIB); // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); // 获取图像的高度 lHeight = ::DIBHeight(lpDIB); // 计算缩放后的图像实际宽度 // 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分 lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5); // 计算新图像每行的字节数 lNewLineBytes = WIDTHBYTES(lNewWidth * 8); // 计算缩放后的图像高度 lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5); // 分配内存,以保存新DIB hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 判断是否内存分配失败 if (hDIB == NULL) { // 分配内存失败 return NULL; } // 锁定内存 lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB); // 复制DIB信息头和调色板 memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 找到新DIB象素起始位置 lpNewDIBBits = ::FindDIBBits(lpNewDIB); // 获取指针 lpbmi = (LPBITMAPINFOHEADER)lpNewDIB; lpbmc = (LPBITMAPCOREHEADER)lpNewDIB; // 更新DIB中图像的高度和宽度 if (IS_WIN30_DIB(lpNewDIB)) { // 对于Windows 3.0 DIB lpbmi->biWidth = lNewWidth; lpbmi->biHeight = lNewHeight; } else { // 对于其它格式的DIB lpbmc->bcWidth = (unsigned short) lNewWidth; lpbmc->bcHeight = (unsigned short) lNewHeight; } // 针对图像每行进行操作 for(i = 0; i < lNewHeight; i++) { // 针对图像每列进行操作 for(j = 0; j < lNewWidth; j++) { // 指向新DIB第i行,第j个象素的指针 // 注意此处宽度和高度是新DIB的宽度和高度 lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j; // 计算该象素在源DIB中的坐标 i0 = (LONG) (i / fYZoomRatio + 0.5); j0 = (LONG) (j / fXZoomRatio + 0.5); // 判断是否在源图范围内 if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)) { // 指向源DIB第i0行,第j0个象素的指针 lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; // 复制象素 *lpDst = *lpSrc; } else { // 对于源图中没有的象素,直接赋值为255 * ((unsigned char*)lpDst) = 255; } } } // 返回 return hDIB; } ///////////////////////////////////////////////////////////////////////////// // CMyDIPView


【文件预览】:
图像缩放
----测试图片()
--------1(157KB)
--------2(245KB)
--------放大后.bmp(245KB)
--------原始lena图像.bmp(65KB)
--------缩小后.bmp(27KB)
----源代码()
--------MyDIP.cpp(4KB)
--------Release()
--------MyDIP.aps(46KB)
--------res()
--------MyDIPView.cpp(10KB)
--------MyDIP.opt(53KB)
--------MyDIP.ncb(57KB)
--------MyDIPView.h(2KB)
--------MyDIP.clw(3KB)
--------dibapi.cpp(23KB)
--------MyDIP.dsp(5KB)
--------MyDIP.h(1KB)
--------MyDIPDoc.h(2KB)
--------dibapi.h(2KB)
--------MyDIPDoc.cpp(4KB)
--------StdAfx.cpp(207B)
--------MainFrm.cpp(2KB)
--------resource.h(1KB)
--------mydib.cpp(3KB)
--------MyDIP.dsw(533B)
--------MyDIP.plg(1KB)
--------MainFrm.h(2KB)
--------StdAfx.h(1KB)
--------MyDIP.rc(12KB)
--------Debug()
--------mydib.h(72B)
--------ReadMe.txt(4KB)

网友评论

  • 可以实现256像素图像的放大缩小,失真严重,可以简单参考
  • 资源很不错,就不是自己想要的,顶一个!
  • 可以用,效果不是很好。一般过的去
  • 可以用,基本满足我的要求
  • 不错的图形学学习资料
  • 还不错,值得学习
  • 效果很好,感谢分享
  • 可以用,效果不是很好。一般过的去
  • 可以实现发达缩小
  • 缩小,放大效果挺好,都是我想要的。
  • 很感谢,挺有用的
  • vs2010,不能通过编译,有点小失望啊
  • 学习了,不错的代码,不过不是我想要的--
  • 在我的环境下怎么报错呢,我的环境是vs2010
  • 程序实现了基本的放大缩小功能,但是图片缩小 在放大就会失真
  • 程序很不错,学习学习~
  • 缩放的效果很好,能够学到不少的东西,很实用,感谢上传者
  • 缩放的效果很好,缩小后也不会出现格子。我想要的是好多张图片在一个界面可以想缩哪个缩哪个,想放哪个放哪个。
  • 程序不错可以实现图像的放大和缩小,但是缺点是图像放大后 有失真现象
  • 学习了,不错的代码,不过不是我想要的--
  • 程序很不错,不够我希望能找到一个能使图片不失真放大的程序源代码,本人刚学mfc,以前学过一点c++,有点吃力
  • 很好的程序代码,学习了
  • 程序不错,不过我要的只是图像的显示和加载
  • 注解详细,正好是我要用到的。但能不能有个操作说明,怎么添加MFC控件,给初学者提供学习方便