• MFC漆摘要-截图,获得DIB/DDB图形Pixel


    1.       当前Screen进行Copy屏幕,获得BITMAP

    当前屏幕Copy。须要获取当前屏幕的HDC

    一种是直接从屏幕DC抓原始图。

    一种是然后使用兼容MemDC进行抓图,然后能够附加图形的相关处理,如调整大小。如把鼠标绘制上去等。

    (:假设是对当前程序Copy屏幕的话。传入GetDC參数使用 this->getsafehwnd())

    (:假设对指定窗体Copy屏幕的话,能够用Spy++获取窗体HWND,然后传入GetDC)

     

    对于从程序抓原始图的方式比式比較简单,比如:

    // 获取当前屏幕HDC
    
    HDC hScreenDC = ::GetDC(NULL);
    
    // 直接获取当前DC相应的BITMAP
    
    HBITMAP hBmp = (HBITMAP) GetCurrentObject (hScreen, OBJ_BITMAP);
    
    

    对于使用兼容DC抓图的样例例如以下,比如:

    // 获取当前屏幕HDC
    HDC hScreenDC = ::GetDC(NULL);
    // 创建兼容HDC
    HDC hMemDC = ::CreateCompatibleDC(hScreenDC)
    // 创建兼容位图
    HBITMAP hbm = CreateCompatibleBitmap(hScreenDC, width, height);
    // 为MemDC选中兼容为图
    HBITMAP oldbm = (HBITMAP) SelectObject(hMemDC, hbm);
    // 复制图片像素内容
    BitBlt(hMemDC, 0, 0, width, height, hScreenDC, left, top, SRCCOPY);	 	
    // 假设须要绘制鼠标信息的话
    {//Draw the Cursor	
    	ICONINFO iconinfo ;	
    	BOOL ret;
    	ret	= GetIconInfo( hcur,  &iconinfo ); 
    	if (ret) {
    		xPoint.x -= iconinfo.xHotspot;
    		xPoint.y -= iconinfo.yHotspot;
    		//need to delete the hbmMask and hbmColor bitmaps
    		//otherwise the program will crash after a while after running out of resource
    		if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);
    		if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);
    	}		
    	::DrawIcon( hMemDC,  xPoint.x,  xPoint.y, hcur); 
    }
    // 设置回原有的DC绑定位图
    SelectObject(hMemDC,oldbm);
    

     

    2.       获取DDB图形Pixel

    DDB-Device dependency bitmap设备依赖图形

    由于当前Bitmap都是通过DC获取的,所以都是DDB类型的图形。

    通过CBitmap的函数GetBitmapBits,获取到相关bits内容,或者也能够使用GetBitmap获取整个BITMAP结构信息。

    但获取到的这个pixel信息是和当前device相关的。比如device24位色/32位色/自下而上绘制的/使用颜色掩码,则获取到的pixel也是这样的的,

    : 此处CBitmapDDB图形。不能使用CImage进行CImage::GetBits获取Pixel,详见CImage:: IsDIBSection说明。同一时候,假设要保存图形的话,能够借用CImage:: Save来保存图形。

     

     比如:

    // 绑定hbmp
    
    CBitmap bitmap;
    
    Bitmap.attach(hBmp);
    
    // 申请内存
    
    byte pBuffer = new [width * 4 * height];
    
    // 获取bits信息
    
    Bitmap. GetBitmapBits(pBuffer);
    
    

     

     

    3.       获取DIB图形Pixel

    DIB-Device Independency Bitmap设备无关图形

    这类图形,本身结构中具备了图形颜色位数/颜色表/颜色掩码说明相关的信息,所以就能够不依赖于从社备中查询这些信息,也称为设备无关图形。

    HBitmap获取DIB图形的函数经常使用GetDIBits

    GetDIBBits一方面能够用于查询出当前设备的结构信息,填入DIB头信息BITMAPINFO说明中;

    还有一方面。能够指定BITMAPINFO/指定图形格式,从Bitmap中转换出指定格式的图形信息。

    所以它的使用方法有两种:

    1.      一种是获取Device中的格式,然后填入到BItmapInfo,然后基于该BitmapInfo,获取Pixel信息

    2.      还有一种是,直接指定Bitmapinfo。获取基于指定格式转换后Pixsel信息

     

    比如,我们兼或考虑这两种。先获取设备BitmapInfo,然后对格式进行改动,再获取改动格式后的图形Pixel

    // 初始化空白PBITMAPINFO
    
    LPBITMAPINFO lpBitmapInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));
    
    memset(lpBitmapInfo, 0, sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));
    
    lpBitmapInfo->bmiHeader.biSize = sizeof(lpBitmapInfo->bmiHeader);
    
    // lpvBits使用NULL查询位图DIB信息
    
    if (GetDIBits(hMemDC, hBmp, 0, 0, NULL, lpBitmapInfo, DIB_RGB_COLORS))
    
    {
    
             // 改动格式,使用改动后的格式获数据Pixel数据
    
    lpBitmapInfo->bmiHeader.biCompression = BI_RGB;
    
             lpBitmapInfo->bmiHeader.biBitCount = 24;
    
             // 查询位图DIB信息
    
             GetDIBits(hMemDC, (HBITMAP)cBitmap.GetSafeHandle(), 0, nHeight, pBuffer, lpBitmapInfo, DIB_RGB_COLORS);
    
    }
    
    // 处理完成删除头信息
    
    delete lpBitmapInfo;
    


    Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请注明出处 

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    vue 引用本地图片
    antdVue
    Nest.js —— A progressive Node.js framework
    20184313《网络对抗技术》Exp8 Web综合
    20184313《网络对抗技术》Exp7 网络欺诈防范
    20184313《网络对抗技术》Exp6 MSF应用基础
    20184313《网络对抗技术》Exp5 信息搜集与漏洞扫描
    网页激知序列号之途径(网友提供技术参考)
    【转】Delphi中正则表达式支持中文的写法
    遇到的一个奇怪问题
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4686376.html
Copyright © 2020-2023  润新知