VC++图像处理

这里有一段截取屏幕的代码:
CDC dc,bmpdc;
int wid,hig;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
wid = GetSystemMetrics(SM_CXSCREEN);
hig = GetSystemMetrics(SM_CYSCREEN);
bmpdc.CreateCompatibleDC(&dc);
bmpdc.SelectObject(&bm);
bmpdc.BitBlt(0,0,wid,hig,&dc,0,0,SRCCOPY);
CRect rect;
GetClientRect(&rect);
GetDC()->StretchBlt(0,0,rect.Width(),rect.Height(),&bmpdc,0,0,rect.Width(),rect.Height(),SRCCOPY);

请问这段代码中,CBitmap bm,bm是否已经存储了截取屏幕的图像了?如果我要对截取的屏幕进行像素点修改后再显示出来(比方说变成灰度图片),应该怎么做?是在CDC dc中操作,还是 CDC bmpdc中操作,还是CBitmap bm中操作在写入CDC?有点乱,看了很多天了,还是没搞清,请各位大神好好看下,小弟不胜感激~~

学C++图像处理我推荐就用win32 API就好了,比mfc封装的类明了多了。
给你一段我刚写的截屏代码
HDC hDesktopDC=::GetDC(NULL);
BITMAPINFOHEADER BitmapInfo;
ZeroMemory(&BitmapInfo,sizeof(BITMAPINFOHEADER));
BitmapInfo.biSize=sizeof(BITMAPINFOHEADER);
BitmapInfo.biBitCount=24;
BitmapInfo.biCompression=BI_RGB;
BitmapInfo.biPlanes=1;
BitmapInfo.biWidth=GetDeviceCaps(hDesktopDC,HORZRES);
BitmapInfo.biHeight=GetDeviceCaps(hDesktopDC,VERTRES);
BitmapInfo.biSizeImage=(BitmapInfo.biWidth*BitmapInfo.biBitCount+31)/32*4*BitmapInfo.biHeight;;

//内存DC,用于保存截屏后的图片
HDC hMemDC=CreateCompatibleDC(NULL);
BYTE *pDibBuffer;//内存DIB数据指针,,你可能会想这个指针干什么用的。可以对这个指针指向的图像数据进行图像处理,如变成灰度图片,那是你自己实现算法的事了

//创建画布,是一个内存DIB画布
HBITMAP hBitmap=CreateDIBSection(NULL,(BITMAPINFO*)&BitmapInfo,DIB_RGB_COLORS,(void**)&pDibBuffer,NULL,0);
SelectObject(hMemDC,hBitmap);
//将屏幕图像拷贝到内存DC
BitBlt(hMemDC,0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,hDesktopDC,0,0,SRCCOPY);

//保存pDibBuffer数据得到一张BMP图片

DeleteObject(hBitmap);
DeleteDC(hMemDC);
::ReleaseDC(NULL,hDesktopDC);追问

也感谢这位网友的解答,谢谢!

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-07-17
发私聊给你了。你自己慢慢看。追问

谢谢,请看私信

本回答被提问者采纳
第2个回答  2014-07-16
仅通过C++中的类是不够的,图像处理还需要很多复杂的算法
具体做法通过短短几句话说不清楚,建议找些书来看看
我当初学习用的是何东建的《数字图像处理》
光盘里面附有很多VC++代码
通过调用他提供的点处理类中的函数
就可以实现你的功能追问

能不要复制么?我看到另一个帖子你这样回答。要的是真实的

在VC++中如何进行图像处理?
申请个二维或一维数组,把图像亮度值装进去。比如用:CBitmap::LoadBitmap 之类的函数,把硬盘中的文件读进数组。然后做各种图像处理。(二值化,过滤处理之类的)再显示或存盘。或者用一些现成的图像处理库。比如收费的(LeadTools),免费的(OpenCV)之类的。

关于用VC++做数字图像处理,如何调用已有的头文件和源文件?
第一步:新键一个工程 第二步:在工程的菜单栏中添加一个选项"阈制变化"(这你应该会吧~~)第三步:使用CLASS WIZARD为这个选项添加一个消息响应函数如"ONYUZHIBIANHUAN"默认在C**VIEW类里的 第四步:在这个消息响应函数中调用你的功能函数如VOID YUZHIBIANHUAN();第五步:程序开头加上#INCLUDE "*...

C++图片处理问题(高分50)
第一个问题很麻烦,因为一个BMP图包含的信息部仅仅是每个点的数据,还有很多bitmap格式信息,解决方法:首先你要确定你用什么环境,vc++6.0,2003,2005可用的办法不一样 然后,去网上搜一段写好了的函数或类来解决这个问题,他的实现方法如果你对bmp格式文件存储没有兴趣的话大可以不必关心,与图像处...

vc++近红外波段图像处理算法该从什么地方着手?
首先是读入和输出图像,VC++里面没有matlab那样简单的读入和输出图像的函数。用openCV可能会好一些,读入和输出图像比较简单。接下来找算法对图像进行预处理,让它符合你的处理要求,然后再进行图像处理。这个很难说,关键还要看你想对图像进行怎么样的处理。

VC++6.0 MFC进行图像处理,现在想要学习VC++数字图像处理的应用,不知如...
其实没那么难的,和普通的编程差不多,也是建立一个MFC工程即 文件--新建--MFCAppWizard(exe),第一步的时候选择多文档;还有有个地方要注意,因为一般要处理的图像可能比较大,所以在最后一步,你在选择view的种类时最好选择CScorllView。然后至于怎么编写,要实现什么样的功能,就要看你这个程序的...

这位大哥你好:我是在VC++环境下进行图片处理,处理一个齿轮,
l函数原型:int WINAPI icePub_imgToSingleBmp(char *strImgFilename,char *strBmpFilename,int thresholdValue)输入:strImgFilename 待处理图像文件名 strBmpFilename bmp图像名 thresholdValue 256级灰度值的阈值(函数会先将图像转换成灰度再根据thresholdValue做黑白2值化)输出:lVC连接Lib方式声明 __...

VisualC++数字图像处理的内容简介
《VisualC++数字图像处理》配合图像处理专业理论性书籍的内容,从程序设计角度介绍了各种图像处理技术的典型算法及在VC++环境下的代码实现,并通过典型案例的介绍将各种图像处理技术集成起来。

哪位有vc++数字图像处理的源代码??急用!!谢谢
*0.514+(unsigned char)(src->imageData+h*src->widthStep)[3*w]*0.350);} } } void Func_ShowWindow(){ cvNamedWindow("原图",0); \/\/CV库函数,窗口定义函数,定义窗口,用于下一步的显示 cvShowImage("原图",src); \/\/cv库函数,标题栏是“原图”,显示src所指向的图像 ...

寻求编程高手帮忙用VC++编一个简单的图像处理软件!!!
我现在也在做相关的程序,快做好了.如果要简单一点的 使用 picture 控件实现打开文件,放大缩小使用StretchBlt之类的位图相关的函数或者直接使用MoveWindow,灰度的话 我很偷懒,直接使用GetPixel函数 获取RGB值做运算 最后保存对话框里的图像就OK了。希望对你有帮助。

vc++怎么对avi文件进行单针采集,图像处理
下面的nNum就是帧数,如果想对任意帧解压就需要进一步学OPENCV了 \/\/ 定义帧 IplImage * pFrame = NULL;\/\/ 定义视频 CvCapture * capture = NULL;\/\/ 读取视频 capture = cvCreateFileCapture("d:\\\\3.avi");int nNum = 0;while(1){ \/\/ 帧数 nNum++;\/\/ 取当前帧数,并解包下一帧 pFrame ...

相似回答