1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)

简介: 源代码:http://download.csdn.net/detail/nuptboyzhb/3961677 Ø  添加全屏截图菜单项,菜单项的属性如下; Ø  为该菜单项建立类向导。 编辑消息处理函数如下 voidCCVMFCView::OnPrintscreen() {     ...

源代码:http://download.csdn.net/detail/nuptboyzhb/3961677

Ø  添加全屏截图菜单项,菜单项的属性如下;


Ø  为该菜单项建立类向导。

编辑消息处理函数如下

voidCCVMFCView::OnPrintscreen()

{

        

         CRect rect;

         //HBITMAP hMap;

         rect.left = 0;

         rect.top = 0;

         rect.right =GetSystemMetrics(SM_CXSCREEN);

         rect.bottom =GetSystemMetrics(SM_CYSCREEN);

         //-------------------------------------------

         HDC hScrDC, hMemDC;     

         // 屏幕和内存设备描述表

         HBITMAP hBitmap,hOldBitmap;  

         // 位图句柄

         int       nX, nY, nX2, nY2;     

         // 选定区域坐标

         int       nWidth, nHeight;     

         // 位图宽度和高度

         int       xScrn, yScrn;        

         // 屏幕分辨率

         // 确保选定区域不为空矩形

         //为屏幕创建设备描述表

         hScrDC = CreateDC("DISPLAY",NULL, NULL, NULL);

         //为屏幕设备描述表创建兼容的内存设备描述表

         hMemDC = CreateCompatibleDC(hScrDC);

         // 获得选定区域坐标

         nX = rect.left;

         nY = rect.top;

         nX2 =rect.right;

         nY2 =rect.bottom;

         // 获得屏幕分辨率

         xScrn = GetDeviceCaps(hScrDC, HORZRES);

         yScrn = GetDeviceCaps(hScrDC, VERTRES);

         //确保选定区域是可见的

         if (nX < 0) nX = 0;

         if (nY < 0) nY = 0;

         if (nX2 > xScrn) nX2 = xScrn;

         if (nY2 > yScrn) nY2 = yScrn;

         nWidth = nX2 - nX;

         nHeight = nY2 - nY;

         // 创建一个与屏幕设备描述表兼容的位图

         hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);

         // 把新位图选到内存设备描述表中

         hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);

         // 把屏幕设备描述表拷贝到内存设备描述表中

         BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC, nX, nY, SRCCOPY);

         //得到屏幕位图的句柄

         hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);

         //清除

         DeleteDC(hScrDC);

         DeleteDC(hMemDC);

        

         CFileDialogdlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存文本(*.bmp)|*.bmp|所有文件(*.*)|*.*||");

         CString strPath("");

         if(dlg.DoModal() == IDOK)

         {

                   strPath=dlg.GetPathName();

                   //----------------以下为保存图像句柄为hBitmap,路径为lpFileName的图像

            LPSTR lpFileName=(LPTSTR)(LPCTSTR)strPath;

                   HDC  hDC;   //设备描述表   

                   int iBits;  //当前显示分辨率下每个像素所占字节数   

                   WORD    wBitCount;  //位图中每个像素所占字节数

                   //定义调色板大小, 位图中像素字节大小 ,  位图文件大小 , 写入文件字节数

                   DWORD          dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;

                   BITMAP          Bitmap;     //位图属性结构

                   BITMAPFILEHEADER   bmfHdr; //位图文件头结构

                   BITMAPINFOHEADER   bi;     //位图信息头结构

                   LPBITMAPINFOHEADER lpbi;          //指向位图信息头结构

                   HANDLE       fh, hDib, hPal;

                   HPALETTE     hOldPal=NULL;

                   //定义文件,分配内存句柄,调色板句柄

                  

                   //计算位图文件每个像素所占字节数

                   hDC =CreateDC("DISPLAY",NULL,NULL,NULL);

                   iBits = GetDeviceCaps(hDC,BITSPIXEL) *

                            GetDeviceCaps(hDC,PLANES);

                   DeleteDC(hDC);

                   if (iBits <= 1)  wBitCount = 1;

                   else if (iBits <= 4)  wBitCount = 4;

                   else if (iBits <= 8)  wBitCount = 8;

                   else if (iBits <= 24)wBitCount = 24;

                   else

                            wBitCount = 32;

                  

                   //计算调色板大小

                   if (wBitCount <= 8) 

                            dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD);

                  

                   //设置位图信息头结构

                   GetObject(hBitmap,sizeof(BITMAP), (LPSTR)&Bitmap);

                   bi.biSize=sizeof(BITMAPINFOHEADER);

                   bi.biWidth= Bitmap.bmWidth;

                   bi.biHeight= Bitmap.bmHeight;

                   bi.biPlanes= 1;

                   bi.biBitCount= wBitCount;

                   bi.biCompression= BI_RGB;

                   bi.biSizeImage= 0;

                   bi.biXPelsPerMeter= 0;

                   bi.biYPelsPerMeter= 0;

                   bi.biClrUsed= 0;

                   bi.biClrImportant= 0;

                   dwBmBitsSize =((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;

                   //为位图内容分配内存

                   /*xxxxxxxx计算位图大小分解一下(解释一下上面的语句)xxxxxxxxxxxxxxxxxxxx

                   //每个扫描行所占的字节数应该为4的整数倍,具体算法为:

                   int biWidth =(Bitmap.bmWidth*wBitCount) / 32;

                   if((Bitmap.bmWidth*wBitCount)% 32)

                   biWidth++; //不是整数倍的加1

                   biWidth *= 4;//到这里,计算得到的为每个扫描行的字节数。

                   dwBmBitsSize = biWidth *Bitmap.bmHeight;//得到大小

                   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/

                   hDib  =GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));

                   lpbi =(LPBITMAPINFOHEADER)GlobalLock(hDib);

                   *lpbi = bi;

                   // 处理调色板  

                   hPal =GetStockObject(DEFAULT_PALETTE);

                   if (hPal)

                   {

                            hDC = ::GetDC(NULL);

                            hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE);

                            RealizePalette(hDC);

                   }

                   // 获取该调色板下新的像素值

                   GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);

                   //恢复调色板  

                   if (hOldPal)

                   {

                            SelectPalette(hDC,hOldPal, TRUE);

                            RealizePalette(hDC);

                            ::ReleaseDC(NULL,hDC);

                   }

                   //创建位图文件   

                   fh=CreateFile(lpFileName,GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);

                   // 设置位图文件头

                   bmfHdr.bfType = 0x4D42;  // "BM"

                   dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize; 

                   bmfHdr.bfSize = dwDIBSize;

                   bmfHdr.bfReserved1 = 0;

                   bmfHdr.bfReserved2 = 0;

                  bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;

                   // 写入位图文件头

                   WriteFile(fh,(LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

                   // 写入位图文件其余内容

                   WriteFile(fh, (LPSTR)lpbi,sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize , &dwWritten, NULL);

                   //清除  

                   GlobalUnlock(hDib);

                   GlobalFree(hDib);

                   CloseHandle(fh);

        MessageBox("已完成保存!");

         }

}





Ø  “全屏截图”菜单项的资源ID是ID_PRINTSCREEN

Ø  打开资源:Accelerator


Ø  目前的快捷键为:


Ø  添加新的快捷键,在最后一行的虚线处,点击鼠标右键添加:属性如下


Ø  添加之后的资源界面为:

 

from:http://blog.csdn.net/nupt123456789/article/details/7100134

目录
相关文章
|
9月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
2593 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
10月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
125 4
|
10月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
11月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
11月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
340 1
|
机器学习/深度学习 人工智能 自然语言处理
OpenCV与AI深度学习之常用AI名词解释学习
AGI:Artificial General Intelligence (通用人工智能):是指具备与人类同等或超越人类的智能,能够表现出正常人类所具有的所有智能行为。又被称为强人工智能。
202 2
|
12月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
计算机视觉 Python
opencv 处理图像去噪的几种方法学习
OpenCV 提供了多种图像去噪的方法,以下是一些常见的去噪技术以及相应的 Python 代码示例: 均值滤波:使用像素邻域的灰度均值代替该像素的值。
184 0
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
442 1
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
215 1