CImage类(一)

   

学习图像处理一年了,一直没能做出一个像样的VC图像处理程序,主要因为没能弄懂别人写的CDib类。前不久听说Visual Studio.net2003里新加了个专门用于图像处理的类CImage,学习了一下发现还是很好用的。

在VC6.0里直接包含CImage类头文件是没办法使用的,想在VC6.0里使用这个类还是比较复杂的,所以我用了最新的Visual Studiov.net2008(机子不好的,用起来会很慢)。

从MSDN中我们可以查看到CImage类的成员函数,这个类提供了直接对像素操作的函数,十分方便,但是看网上评论反映说,这些对像素操作的函数效率很低,所以想做出好点的程序还是应该用传统的方法,用指针读取图片数据区的数据进行操作。

CImage类提供了GetBits()函数来读取数据区,GetBits()函数返回的是图片最后一行第一个像素的地址,网上有人说返回指针的起始位置是不同的,有些图片返回的是左上角像素的地址,有些是左下角像素的地址,跟图片内部顺序有关。这里我们不必关心起始位置,只要很另外两个函数GetPitch()和GetHeight()一起使用就可以得到图片数据取得起始位置,定义数据区指针为BYTE* img_Data

img_Data=(BYTE *)m_Image.GetBits()+(m_Image.GetPitch()*(m_Image.GetHeight()-1));

这样,img_Data就是图片数据区的起始位置,这个公式是从codeproject里看到的,介绍的很精辟,可以从google里搜索到。其中GetHeight()函数返回图片的高度(以像素为单位)。GetPitch()返回图像的斜度,如果图像的顺序是从下到上(也就是GetBits()返回左上角像素的地址),这时GetPitch()返回一个负值,大小为图像宽所占有的字节数,例如24位800*600的图片,返回值应该是正或负的800*3。这样用每一行的字节数乘行数就可以得到起始位置了。

下面再引入两个函数,Load()用来装在一个图像,Draw()用来在一个矩形区域绘制图像,这两个函数比较好理解,看个例子就能明白。下面是一个显示图像的程序,这里只给出打开图像文件和显示图像的函数,用的是带滚动条的多文档模式。

void CCImageTestView::OnFileOpen()
{
 CString strFilter;
 CSimpleArray<GUID> aguidFileTypes;
    HRESULT hResult;
 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T("All Image Files"));
 if (FAILED(hResult))

{
  AfxMessageBox("调用函数失败");
 return;
 }
 CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,strFilter);
 if (IDOK != dlg.DoModal())

{
 return;
 }
 m_Image.Destroy(); //按打开按钮弹出一个打开文件的对话框
 hResult = m_Image.Load(dlg.GetFileName()); //利用打开文件对话框返回的文件路径装载图像
 if (FAILED(hResult))

{
  AfxMessageBox("调用图片失败");
 return;
 }

//以下是文档标题栏文字
 CString str;
 str.LoadString(AFX_IDS_APP_TITLE);
 AfxGetMainWnd()->SetWindowText(str+'-'+dlg.GetFileName()); 
 OnInitialUpdate();
 Invalidate();
}

绘图函数

void CCImageTestView::OnDraw(CDC* pDC)
{
 CCImageTestDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;
 if(!m_Image.IsNull())
 {
  m_Image.Draw(pDC->m_hDC,0,0);//用Draw()函数绘图
 }
}

再给出个初始化滚动条的函数作为补充。

void CCImageTestView::OnInitialUpdate()
{
 CScrollView::OnInitialUpdate();

CSize sizeTotal;
 // TODO: 计算此视图的合计大小
 int ImageW,ImageH;
 if(!m_Image.IsNull())
 {
  ImageW=m_Image.GetWidth();
  ImageH=m_Image.GetHeight();
  sizeTotal.cx = ImageW;
  sizeTotal.cy = ImageH;
 }
 else
 {
  sizeTotal.cx=sizeTotal.cy=100;
 }
 SetScrollSizes(MM_TEXT, sizeTotal);
}

转载于:https://www.cnblogs.com/songtzu/archive/2013/01/04/2844059.html

