很简单的几行代码,但我找不出错误,大家帮我看看吧
我要达到的效果:通过已有的24位的位图颜色数据,把图片画出来(大小为100*40)
//(1)初始化相关关键代码 unsigned char rgb_buf[100*40*3] ; //这个内存区呢,里面有很多位图r,g,b值,格式是rgbrgbrgbrgb.... CDC * cur_dc ; CDC * mem_dc ; CBitmap * mem_bmp ; cur_dc = GetDC() ; //获得显示设备信息 if(mem_dc != NULL) delete mem_dc ; mem_dc = new CDC ; if(mem_bmp != NULL) delete mem_bmp ; mem_bmp = new CBitmap ; mem_dc- >CreateCompatibleDC(cur_dc) ; mem_bmp- >CreateCompatibleBitmap(cur_dc, 100, 40) ; mem_dc- >SelectObject(mem_bmp) ; //把图画上去 HBITMAP hOldBitmap = HBITMAP(*mem_bmp); ::SetBitmapBits(hOldBitmap, sizeof(rgb_buf), rgb_buf ); mem_dc->SelectObject(hOldBitmap) ; cur_dc->BitBlt(0,0, 100, 40, mem_dc, 0,0, SRCCOPY) ;
unsigned char rgb_buf[100*40*4]; for(int i=0; i< 40; i++) { for(int j=0; j<100; j++) { rgb_buf[i*100*4 +j*4] = 255; rgb_buf[i*100*4 +j*4+1] = 0; rgb_buf[i*100*4 +j*4+2] = 0; rgb_buf[i*100*4 +j*4+3] = 0; } } CDC *pdc = GetDC() ; CDC memdc; CBitmap bmp; CRect rt; memdc.CreateCompatibleDC(pdc); srand(time(NULL)); bmp.CreateCompatibleBitmap(pdc, 100, 40) ; bmp.SetBitmapBits(sizeof(rgb_buf), rgb_buf); memdc.SelectObject(&bmp); GetClientRect(&rt); pdc->BitBlt(rt.left, rt.top, rt.right, rt.bottom, &memdc, 0, 0, SRCCOPY); memdc.DeleteDC(); ReleaseDC(pdc);
[解决办法]
unsigned char rgb_buf[100*40*3] ;unsigned char rgba_buf[100*40*4];for( int i = 0; i < 100 * 40; i ++ ){ for( j = 0; j < 3; j ++ ) { rgba_buf[ i * 4 + j] = rgb_buf[i * 3 + j]; } rgba_buf[i* 4 + 3] = 0; }::SetBitmapBits(hOldBitmap, sizeof(rgba_buf), rgba_buf );
[解决办法]
我今天在仔细检查下
按理说没问题啊,可改成32位的还是乱七八糟的.............
不满你说,我调试的环境,内存只有40多M
所以,对性能要求有些严格,对内存的索取也有控制
这就是我不想增加开销的原因