在图像的每个像素和二进制值中生成带有颜色的QR码

时间:2019-03-08 05:43:38

标签: android colors qr-code

嗯,我正在使用QR码进行项目。我的项目的想法是将QR码的数量(我的项目的8个QR码)组合在一起,并生成一个单色的QR码,这是为了增加QR码的数据存储量。

但是,到目前为止,我已经完成了大部分内容,但是我留下了最重要的部分,它是生成彩色QR码。颜色QR码必须使用十六进制颜色生成,并将颜色设置为QR码的每个像素,因此就象颜色QR码一样。现在,我将尝试生成红色1st。

因此,我已将binary值存储在ArrayList中,并且数据类似于10101010。然后将其更改为十六进制。这是我的代码:

 ArrayList<String>arrayList = new ArrayList<>();
 arrayList.add(a1+a2+a3+a4+a5+a6+a7+a8); // Store 1110001 into ArrayList
 String [] hexArray = new String[arrayList.size()];
                    arrayList.toArray(hexArray);


 for(int a = 0; a < hexArray.length; a++){
     int dec = Integer.parseInt(String.valueOf(arrayList.get(a)),2);
     String hexString = Integer.toString(dec, 16);
     String alpha = "0xff";
     String behind = "0000";
     hexArray[a] = alpha+hexString+behind;
 }

我已经编写了一些更改颜色的代码,但是该代码正在更改QR Code的整个颜色,这也是QR Code的背景和背景。

 private Bitmap encode(String contents, int width, int height, @ColorInt int foreground, @ColorInt int background) {

    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix matrix = null;
    Bitmap bitmap = null;

    try {
        matrix = writer.encode(contents, BarcodeFormat.QR_CODE, width, height);
    } catch (WriterException e) {
        e.printStackTrace();
    }

    if(matrix != null) {
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = matrix.get(x, y) ? foreground : background;
            }
        }
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    }

    return bitmap;
}

由于ARGB具有Alpha,红色,绿色,蓝色。 那如果我要将十六进制值仅设置为红色该怎么办。然后,将QR码的每个像素设置为红色(由于十六进制值不同,红色会有所不同)。

1 个答案:

答案 0 :(得分:1)

如果您使用<string | void>生成颜色。 Color.parseColor(hexadecimal)应该类似于hexadecimal RGB格式或#ff00ff ARGB格式。

#ff00ff00

为便于参考,我添加了 for(int a = 0; a < hexArrayRed.length; a++){ int dec = Integer.parseInt(String.valueOf(arrayList.get(a)),2); String hexString = Integer.toString(dec, 16); while(hexString.length() < 2){ hexString = "0"+hexString; } String head = "#ff"; String behind = "0000"; hexArrayRed[a] = head+hexString+behind; /* Red Hexadecimal Value --> #ff _ _ 0000 */ } 语句以确保while的长度。如果二进制文件是hexString,并且在00000011中是3而不是03。那么我在hexadecimal上加上“ 0”。