打印光栅位图

  • Post author:
  • Post category:其他


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:这里并没有对 透明处理,如果你需要自己处理