生产单色位图二维码

生产单色位图

对于嵌入式的开发 ,对资源的要求程度更苛刻 。 对于某些只能打印单色位图的机器 要把其他位图转换成单色位图是可以达到的,对于动态的生成一直进行转换会非常消耗资源的 。不如直接生产单色位图方便。

单色位图信息头

//我们生成正方形的单色位图
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个像素点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值