实现蓝牙连接打印机打印网络图片
经过自己一下午加一个小时的时间整理出来,希望能帮助到各位码兄弟!
主要分为以下几步:
-
将网络图片URL转为bitmap :其中需要进行网络请求,不可在主线程中进行,需另起一个线程,用Handler+Message进行简单传值;
public Bitmap returnBitMap(final String url) {new Thread(new Runnable() {@Overridepublic 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 {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.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); //nLdata[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
每一个码农都闪耀着光芒!!!