package com.dahanis.utils.bluetoothprinter; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; import android.graphics.Paint; class ImageProcessing { // 转成灰度图 public static Bitmap toGrayscale(Bitmap bmpOriginal) { int width, height; height = bmpOriginal.getHeight(); width = bmpOriginal.getWidth(); Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas c = new Canvas(bmpGrayscale); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f); c.drawBitmap(bmpOriginal, 0, 0, paint); return bmpGrayscale; } // 缩放,暂时需要public以便调试,完成之后不用这个。 public static Bitmap resizeImage(Bitmap bitmap, int w, int h) { // load the origial Bitmap Bitmap BitmapOrg = bitmap; int width = BitmapOrg.getWidth(); int height = BitmapOrg.getHeight(); int newWidth = w; int newHeight = h; // calculate the scale float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // create a matrix for the manipulation Matrix matrix = new Matrix(); // resize the Bitmap matrix.postScale(scaleWidth, scaleHeight); // if you want to rotate the Bitmap // matrix.postRotate(45); // recreate the new Bitmap Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width, height, matrix, true); // make a Drawable from Bitmap to allow to set the Bitmap // to the ImageView, ImageButton or what ever return resizedBitmap; } // 16*16 private static int[][] Floyd16x16 = /* Traditional Floyd ordered dither */ { { 0, 128, 32, 160, 8, 136, 40, 168, 2, 130, 34, 162, 10, 138, 42, 170 }, { 192, 64, 224, 96, 200, 72, 232, 104, 194, 66, 226, 98, 202, 74, 234, 106 }, { 48, 176, 16, 144, 56, 184, 24, 152, 50, 178, 18, 146, 58, 186, 26, 154 }, { 240, 112, 208, 80, 248, 120, 216, 88, 242, 114, 210, 82, 250, 122, 218, 90 }, { 12, 140, 44, 172, 4, 132, 36, 164, 14, 142, 46, 174, 6, 134, 38, 166 }, { 204, 76, 236, 108, 196, 68, 228, 100, 206, 78, 238, 110, 198, 70, 230, 102 }, { 60, 188, 28, 156, 52, 180, 20, 148, 62, 190, 30, 158, 54, 182, 22, 150 }, { 252, 124, 220, 92, 244, 116, 212, 84, 254, 126, 222, 94, 246, 118, 214, 86 }, { 3, 131, 35, 163, 11, 139, 43, 171, 1, 129, 33, 161, 9, 137, 41, 169 }, { 195, 67, 227, 99, 203, 75, 235, 107, 193, 65, 225, 97, 201, 73, 233, 105 }, { 51, 179, 19, 147, 59, 187, 27, 155, 49, 177, 17, 145, 57, 185, 25, 153 }, { 243, 115, 211, 83, 251, 123, 219, 91, 241, 113, 209, 81, 249, 121, 217, 89 }, { 15, 143, 47, 175, 7, 135, 39, 167, 13, 141, 45, 173, 5, 133, 37, 165 }, { 207, 79, 239, 111, 199, 71, 231, 103, 205, 77, 237, 109, 197, 69, 229, 101 }, { 63, 191, 31, 159, 55, 183, 23, 151, 61, 189, 29, 157, 53, 181, 21, 149 }, { 254, 127, 223, 95, 247, 119, 215, 87, 253, 125, 221, 93, 245, 117, 213, 85 } }; // 8*8 private static int[][] Floyd8x8 = { { 0, 32, 8, 40, 2, 34, 10, 42 }, { 48, 16, 56, 24, 50, 18, 58, 26 }, { 12, 44, 4, 36, 14, 46, 6, 38 }, { 60, 28, 52, 20, 62, 30, 54, 22 }, { 3, 35, 11, 43, 1, 33, 9, 41 }, { 51, 19, 59, 27, 49, 17, 57, 25 }, { 15, 47, 7, 39, 13, 45, 5, 37 }, { 63, 31, 55, 23, 61, 29, 53, 21 } }; // 4*4 @SuppressWarnings("unused") private static int[][] Floyd4x4 = { { 0, 8, 2, 10 }, { 12, 4, 14, 6 }, { 3, 11, 1, 9 }, { 15, 7, 13, 5 } }; /** * 将256色灰度图转换为2值图 * * @param orgpixels * @param xsize * @param ysize * @param despixels */ public static void format_K_dither16x16(int[] orgpixels, int xsize, int ysize, byte[] despixels) { int k = 0; for (int y = 0; y < ysize; y++) { for (int x = 0; x < xsize; x++) { if ((orgpixels[k] & 0xff) > Floyd16x16[x & 15][y & 15]) despixels[k] = 0;// black else despixels[k] = 1; k++; } } } /** * 将256色灰度图转换为2值图 * * @param orgpixels * @param xsize * @param ysize * @param despixels */ public static void format_K_dither8x8(int[] orgpixels, int xsize, int ysize, byte[] despixels) { int k = 0; for (int y = 0; y < ysize; y++) { for (int x = 0; x < xsize; x++) { if (((orgpixels[k] & 0xff) >> 2) > Floyd8x8[x & 7][y & 7]) despixels[k] = 0;// black else despixels[k] = 1; k++; } } } public static void format_K_threshold(int[] orgpixels, int xsize, int ysize, byte[] despixels) { int graytotal = 0; int grayave = 128; int i, j; int gray; int k = 0; for (i = 0; i < ysize; i++) { for (j = 0; j < xsize; j++) { gray = orgpixels[k] & 0xff; graytotal += gray; k++; } } grayave = graytotal / ysize / xsize; // 二值化 k = 0; for (i = 0; i < ysize; i++) { for (j = 0; j < xsize; j++) { gray = orgpixels[k] & 0xff; if (gray > grayave) despixels[k] = 0;// white else despixels[k] = 1; k++; } } } /* * 对灰度图(ARGB_8888)执行平均阀值算法(滤去0和255不考虑) * * 可以先调用toGrayscale从彩色图片生成灰度图 再调用该函数,将灰度图片转成2值图片 */ public static void format_K_threshold(Bitmap mBitmap) { int graytotal = 0; int grayave = 128; int graycnt = 1; int gray; int ysize = mBitmap.getHeight(); int xsize = mBitmap.getWidth(); int i, j; for (i = 0; i < ysize; ++i) { for (j = 0; j < xsize; ++j) { gray = mBitmap.getPixel(j, i) & 0xFF; if (gray != 0 && gray != 255) { graytotal += gray; ++graycnt; } } } grayave = graytotal / graycnt; // 根据前面的计算,求得一个平均阀值 for (i = 0; i < ysize; i++) { for (j = 0; j < xsize; j++) { gray = mBitmap.getPixel(j, i) & 0xFF; if (gray > grayave) mBitmap.setPixel(j, i, Color.WHITE); else mBitmap.setPixel(j, i, Color.BLACK); } } } public static Bitmap alignBitmap(Bitmap bitmap, int wbits, int hbits, int color) { // 已经是对齐的,可以直接返回。 if ((bitmap.getWidth() % wbits == 0) && (bitmap.getHeight() % hbits == 0)) return bitmap; int width = bitmap.getWidth(); int height = bitmap.getHeight(); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); int newwidth = (width + wbits - 1) / wbits * wbits; int newheight = (height + hbits - 1) / hbits * hbits; int[] newpixels = new int[newwidth * newheight]; Bitmap newbitmap = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888); for (int i = 0; i < newheight; ++i) { for (int j = 0; j < newwidth; ++j) { if ((i < height) && (j < width)) newpixels[i * newwidth + j] = pixels[i * width + j]; else newpixels[i * newwidth + j] = color; } } newbitmap.setPixels(newpixels, 0, newwidth, 0, 0, newwidth, newheight); return newbitmap; } }