在图像的每个像素和二进制值中生成带有颜色的 QR 码
Generate QR Code with Colors in every pixel of image and binary value
好吧,我正在用二维码做一个项目。我的项目的想法是结合QR Code的数量(我的项目是8个QR Code)并生成一个单一颜色的QR Code,这个想法是增加QR Code的数据存储。
然而,到目前为止我已经完成了大部分部分,但我留下了最重要的部分,即生成彩色二维码。彩色二维码必须用十六进制颜色生成,并将颜色设置到二维码的每个像素,这样它就像一个彩色二维码。现在,我会尝试用红色 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;
}
我写了一些改变颜色的代码,但是代码改变了整个二维码的颜色,也就是二维码的前景和背景。
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 Code的每个像素都会变成红色(因为十六进制值不同,红色的种类会略有不同) QR Code.
如果您使用Color.parseColor(hexadecimal)
生成颜色。 hexadecimal
应该类似于 #ff00ff
RGB 格式或 #ff00ff00
ARGB 格式。
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
并且它在 hexadecimal
中是 3 而不是 03。所以我在 hexString
.
中添加“0”
好吧,我正在用二维码做一个项目。我的项目的想法是结合QR Code的数量(我的项目是8个QR Code)并生成一个单一颜色的QR Code,这个想法是增加QR Code的数据存储。
然而,到目前为止我已经完成了大部分部分,但我留下了最重要的部分,即生成彩色二维码。彩色二维码必须用十六进制颜色生成,并将颜色设置到二维码的每个像素,这样它就像一个彩色二维码。现在,我会尝试用红色 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;
}
我写了一些改变颜色的代码,但是代码改变了整个二维码的颜色,也就是二维码的前景和背景。
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 Code的每个像素都会变成红色(因为十六进制值不同,红色的种类会略有不同) QR Code.
如果您使用Color.parseColor(hexadecimal)
生成颜色。 hexadecimal
应该类似于 #ff00ff
RGB 格式或 #ff00ff00
ARGB 格式。
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
并且它在 hexadecimal
中是 3 而不是 03。所以我在 hexString
.