原创首发
如何自己封装高效解析和生成二维码的工具类

准备工作
我们需要导入谷歌的 ZXing.jar 包,此步详细操作略过。
编写二维码解析和识别的工具类
//在代码块中保留导包代码的原因是防止同学们导错包之类的,也是为了同学们鱼块的Copy这个工具类。
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
import android.widget.ImageView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import java.util.HashMap;
public class QRCodeUtil {
private static final String TAG = "QRCodeUtil";
/**
* 根据内容获取到Bitmap二维码
*
* @param width 宽度
* @param height 高度
* @param content 内容
* @return QrBitmap
*/
public static Bitmap createQRCode(int width, int height, String content) throws Exception {
Log.d(TAG, "createQRCode: =========" + content);
QRCodeWriter qrCodeWriter = new QRCodeWriter();
HashMap<EncodeHintType, String> map = new HashMap<>();
//设置二维码内容编码的格式(如果不设置成utf-8识别时可能会乱码)
map.put(EncodeHintType.CHARACTER_SET, "utf-8");
//解析成 BitMatrix 对象,编码形式为 BarcodeFormat.QR_CODE --> 二维码
BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, map);
//创建像素数组
int[] pixels = new int[width * height];
//生成二维码的固定算法
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
//如果这个像素块有内容,则填充黑色,否则填充白色(这样生成出来就是黑白二维码,你也可以换成其他颜色)
pixels[i * width + j] = bitMatrix.get(i, j) ? Color.BLACK : Color.WHITE;
}
}
//创建 Bitmap 对象,并设置图片参数
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//设置 Bitmap 中的像素数据
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
/**
* 用于解析二维码内容的方法
*
* @param imageView ImageView
* @return content 识别后的内容
* @throws Exception
*/
public static String parseQRCode(ImageView imageView) throws Exception {
Bitmap qrCode = ((BitmapDrawable) (imageView).getDrawable()).getBitmap(); //将图片bitmap化
int width = qrCode.getWidth();
int height = qrCode.getHeight();
//创建像素数组
int[] pixels = new int[width * height];
//得到像素,这个方法必须执行,否则识别不出来内容
qrCode.getPixels(pixels, 0, width, 0, 0, width, height);
//RGBLuminanceSource对象
RGBLuminanceSource source = new RGBLuminanceSource(qrCode);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
//解码 BinaryBitmap 对象并获取其中的内容
String result = reader.decode(binaryBitmap).getText();
return result;
}
public static class RGBLuminanceSource extends LuminanceSource {
private byte mBitmapPixels[];
protected RGBLuminanceSource(Bitmap bitmap) {
super(bitmap.getWidth(), bitmap.getHeight());
// 首先,要取得该图片的像素数组内容
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
mBitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, getWidth(), 0, 0, getWidth(), getHeight());
// 将int数组转换为byte数组,也就是取像素值中黑色值部分作为辨析内容
for (int i = 0; i < pixels.length; i++) {
mBitmapPixels[i] = (byte) pixels[i];
}
}
@Override
public byte[] getMatrix() {
// 返回我们生成好的像素数据
return mBitmapPixels;
}
@Override
public byte[] getRow(int y, byte[] row) {
// 这里要得到指定行的像素数据
System.arraycopy(mBitmapPixels, y * getWidth(), row, 0, getWidth());
return row;
}
}
}
食用方式
//生成二维码 Bitmap 对象
Bitmap qrCode = QRCodeUtil.createQRCode(500, 500, "这是二维码的内容");
//转换成 Drawable 对象
BitmapDrawable drawable = new BitmapDrawable(getResources(), qrCode);
//给 ImageView 设置图像数据
ivQRCode.setImageDrawable(drawable);
//解析二维码,此处需要传入带有二维码的 ImageView 对象
String result = QRCodeUtil.parseQRCode(ivQRCode);
结束语
以上就是全部内容啦,同学们使用时可以直接复制粘贴,通过自己封装一下可以将二维码的识别效率提高,因为我们只识别二维码,所以效率会有明显的提升,当然ZXing还支持条形码等的识别哦~
请同学们点赞、评论、打赏+关注啦~
本文由
A lonely cat
原创发布于
阳光沙滩
,未经作者授权,禁止转载