读书人

怎么生成黑白BMP

发布时间: 2012-10-12 10:17:04 作者: rapoo

如何生成黑白BMP
下面这段代码,iPixel等于16的时候,可以生成色彩bmp,可以打开,但是我想生成黑白色的bmp,我改为iPixel =4,生成的bmp出错,无法打开,麻烦看一下哪里有问题,谢谢!

CDC* dcc;
dcc = GetDesktopWindow()->GetWindowDC();
CBitmap hbitmap;//参数可选
HDC dcMem;
int iPixel = 4;
dcMem = CreateCompatibleDC(*dcc); //兼容DC
BITMAPINFO RGB16BitsBITMAPINFO;
ZeroMemory(&RGB16BitsBITMAPINFO, sizeof(BITMAPINFO));
RGB16BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RGB16BitsBITMAPINFO.bmiHeader.biWidth = 480;
RGB16BitsBITMAPINFO.bmiHeader.biHeight = 800;
RGB16BitsBITMAPINFO.bmiHeader.biPlanes = 1;//WORD biPlanes; // 目标设备的级别,必须为1(26-27字节)
RGB16BitsBITMAPINFO.bmiHeader.biBitCount = iPixel;//WORD biBitCount;// 每个像素所需的位数,必须是1(双色), 4(16色),8(256色)或24(真彩色)之一(28-29字节
RGB16BitsBITMAPINFO.bmiHeader.biClrUsed = 2;
RGB16BitsBITMAPINFO.bmiHeader.biClrImportant = 2;

BYTE *lpBitmapBits = NULL;
HBITMAP directBmp = CreateDIBSection(dcMem, (BITMAPINFO*)&RGB16BitsBITMAPINFO,
DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
HGDIOBJ previousObject = SelectObject(dcMem, directBmp);

BitBlt(dcMem, 0, 0, 480, 800, *dcc, 0, 0, SRCCOPY);
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((480*800)*iPixel/8); ///2=(16 / 8)

FILE *mStream = NULL;
if((mStream = fopen("deskmap.bmp", "wb")))
{
fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
fwrite(&(RGB16BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
fwrite(lpBitmapBits, ((480*800)*iPixel/8), 1, mStream);
fclose(mStream);
}
DeleteObject(dcMem);
DeleteObject(dcc);
DeleteObject(directBmp);
DeleteObject(previousObject);

[解决办法]
bmp二值化
[解决办法]
设置画板为双色RGB(0,0,0),RGB(255,255,255)
所有颜色黑色使用索引0,白色使用索引1
注意,这种画板生成的图像不好做成avi格式了

具体你写bmp头文件研究下头文件的数据格式就好,注意双字节对齐之后再写入头文件,不要使用默认(4字节)对齐方式

读书人网 >VC/MFC

热点推荐