VC++图像处理
这里有一段截取屏幕的代码:CDCdc,bmpdc;intwid,hig;dc.CreateDC("DISPLAY",NULL,NULL,NULL);CBitmapbm;w...
这里有一段截取屏幕的代码:
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?有点乱,看了很多天了,还是没搞清,请各位大神好好看下,小弟不胜感激~~ 展开
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?有点乱,看了很多天了,还是没搞清,请各位大神好好看下,小弟不胜感激~~ 展开
3个回答
展开全部
学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);
给你一段我刚写的截屏代码
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);
追问
也感谢这位网友的解答,谢谢!
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
发私聊给你了。你自己慢慢看。
追问
谢谢,请看私信
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
仅通过C++中的类是不够的,图像处理还需要很多复杂的算法
具体做法通过短短几句话说不清楚,建议找些书来看看
我当初学习用的是何东建的《数字图像处理》
光盘里面附有很多VC++代码
通过调用他提供的点处理类中的函数
就可以实现你的功能
具体做法通过短短几句话说不清楚,建议找些书来看看
我当初学习用的是何东建的《数字图像处理》
光盘里面附有很多VC++代码
通过调用他提供的点处理类中的函数
就可以实现你的功能
追问
能不要复制么?我看到另一个帖子你这样回答。要的是真实的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询