Android 蓝牙连接打印机打印网络图片

实现蓝牙连接打印机打印网络图片

	经过自己一下午加一个小时的时间整理出来,希望能帮助到各位码兄弟!

主要分为以下几步:

  1. 将网络图片URL转为bitmap :其中需要进行网络请求,不可在主线程中进行,需另起一个线程,用Handler+Message进行简单传值;

     public Bitmap returnBitMap(final String url) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                URL myFileUrl = null;
                try {
                    myFileUrl = new URL(url);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                try {
                    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
                    conn.setDoInput(true);
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    bitmap = BitmapFactory.decodeStream(is);
                    is.close();
    
                    Message message = new Message();
                    Bundle bundle = new Bundle();
                    message.setData(bundle);//bundle传值,耗时,效率低
                    handler.sendMessage(message);//发送message信息
                    message.what = 1;//标志是哪个线程传数据
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        Log.e("daduhui", "url转bitmap");
    
        return bitmap;
    };
    
    
     //接受message的信息
     class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            if (msg.what == 1) {
                imageView.setImageBitmap(bitmap);
                byte[] printData =
                        null;
                try {
                    printData = draw2PxPoint(compressPic(bitmap));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
     }
    
  2. 对图片进行压缩(去除透明度):

    public static Bitmap compressPic(Bitmap bitmap) {
    	// 获取这个图片的宽和高
    	int width = bitmap.getWidth();
    	int height = bitmap.getHeight();
    	// 指定调整后的宽度和高度
    	int newWidth = 100;
    	int newHeight = 100;
    	Bitmap targetBmp = Bitmap.createBitmap(newWidth, newHeight, 	Bitmap.Config.ARGB_8888);
    	Canvas targetCanvas = new Canvas(targetBmp);
    	targetCanvas.drawColor(0xffffffff);
    	targetCanvas.drawBitmap(bitmap, new Rect(0, 0, width, height), new Rect(0, 0, newWidth, newHeight), null);
     	return targetBmp;
    }
    
  3. 灰度图片黑白化,黑色是1,白色是0 :

        /**
    *      * 灰度图片黑白化,黑色是1,白色是0
    *      *
    *      * @param x   横坐标
    *      * @param y   纵坐标
    *      * @param bit 位图
    *      * @return
    *      
    */
       public static byte px2Byte(int x, int y, Bitmap bit) {
           if (x < bit.getWidth() && y < bit.getHeight()) {
               byte b;
               int pixel = bit.getPixel(x, y);
               int red = (pixel & 0x00ff0000) >> 16; // 取高两位
               int green = (pixel & 0x0000ff00) >> 8; // 取中两位
               int blue = pixel & 0x000000ff; // 取低两位
               int gray = RGB2Gray(red, green, blue);
               if (gray < 128) {
                   b = 1;
               } else {
                   b = 0;
               }
               return b;
           }
           return 0;
       }
    
       /**
        * 图片灰度的转化
        *      
        */
       private static int RGB2Gray(int r, int g, int b) {
           int gray = (int) (0.29900 * r + 0.58700 * g + 0.11400 * b); //灰度转化公式
           return gray;
       }
    
  4. 把一张Bitmap图片转化为打印机可以打印的字节流:

       public byte[] draw2PxPoint(Bitmap bmp) throws IOException {
    
       //用来存储转换后的 bitmap 数据。为什么要再加1000,这是为了应对当图片高度无法
       //整除24时的情况。比如bitmap 分辨率为 240 * 250,占用 7500 byte,
       //但是实际上要存储11行数据,每一行需要 24 * 240 / 8 =720byte 的空间。再加上一些指令存储的开销,
       //所以多申请 1000byte 的空间是稳妥的,不然运行时会抛出数组访问越界的异常。
       int size = bmp.getWidth() * bmp.getHeight() / 8 + 1000;
       byte[] data = new byte[size];
       int k = 0;
       //设置行距为0的指令
       data[k++] = 0x1B;
       data[k++] = 0x33;
       data[k++] = 0x00;
       // 逐行打印
       for (int j = 0; j < bmp.getHeight() / 24f; j++) {
           //打印图片的指令
           data[k++] = 0x1B;
           data[k++] = 0x2A;
           data[k++] = 33;
           data[k++] = (byte) (bmp.getWidth() % 256); //nL
           data[k++] = (byte) (bmp.getWidth() / 256); //nH
           //对于每一行,逐列打印
           for (int i = 0; i < bmp.getWidth(); i++) {
               //每一列24个像素点,分为3个字节存储
               for (int m = 0; m < 3; m++) {
                   //每个字节表示8个像素点,0表示白色,1表示黑色
                   for (int n = 0; n < 8; n++) {
                       byte b = px2Byte(i, j * 24 + m * 8 + n, bmp);
                       data[k] += data[k] + b;
                   }
                   k++;
               }
           }
           data[k++] = 10;//换行
       }
       return data;
    }
    

后记

写的一般,如果有什么疑问,可以联系我:QQ935020635
每一个码农都闪耀着光芒!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值