1.了解光栅打印指令
xh yh 有时候这些限制是吹大了,特别是打印一维码和二维码 是吹大了这些值没有什么用..看m 这个取值就行了 0就是正常打印1 倍宽 宽度增加一倍;如图0 是上面,1 是下面.
2.图片数据解析时是高位在前低位在后 msb 指的是高位 打印的点为1 不打印为0;
3.看程序
/**
* @param bitmap
* @return 将图片转数组
*/
public static byte[] parseBmpToByte(Bitmap bitmap) {
int scaleHeight = bitmap.getHeight();
//宽度要是8的倍数
int bitWidth = (bitmap.getWidth()+7)/8*8;
int width=bitmap.getWidth();
int data[] = new int[width * scaleHeight];
byte dataVec[] = new byte[bitWidth * scaleHeight/8+8];
long start=System.currentTimeMillis();
dataVec[0] = 29;
dataVec[1] = 118;
dataVec[2] = 48;
dataVec[3] = 0;
dataVec[4] = (byte) (bitWidth / 8 % 256);
dataVec[5] = (byte) (bitWidth / 8 / 256);
dataVec[6] = (byte) (scaleHeight % 256);
dataVec[7] = (byte) (scaleHeight / 256);
int k=8;
bitmap.getPixels(data,0,width,0,0,width,scaleHeight);
for (int h=0;h<scaleHeight;h++){
for (int w=0;w<bitWidth;w+=8){
int value=0;
for (int i = 0; i <8 ; i++) {
int index=h*width+w+i;
if (w+i>=width){
// 超度图片的大小零填充
value|=0;
}else {
//这里就是高低在前低位在后
value|=px2Byte(data[index])<<(7-i);
}
}
dataVec[k++]= (byte) value;
}
}
return dataVec;
}
public static byte px2Byte(int pixel) {
byte b;
int red = (pixel & 0x00ff0000) >> 16; // 取高两位
int green = (pixel & 0x0000ff00) >> 8; // 取中两位
int blue = pixel & 0x000000ff; // 取低两位
int gray = RGB2Gray(red, green, blue);
if (gray < 127) {
b = 1;
} else {
b = 0;
}
return b;
}
ps:这里并没有对 透明处理,如果你需要自己处理