新手请教:VC++6,得到屏幕截图后的句柄后,如何能不保存文件,直接处理图像数据

2017-05-06 02:27
下面的代码,已能截图,并得到其句柄(hBitmap),请问:如何通过句柄(hBitmap)来处理截得的图像(想灰度化),最好不要先存成文件,再打开。请帮助提示几行示例代码,在此先谢过!!!

	// TODO: Add your control notification handler code here
	RECT rect = {970, 530, 1026, 552};
	LPRECT lpRect=▭

    HDC hScrDC, hMemDC;             // 屏幕和内存设备描述表  
    HBITMAP hBitmap, hOldBitmap;    // 位图句柄  
    int nX, nY, nX2, nY2;           // 选定区域坐标  
    int nWidth, nHeight;            // 位图宽度和高度  
    int xScrn, yScrn;               // 屏幕分辨率  
  
    if (IsRectEmpty(lpRect))  
       MessageBox("Rect NULL"); 
  
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);     // 为屏幕创建设备描述表  
      
    hMemDC = CreateCompatibleDC(hScrDC);                // 为屏幕设备描述表创建兼容的内存设备描述表  
  
    nX = lpRect->left;  
    nY = lpRect->top;  
    nX2 = lpRect->right;  
    nY2 = lpRect->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);  

回复讨论(解决方案)

GetObject 可以获得 BITMAP 信息 

GetDIBits 获得像素数据
GetObject 可以获得 BITMAP 信息 

GetDIBits 获得像素数据


对于图像处理,我是完全新手,请帮助提示点示例代码,谢谢。
GetDIBits 链接的注释中不就有例子吗
谢谢,再请教一下:在上述情况下,可以用GetBitmapBits来代替GetDIBits吗?它们到底有什么区别呢?
GetObject 可以获得 BITMAP 信息 

GetDIBits 获得像素数据

问题已解决,谢谢你的提示!