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<DecodeHintType, Object> HINTS = new EnumMap<>(DecodeHintType.class);
|
static {
|
List<BarcodeFormat> formats = new ArrayList<BarcodeFormat>();
|
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<DecodeHintType, Object> hints = new Hashtable<>(2);
|
// 可以解析的编码类型
|
Vector<BarcodeFormat> 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;
|
}
|
|
}
|