DDB 和 DIB (截窗口)

位图分为两种DDB和DIB
     DIB:即兼容位图,独立于设备存在,有描述颜色格式的信息头,如256色1字节、真色彩argb。存在于内存中,是我们写程序的时候能控制的有位图数据格式的数据
     DDB:即设备位图,已经被gdi考到显存后的图像格式,没有信息头,显示格式就是当前的显示设备支持的格式。是我们不能控制的,我们只能通知gdi将某个DIB转化为DDB拷贝到显存显示,是不能直接控制DDB的

获得DIB的数据:
  直接用GetBitmapBits
获得DDB的数据:
     将位图画到一个自己创建的兼容DC,再创建一个兼容DIB位图,用BitBlt把数据从当前DC拷贝到兼容位图,再用GetBitmapBits得到兼容位图数据。这种方法是能得到a(同明度的值的),只是性能不是很高,更好的办法还不知道,不过gdi好像做不到性能更高的办法

 

用过GDI画图函数以后,如果BITMAP原来就是DIB那,直接GetBitmapBits就能得到数据,如果是DDB则要创建兼容DC和兼容DIB位图画上然后再在GetBitmapBits。

 

CreateBitmap                    试图创建DDB,失败创建DIB
CreateBitmapIndirect          试图创建DDB,失败创建DIB
CreateCompatibleBitmap     试图创建DDB,失败创建DIB
CreateDIBitmap                  试图创建DDB,失败创建DIB
CreateDIBSection                直接创建DIB

具体代码:

DIB获取:

LPVOID    bitmapData=NULL;
hBitmap =CreateCompatibleBitmap(h,width,height);
GetBitmapBits(hBitmap,width*height*4,bitmapData);
for(int i=0 ;i<width*height;i++){
    unsigned char b  = *((char*)bitmapData+i*4) ;
    unsigned char g  = *((char*)bitmapData+i*4+1) ;
    unsigned char r  = *((char*)bitmapData+i*4+2) ;
    unsigned char a  = *((char*)bitmapData+i*4+3) ;
}

 

DDB获取:

    
LPVOID    bitmapData=NULL;

int width = 100;
int height = 100;


HDC hdc = GetDC(hWnd);//hWnd为DDB所在窗口句柄
hCDC = CreateCompatibleDC(hdc);
hBitmap =CreateCompatibleBitmap(h,width,height);
SelectObject(hCDC,hBitmap); 
BitBlt(hCDC,0,0,width,height,h,0,0,SRCCOPY);

GetBitmapBits(hBitmap,width*height*4,bitmapData);
    
for(int i=0 ;i<width*height;i++){
    unsigned char b  = *((char*)bitmapData+i*4) ;
    unsigned char g  = *((char*)bitmapData+i*4+1) ;
    unsigned char r  = *((char*)bitmapData+i*4+2) ;
    unsigned char a  = *((char*)bitmapData+i*4+3) ;
}

 

 

转载于:https://www.cnblogs.com/wangjixianyun/archive/2013/04/12/3016354.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值