该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
bmp是从jpg转来的,已经获取句柄为hBmp,但是它转换来的总是和屏幕的颜色尾数相同(比如我屏幕是16位增强色他也是16位的,我屏幕是真彩色他就成了32位的)。
这个函数返回一个void*,指向的是所有像素的RGB值线性排列。那么就必须先转成24位RGB才行。问题是这个转换有问题:
// hBmp: bmp句柄// ret: 返回值对象,其中数据位于ret->data
void* buffer = new unsigned char[bmpsize*3];
if(!buffer){
DeleteObject(hBmp);
delete ret;
return NULL;
}
// 向buffer中保存bmp的像素信息。
if(bm.bmBitsPixel != 24){
// 如果不是24位RGB需要先转换成24位RGB。
BITMAPINFO bi;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biClrImportant = 0;
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biHeight = bm.bmHeight;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biSizeImage = 0;
bi.bmiHeader.biWidth = bm.bmWidth;
bi.bmiHeader.biXPelsPerMeter = 0;
bi.bmiHeader.biYPelsPerMeter = 0;
HDC hScrDC = GetDC(NULL);
HDC hMemDC = CreateCompatibleDC(hScrDC);
void* newbuffer;
HBITMAP hBmpTemp = CreateDIBSection(hScrDC, &bi, DIB_RGB_COLORS, &newbuffer, NULL, 0);
//HBITMAP hBmpTemp = CreateCompatibleBitmap(hMemDC, bm.bmHeight, bm.bmWidth);
if(!hBmpTemp){
DeleteObject(hBmp);
delete ret;
return NULL;
}
SelectObject(hScrDC, hBmp);
SelectObject(hMemDC, hBmpTemp);
BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hScrDC, 0, 0, SRCCOPY);
GetBitmapBits(hBmpTemp, bmpsize*3, buffer);
DeleteObject(hBmpTemp);
DeleteObject(hBmp);
} else {
// 如果是24位RGB可以直接保存。
GetBitmapBits(hBmp, bmpsize*3, buffer);
DeleteObject(hBmp);
}