package com.zxing.scanner.decode; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; import java.util.ArrayList; import java.util.EnumMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Vector; public class DecodeImgThread extends Thread { public static final Map HINTS = new EnumMap<>(DecodeHintType.class); static { List formats = new ArrayList(); formats.add(BarcodeFormat.QR_CODE); HINTS.put(DecodeHintType.POSSIBLE_FORMATS, formats); HINTS.put(DecodeHintType.CHARACTER_SET, "utf-8"); } // private Bitmap scanBitmap; /*回调*/ private DecodeImgCallback callback; public DecodeImgThread(String imgPath, DecodeImgCallback callback) { this.scanBitmap = getBitmap(imgPath,400,400); this.callback = callback; } public DecodeImgThread(Bitmap bitmap, DecodeImgCallback callback) { this.scanBitmap = bitmap; this.callback = callback; } @Override public void run() { super.run(); if (scanBitmap == null || callback == null) { return; } MultiFormatReader multiFormatReader = new MultiFormatReader(); // 解码的参数 Hashtable hints = new Hashtable<>(2); // 可以解析的编码类型 Vector decodeFormats = new Vector<>(); if (decodeFormats == null || decodeFormats.isEmpty()) { decodeFormats = new Vector<>(); // 扫描的类型 一维码和二维码 decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS); decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS); } hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); // 设置解析的字符编码格式为UTF8 hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); // 设置解析配置参数 multiFormatReader.setHints(hints); // 开始对图像资源解码 Result rawResult = null; try { rawResult = multiFormatReader.decodeWithState(new BinaryBitmap(new HybridBinarizer(new BitmapLuminanceSource(scanBitmap)))); Log.i("解析结果", rawResult.getText()); } catch (Exception e) { e.printStackTrace(); } if (rawResult != null) { callback.onImageDecodeSuccess(rawResult.getText()); } else { callback.onImageDecodeFailed(); } } /** * 根据路径获取图片 * * @param filePath 文件路径 * @param maxWidth 图片最大宽度 * @param maxHeight 图片最大高度 * @return bitmap */ public static Bitmap getBitmap(final String filePath, final int maxWidth, final int maxHeight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); options.inSampleSize = calculateInSampleSize(options, maxWidth, maxHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filePath, options); } /** * Return the sample size. * * @param options The options. * @param maxWidth The maximum width. * @param maxHeight The maximum height. * @return the sample size */ private static int calculateInSampleSize(final BitmapFactory.Options options, final int maxWidth, final int maxHeight) { int height = options.outHeight; int width = options.outWidth; int inSampleSize = 1; while ((width >>= 1) >= maxWidth && (height >>= 1) >= maxHeight) { inSampleSize <<= 1; } return inSampleSize; } }