欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安卓系统下生成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,分别添加前景、背景两个更改按钮后,效果:

安卓系统下生成QR码(三)——自定义二维码的颜色


点击“更改”时弹出Dialog:

安卓系统下生成QR码(三)——自定义二维码的颜色


最后,根据选择的颜色值设置矩阵每个点的颜色即可:

pixels[y * width + x] = codecolor;//设置编码颜色

生成的效果:

安卓系统下生成QR码(三)——自定义二维码的颜色


当然,还能设置透明、渐变等高级效果(充分发挥你的想象力~)

安卓系统下生成QR码(三)——自定义二维码的颜色


最后,附上渐变色参考代码:

// 渐变色
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;// 背景颜色
			}
		}
	}