CreateDIBSection生成HBITMAP时,传入的第四个参数ppvBits即会返回指向HBITMAP图像数据的指针,访问数据里面的点会涉及到数据对齐的问题。
一般我们访问未数据对齐的点的方法是:
1 2 3 4 5 6 7 8 | for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { BYTE *color3 = pvBits + (j * width + i) * 3; ... } } |
但HBITMAP的数据有对齐规定,正确访问方法是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | BITMAP bm; CBitmap cbm; cbm.Attach(hBmp); // <- 这是HBITMAP cbm.GetBitmap(&bm); int pixelBytes = bm.bmBitsPixel / 8; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { //pData在此没给出获取方法,网上都是关联HDC来获取,不爽, //具体是用GetDIBits函数从HBITMAP里拷贝一份内存出来 BYTE *color3 = pData + j * bm.bmWidthBytes + i * pixelBytes; DWORD byte0 = *color3; DWORD byte1 = *(color3 + 1); DWORD byte2 = *(color3 + 2); COLORREF color4 = (byte0 << 16) | (byte1 << 8) | byte2; ::SetPixel(hDC, i, height - j, color4); } } |