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

准备工作
我们需要导入谷歌的 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
          原创发布于
          阳光沙滩
          ,未经作者授权,禁止转载
        
 

 A lonely cat  回复 @断点-含光君
 A lonely cat  回复 @断点-含光君  拉大锯  回复 @断点-含光君
 拉大锯  回复 @断点-含光君 
















