实现蓝牙连接打印机打印网络图片
经过自己一下午加一个小时的时间整理出来,希望能帮助到各位码兄弟!
主要分为以下几步:
-
将网络图片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(); } } } }
-
对图片进行压缩(去除透明度):
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; }
-
灰度图片黑白化,黑色是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; }
-
把一张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
每一个码农都闪耀着光芒!!!