安卓系统下生成QR码(三)——自定义二维码的颜色
程序员文章站
2022-07-13 15:55:06
...
Zxing在安卓系统下生成二维码图片的大致过程:
1.创建二维数组
2.进行编码,得到01字符流,将字符流添加到二维数组里
3.将数组转化为图片
我们可以在转化图片这一步改变图片的颜色:
BitMatrix matrix = null;
QRCodeWriter CodeWriter = new QRCodeWriter();
matrix = CodeWriter.encode(content, CODE_WIDTH, CODE_WIDTH, hints);
int width = matrix.getWidth();
int height = matrix.getHeight();
// 二维矩阵转为一维像素数组
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (matrix.get(x, y)) {
pixels[y * width + x] = codecolor;//设置编码颜色
} else {
pixels[y * width + x] = imgbgrcolor;//设置背景颜色
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);
// 通过像素数组生成bitmap,具体参考api
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
BitMatrix表示图片数组,codecolor和imgbgrcolor分别表示编码颜色和背景颜色。颜色的选择上,可由一个Diaog实现,本文的Diaog参考了http://blog.csdn.net/xiaoke815/article/details/15335013的颜色选择方法。
//颜色选择
public void change_code_color() {
new ColorPickDialog.Builder(MainActivity.this)
.setTitle("选择一种颜色:")
.setColors(styleColors)
.setOnColorClickListener(
new ColorPickDialog.ColorClickListener() {
@Override
public void onColorClick(int color) {
display_color1.setBackgroundColor(color);
codecolor = color;
}
}).create().show();
}
其中,styleColors是颜色数组:
int[] styleColors = new int[] {
0x00000000, 0xffff0000, 0xffeb4310,0xfff6941d, 0xfffbb417,
0xff000000, 0xffffff00, 0xffcdd541,0xff99cc33, 0xff3f9337,
0xff404040, 0xff219167, 0xff239676,0xff24998d, 0xff229cab,
0xffb0b0b0, 0xff0080ff, 0xff3366cc,0xff333399, 0xff003366,
0xffffffff, 0xff800080, 0xffa1488e,0xffc71585, 0xffbd2158 };
display_color1是显示颜色的一个View,分别添加前景、背景两个更改按钮后,效果:
点击“更改”时弹出Dialog:
最后,根据选择的颜色值设置矩阵每个点的颜色即可:
pixels[y * width + x] = codecolor;//设置编码颜色
生成的效果:
当然,还能设置透明、渐变等高级效果(充分发挥你的想象力~)
最后,附上渐变色参考代码:
// 渐变色
int ra = (codecolor & 0xff0000) >> 16;
int ga = (codecolor & 0x00ff00) >> 8;
int ba = (codecolor & 0x0000ff);
float rb = (imgbgrcolor & 0xff0000) >> 16;
float gb = (imgbgrcolor & 0x00ff00) >> 8;
float bb = (imgbgrcolor & 0x0000ff);
for (int y = 0; y < matrix.getHeight(); y++) {
for (int x = 0; x < matrix.getWidth(); x++) {
if (matrix.get(x, y)) {// 二维码颜色
int red = (int) (ra - (ra - rb) / height * (y + 1));
int green = (int) (ga - (ga - gb) / height * (y + 1));
int blue = (int) (ba - (ba - bb) / height * (y + 1));
Color color = new Color();
int colorInt = color.argb(255, red, green, blue);
// 修改二维码的颜色,可以分别制定二维码和背景的颜色
pixels[y * width + x] = matrix.get(x, y) ? colorInt: 16777215;// 0x000000:0xffffff
} else {
pixels[y * width + x] = 0x00ffffff;// 背景颜色
}
}
}
上一篇: 使用POI导出Excel
下一篇: HSSF XSSF SXSSF