一、说明
笔记主要是记录一些本人在开发当中的学习和使用笔记。笔记内容包含一些本人觉得重要的知识点、本人易犯的错误等。
由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!
二、笔记时间
2019年08月13日
三、简述
本文主要记录如何去除zixing生成的二维码白边。
四、详情
最近在一个项目中需要给二维码添加文字说明,当我加上文字说明后,发现二维码有白边,和理想显示效果完全不协调。
经过了解zixing生成二维码的时候会自动根据设置的宽高、内容复杂度,算出一个最佳的二维码宽高,并非我们自己设置的宽高。这样问题就出现了,zixing算出的宽高比我们自己设置的宽高要小,因此zixing的白边就出现了。
那么怎么才能去掉zixing的白边?本人尝试了很多方法。包括zixing自带的白边宽度参数,当我想当然的设置为0的时候发现并没有任何效果。最后选择根据生成的二维码重新创建一个真实宽高的二维码,用此来达到去白边的目的。
1、创建真实宽高的二维码矩阵
/**
* 删除白边
*
* @param matrix
* @return
*/
private static BitMatrix deleteWhite(BitMatrix matrix) {
int[] rec = matrix.getEnclosingRectangle();
int resWidth = rec[2] + 1;
int resHeight = rec[3] + 1;
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
resMatrix.clear();
for (int i = 0; i < resWidth; i++) {
for (int j = 0; j < resHeight; j++) {
if (matrix.get(i + rec[0], j + rec[1]))
resMatrix.set(i, j);
}
}
return resMatrix;
}
2、生成二维码bitmap图片
/**
* 生成二维码Bitmap
*
* @param content 内容
* @param widthPix 图片宽度
* @param heightPix 图片高度
*/
public static Bitmap createQRImage(String content, int widthPix, int heightPix) {
try {
if (content == null || "".equals(content)) {
return null;
}
//配置参数
Map<EncodeHintType, Object> hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//容错级别
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//设置空白边距的宽度
hints.put(EncodeHintType.MARGIN, 1); //default is 4
// 图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
bitMatrix = deleteWhite(bitMatrix);//删除白边
widthPix = bitMatrix.getWidth();
heightPix = bitMatrix.getHeight();
int[] pixels = new int[widthPix * heightPix];
// 下面这里按照二维码的算法,逐个生成二维码的图片,
// 两个for循环是图片横列扫描的结果
for (int y = 0; y < heightPix; y++) {
for (int x = 0; x < widthPix; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * widthPix + x] = 0xff000000;
} else {
pixels[y * widthPix + x] = 0xffffffff;
}
}
}
// 生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
网友评论