VC图像处理:CImage类GetBits返回值怎么用?

网安智编 厦门萤点网络科技 2026-04-28 00:22 2 0
学习图像处理一年了,一直没能做出一个像样的VC图像处理程序,主要因为没能弄懂别人写的CDib类。前不久听说 2003里新加了个专门用于图像处理的类,学习了一下发现还是很好用的。 在VC6.0里直接包含类头文件是没办法使用的,想在VC6.0里...

VC图像处理:CImage类GetBits返回值怎么用?

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

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

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

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

=(BYTE *).()+(.()*(.()-1));

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

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

void ::()

= .ing(,,_T("All Image Files"));

if (())

("调用函数失败");

dlg(TRUE,NULL,NULL,,);

if (IDOK != dlg.())

.(); //按打开按钮弹出一个打开文件的对话框

= .Load(dlg.()); //利用打开文件对话框返回的文件路径装载图像

if (())

("调用图片失败");

//以下是文档标题栏文字

str;

str.();

()->(str+'-'+dlg.());

();

();

绘图函数

void ::(CDC* pDC)

* pDoc = ();

(pDoc);

if (!pDoc)

if(!.())

.Draw(pDC->m_hDC,0,0);//用Draw()函数绘图

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

void ::()

::();

CSize ;

// TODO: 计算此视图的合计大小

int ,;

if(!.())

=.();

=.();

.cx = ;

.cy = ;

else

.cx=.cy=100;

(, );