生产单色位图
对于嵌入式的开发 ,对资源的要求程度更苛刻 。 对于某些只能打印单色位图的机器 要把其他位图转换成单色位图是可以达到的,对于动态的生成一直进行转换会非常消耗资源的 。不如直接生产单色位图方便。
单色位图信息头
//我们生成正方形的单色位图
int iexwidth = width;
if(width % 8){
iexwidth += 8;
}
iexwidth /= 8;
int lineByte = (iexwidth + 3) & ~0x03;
BITMAPFILEHEADER bitMapFileHeader;
bitMapFileHeader.bfType = 0x4D42;
bitMapFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) + lineByte * height;
bitMapFileHeader.bfReserved1 = 0;
bitMapFileHeader.bfReserved2 = 0;
bitMapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD);
BITMAPINFOHEADER bitMapInfoHeader;
bitMapInfoHeader.biSize = 40;
bitMapInfoHeader.biWidth = width;
bitMapInfoHeader.biHeight = height;
bitMapInfoHeader.biPlanes = 1;
bitMapInfoHeader.biBitCount = biCount;
bitMapInfoHeader.biCompression = 0;
bitMapInfoHeader.biSizeImage = 296;
bitMapInfoHeader.biXPelsPerMeter = 0; ,
bitMapInfoHeader.biYPelsPerMeter = 0;
bitMapInfoHeader.biClrUsed = 0;
bitMapInfoHeader.biClrImportant = 0;
// 下面一段是 调色板 单色位图有俩种 2的位图位数次方个
RGBQUAD bitMapRGBQuad1,bitMapRGBQuad2 ;
bitMapRGBQuad2.rgbBlue = 0xff;
bitMapRGBQuad2.rgbGreen = 0xff;
bitMapRGBQuad2.rgbRed = 0xff;
bitMapRGBQuad2.rgbReserved = 0;
memset(&bitMapRGBQuad1,0,sizeof(bitMapRGBQuad2));
fwrite(&bitMapFileHeader, sizeof(BITMAPFILEHEADER), 1, pf);
fwrite(&bitMapInfoHeader, sizeof(BITMAPINFOHEADER), 1, pf);
fwrite(&bitMapRGBQuad1, sizeof(RGBQUAD), 1, pf);
fwrite(&bitMapRGBQuad2, sizeof(RGBQUAD), 1, pf);
unsigned char * pBMPData = (unsigned char *)malloc(lineByte * height);//new unsigned char[lineByte * height];
memset(pBMPData, 0, lineByte * height);
写入信息到二维码
pBMPData 就是数据来源;
for (i=0; i < height; i++){
for( j = 0; j < width; j++){
ibit = j % 8; //哪一位 单色位图就是哪一位
ibyte = j / 8; //确认字节
if((*(qrData) & 1) == 0 ){
*(pBMPData + lineByte * i + ibyte) |= ((unsigned char)(0x80 >> ibit));
}
qrData++;
}
}
因为单色位图一位表示一个像素点 ,一位char类型数据就表示8个像素点
。