android在lcd屏显示图像算法

直接上代码,有不懂的可以看注释,或者评论

  public static final  int kc = 128;//这个值是动态的 根据屏的高得来的  必须是8(一个字节8位)的倍数  比如高在120      public static int[] convertToBW(Bitmap bmp) {
        int width = bmp.getWidth(); // 获取位图的宽
        int height = bmp.getHeight(); // 获取位图的高
        //width:250 height:122
        int[] pixels = new int[width * height]; // 通过位图的大小创建像素点数组
        int add = 0;
        if(height > kc){
            height = kc;//8- height%8;
        }else {
            add = kc - height;
        }
        int[] array = new int[(height + add) * width];
        bmp.getPixels(pixels, 0, width, 0, 0, width, height);
        int alpha = 0xFF << 24;
        int next = 0;
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                //    Log.e(TAG, "J:" + j + " i:" + i + " width * i:" + (width * i + j));
                int grey = pixels[width * j + i];
                int red = ((grey & 0x00FF0000) >> 16);
                int green = ((grey & 0x0000FF00) >> 8);
                int blue = (grey & 0x000000FF);
                grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11);
                if(i<120 && j>80){//这里是为了做区域划分,让黑白临界值不同,这样让对比度有区别,比如条形码区域对比度要设置低点,否则会出现线重合在一起,以至于不能读出来。 而文字需要对比度高一点,这个需要更具自己图片对应区域坐标和类型进行改变 。
                    if (grey <= 80) {
                        grey = 0;//0是黑色
                    } else {
                        grey = 1;//1是白色
                    }
                }else {
                    if (grey <= 220) {//这里的80(grey <= 80)和 220是用来做黑白临界值的,这个值越大,黑的就越多,可能就会出现字体显示毛边的情况,而这个值越小会出现字体显示不清晰的情况。
                        grey = 0;
                    } else {
                        grey = 1;
                    }
                }
                next = (height + add) * i + j;
                array[next] = grey;
                // grey = alpha | (grey << 16) | (grey << 8) | grey;
                //pixels[height * i + j] = grey;
            }
            for (int c = 1; c < add + 1; c++) {
                int temp = next + c;
                array[temp] = 1;
            }
        }
        /*Bitmap newBmp = Bitmap.createBitmap(width, height + add, Bitmap.Config.RGB_565);

        newBmp.setPixels(array, 0, width, 0, 0, width, height + add);

        Bitmap resizeBmp = ThumbnailUtils.extractThumbnail(newBmp, 250, height + add);
        saveBmp(resizeBmp);*/

        int[] ints = toByteArray(array);
       /* String str="";
        for(int i=0; i             str += array[i]+",";
        }*/
        // int[] ints = toByteArray(array);
        int length = ints.length;
        String str = "";
        Log.e(TAG, "glength:" + length);
        return ints;
    }

 public static int[] toByteArray(int[] array) {
        int length = array.length;
        int[] byteArray;
        byteArray = new int[4000];/这里4000是根据自己的屏的尺寸来定的
        int reallength = length / 8;
        if(reallength > 4000){
            length = 4000 * 8;
        }else {
            int templen = 4000 - reallength;
            for(int i=1 ;i < templen + 1; i++){
                byteArray[4000 - i] = 255;
            }
        }
        /*if(length%8 == 0){
           byteArray = new int[length/8];
        }else {
           byteArray = new int[length/8 + 1];
        }*/
        Log.e(TAG, "length: " + length);
        for (int i = 0, j = 0; i < length; i += 8, j++) {
            int sum = 0, a;
            for (int k = 0; k < 8; k++) {
                int temp = 1 << k;
                if (i + 7 - k < length) {
                    a = array[i + 7 - k];
                    if (a == 1) {
                        sum = sum | temp;
                    }
                } else {
                    break;
                }
            }
            byteArray[j] = sum;
        }
        return byteArray;
    }

你可能感兴趣的:(小算法)