CImage类 from http://blog.sina.com.cn/s/blog_487547aa0100an6k.html相关推荐

  1. http://blog.sina.com.cn/s/blog_5da93c8f0102w86x.html

    转至:http://blog.sina.com.cn/s/blog_5da93c8f0102w86x.html 参考:http://droidyue.com/blog/2015/04/12/avoid ...

  2. http://blog.sina.com.cn/s/blog_49867dc00100zj7t.html

    http://blog.sina.com.cn/s/blog_49867dc00100zj7t.html JSON-lib框架,转换JSON.XML不再困难 Json-lib可以将Java对象转成js ...

  3. http://blog.sina.com.cn/s/blog_5bd6b4510101585x.html

    http://blog.sina.com.cn/s/blog_5bd6b4510101585x.html 转载于:https://www.cnblogs.com/longshiyVip/p/59333 ...

  4. http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html

    http://blog.sina.com.cn/s/blog_6145ed810102vr8k.html 转载于:https://www.cnblogs.com/toSeeMyDream/p/5801 ...

  5. http://blog.sina.com.cn/s/blog_4aae007d0100inxi.html

    http://blog.sina.com.cn/s/blog_4aae007d0100inxi.html 转载于:https://www.cnblogs.com/qxql2016/p/4693885. ...

  6. http://blog.sina.com.cn/s/blog_5007d1b10100ltwh.html

    http://blog.sina.com.cn/s/blog_5007d1b10100ltwh.html

  7. http://blog.sina.com.cn/s/blog_6364150101018hby.html

    http://blog.sina.com.cn/s/blog_6364150101018hby.html

  8. 我在新浪的微博: http://blog.sina.com.cn/wenxy1

    我在新浪的微博: http://blog.sina.com.cn/wenxy1 从今以后, 技术性文章在CSDN发布, 生活见闻在sina微博发布,不知道CSDN和sina的微博可不可以同步?

  9. Get more...go to my another blog...http://blog.sina.com.cn/qqlove163

    Get more...go to my another blog...http://blog.sina.com.cn/qqlove163

最新文章

  1. 【分享几个日常巡检 监控数据库的语句】
  2. SharePoint之备份网站所有内容
  3. 让你觉得破坏了封装性的扩展方法
  4. ubuntu17.04之apt-get源
  5. oracle中sga的合理设置,oracle学习:SGA_MAX_SIZE参数设置
  6. NOI题库 7654 等差数列末项计算
  7. Master of Typing 3 for mac (打字大师3)支持m1
  8. 【C++】内存4区---代码区、全局区、栈区、堆区
  9. BAT54C不断电源保护电路
  10. 六轴机器人轨迹规划之matlab画直线
  11. DSP技术是利用计算机或,DSP技术是什么?
  12. AN5640摄像头模块在黑金开发板上的使用
  13. [ffmpeg][vaapi][goav][golang] ffmpeg使用vaapi示例代码(基于goav-incr)
  14. 图片传输到ipfs节点然后将生成的ipfs访问链接存到区块链
  15. 腾讯云创建二级域名并解析
  16. win7系统屏幕不休眠,怎么设置
  17. HTML css实现翻页效果,一个纯CSS3实现的酷炫翻书效果
  18. php 提取视频中的音频,如何把视频中的音频提取出来
  19. Win8下双系统win7 教程详解
  20. python lambda 判断_Python lambda

热门文章

  1. gradle构建java实例_Gradle构建Java应用程序
  2. linux怎么查看服务器主频,Linux环境下查看服务器硬件信息
  3. python求解典型相关系数_三大相关系数: pearson, spearman, kendall(python示例实现)...
  4. 2018抖音数据研究报告完整版,你喜欢的网红画像到底是怎样?
  5. 用Excel对会员客户交易数据进行RFM分析
  6. c fun函数求n个整数的平均值_Python语法示例——函数
  7. Android系统联系人全特效实现(上),分组导航和挤压动画
  8. VoLTE技术中的会话持续性-SRVCC
  9. java项目实现服务器监控,Java实现服务器状态监控
  10. 其它 博客园 自己写的文章 标题含有小写字母 查看文章时 标题就变成大写的了...