下面列出了怎么用com.google.zxing.RGBLuminanceSource的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public ReadableMap decodeRGBBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
bitmap.recycle();
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
WritableMap result = null;
try {
Result decodeResult = mReader.decode(bBitmap, mHints);
result = Arguments.createMap();
result.putInt("format", symbolToFormat(decodeResult.getBarcodeFormat()));
result.putString("content", decodeResult.getText());
} catch (NotFoundException ignored) {
}
return result;
}
public Result decodeWithZxing(Bitmap bitmap) {
MultiFormatReader multiFormatReader = new MultiFormatReader();
multiFormatReader.setHints(changeZXingDecodeDataMode());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
Result rawResult = null;
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
rawResult = multiFormatReader.decodeWithState(binaryBitmap);
} catch (ReaderException re) {
// continue
} finally {
multiFormatReader.reset();
}
return rawResult;
}
public String decodeWithZxing(Bitmap bitmap) {
MultiFormatReader multiFormatReader = new MultiFormatReader();
multiFormatReader.setHints(changeZXingDecodeDataMode());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
Result rawResult = null;
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
if (source != null) {
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
rawResult = multiFormatReader.decodeWithState(binaryBitmap);
} catch (ReaderException re) {
// continue
} finally {
multiFormatReader.reset();
}
}
return rawResult != null ? rawResult.getText() : null;
}
public String decode(final Bitmap image){
final long start = System.currentTimeMillis();
final int width = image.getWidth(), height = image.getHeight();
final int[] pixels = new int[width * height];
image.getPixels(pixels, 0, width, 0, 0, width, height);
final RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
final BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
Result rawResult = mMultiFormatReader.decodeWithState(bitmap);
final long end = System.currentTimeMillis();
Log.d(TAG, "QRCode decode in " + (end - start) + "ms");
Log.d(TAG, rawResult.toString());
return rawResult.getText();
} catch (NotFoundException re) {
Log.w(TAG, re);
return null;
}finally {
mMultiFormatReader.reset();
}
}
/**
* 使用RGB解析bitmap
*
* @param data
* @param width
* @param height
* @param hintTypeMap
* @return
*/
private Result decodeFromRGB(int[] data, int width, int height, Map<DecodeHintType, ?> hintTypeMap) {
RGBLuminanceSource source = new RGBLuminanceSource(width, height, data);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
return new MultiFormatReader().decode(binaryBitmap, hintTypeMap);
} catch (NotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 解析二维码图片
* @param bitmap 待解析的二维码图片
* @param qrScanCallBack 解析结果回调
*/
public static void decodeQRCode(final Bitmap bitmap, final QRScanCallBack qrScanCallBack) {
if (bitmap == null) {
if (qrScanCallBack != null) {
qrScanCallBack.onResult(false, null, new Exception("bitmap is null"));
}
return;
}
// 开始解析
DevThreadManager.getInstance(5).execute(new Runnable() {
@Override
public void run() {
try {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
Result result = new MultiFormatReader().decode(new BinaryBitmap(new HybridBinarizer(source)), DECODE_HINTS);
// 触发回调
if (qrScanCallBack != null) {
qrScanCallBack.onResult((result != null), result, null);
}
} catch (Exception e) {
LogPrintUtils.eTag(TAG, e, "decodeQRCode");
// 触发回调
if (qrScanCallBack != null) {
qrScanCallBack.onResult(false, null, e);
}
}
}
});
}
public Result[] zxing( Mat inputImage ) throws ChecksumException, FormatException {
int w = inputImage.width();
int h = inputImage.height();
Mat southEast;
if (mBugRotate) {
southEast = inputImage.submat(h-h/4 , h , 0 , w/2 - h/4 );
} else {
southEast = inputImage.submat(0, h / 4, w / 2 + h / 4, w);
}
Bitmap bMap = Bitmap.createBitmap(southEast.width(), southEast.height(), Bitmap.Config.ARGB_8888);
org.opencv.android.Utils.matToBitmap(southEast, bMap);
southEast.release();
int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];
//copy pixel data from the Bitmap into the 'intArray' array
bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(),intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result[] results = {};
try {
results = qrCodeMultiReader.decodeMultiple(bitmap);
}
catch (NotFoundException e) {
}
return results;
}
public String parse(InputStream imageStream) {
final Bitmap bMap = BitmapFactory.decodeStream(imageStream);
String contents = null;
int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];
bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(), intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Map<DecodeHintType, Object> tmpHintsMap = new EnumMap<DecodeHintType, Object>(
DecodeHintType.class);
tmpHintsMap.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
tmpHintsMap.put(DecodeHintType.POSSIBLE_FORMATS,
EnumSet.allOf(BarcodeFormat.class));
tmpHintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE);
Reader reader = new MultiFormatReader();
Result result = null;
try {
result = reader.decode(bitmap, tmpHintsMap);
contents = result.getText();
} catch (NotFoundException | ChecksumException | FormatException e) {
e.printStackTrace();
}
return contents;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_SELECT_PICTURE) {
final Uri selectedUri = data.getData();
if (selectedUri != null) {
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedUri);
if (bitmap != null) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] dataArr = new int[width * height];
bitmap.getPixels(dataArr, 0, width, 0, 0, width, height);
Decoder decoder = new Decoder(new MultiFormatReader());
Result result = decoder.decode(new RGBLuminanceSource(width, height, dataArr));
if (result != null) {
BrowserActivity.start(this, result.getText());
} else {
SnackbarUtil.show(this, "这个码真扫不了");
}
bitmap.recycle();
} else {
SnackbarUtil.show(this, "这个码真扫不了");
}
} catch (Exception e) {
SnackbarUtil.show(this, "这个码真扫不了");
}
} else {
SnackbarUtil.show(this, "这个码真扫不了");
}
}
}
/**
* Decode barcode from RGB pixels array
*
* @param pixels Colors in standard Android ARGB format
* @param width Image width
* @param height Image height
* @param hints Decoder hints
* @return Decode result, if barcode was decoded successfully, {@code null} otherwise
* @see DecodeHintType
* @see Color
*/
@Nullable
public static Result decodeRgb(@NonNull final int[] pixels, final int width, final int height,
@Nullable final Map<DecodeHintType, ?> hints) {
Objects.requireNonNull(pixels);
final MultiFormatReader reader = createReader(hints);
try {
return Utils
.decodeLuminanceSource(reader, new RGBLuminanceSource(width, height, pixels));
} catch (final ReaderException e) {
return null;
}
}
private void onScanImageResult(Intent intent) {
Uri inputFile = (intent.getData());
Bitmap bitmap;
try {
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
try (InputStream inputStream = getContentResolver().openInputStream(inputFile)) {
bitmap = BitmapFactory.decodeStream(inputStream, null, bmOptions);
}
int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
Reader reader = new MultiFormatReader();
Result result = reader.decode(binaryBitmap);
GoogleAuthInfo info = GoogleAuthInfo.parseUri(result.getText());
VaultEntry entry = new VaultEntry(info);
startEditEntryActivity(CODE_ADD_ENTRY, entry, true);
} catch (NotFoundException | IOException | ChecksumException | FormatException | GoogleAuthInfoException e) {
e.printStackTrace();
Dialogs.showErrorDialog(this, R.string.unable_to_read_qrcode, e);
}
}
protected Result scanningImage(String path) {
if (StringUtil.isBlank(path)) {
return null;
}
// DecodeHintType 和EncodeHintType
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); // 设置二维码内容的编码
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 先获取原大小
scanBitmap = BitmapFactory.decodeFile(path, options);
options.inJustDecodeBounds = false; // 获取新的大小
int sampleSize = (int) (options.outHeight / (float) 200);
if (sampleSize <= 0)
sampleSize = 1;
options.inSampleSize = sampleSize;
scanBitmap = BitmapFactory.decodeFile(path, options);
int width = scanBitmap.getWidth(), height = scanBitmap.getHeight();
int[] pixels = new int[width * height];
scanBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
scanBitmap.recycle();
scanBitmap = null;
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
try {
return reader.decode(bitmap1, hints);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public Result[] zxing( Mat inputImage ) throws ChecksumException, FormatException {
int w = inputImage.width();
int h = inputImage.height();
Mat southEast;
if (mBugRotate) {
southEast = inputImage.submat(h-h/4 , h , 0 , w/2 - h/4 );
} else {
southEast = inputImage.submat(0, h / 4, w / 2 + h / 4, w);
}
Bitmap bMap = Bitmap.createBitmap(southEast.width(), southEast.height(), Bitmap.Config.ARGB_8888);
org.opencv.android.Utils.matToBitmap(southEast, bMap);
southEast.release();
int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];
//copy pixel data from the Bitmap into the 'intArray' array
bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(),intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result[] results = {};
try {
results = qrCodeMultiReader.decodeMultiple(bitmap);
}
catch (NotFoundException ignored) {
}
return results;
}
/**
* 直接识别二维码位图
*
* @param bitmap 二维码位图
* @return 二维码包含的内容
*/
public static String recognizeQrCode(Bitmap bitmap)
{
if (bitmap == null)
return null;
Hashtable<DecodeHintType, String> hints = new Hashtable<>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); // 设置二维码内容的编码
//获取图片的像素存入到数组
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
RGBLuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), pixels);
BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
try
{
Result result = reader.decode(bitmap1, hints);
if (reader == null)
{
return null;
} else
{
String str = result.toString();
boolean ISO = Charset.forName("ISO-8859-1").newEncoder().canEncode(str);
if (ISO)
str = new String(str.getBytes("ISO-8859-1"), "GB2312");
return str;
}
} catch (Exception e)
{
Log.e("QrCodeHelper", "recognizeQrCode fail:" + e.toString());
}
return null;
}
/**
* {@link Bitmap} から {@link LuminanceSource} を作成します.
*
* @param bitmap カメラのプレビュー画像
* @return {@link LuminanceSource} のインスタンス
*/
private LuminanceSource createLuminanceSource(final Bitmap bitmap) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] intArray = new int[w * h];
bitmap.getPixels(intArray, 0, w, 0, 0, w, h);
return new RGBLuminanceSource(w, h, intArray);
}
public static Observable<Result> scanFromPicture(String path) {
return Observable.fromCallable(() -> {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = calculateInSampleSize(options, QR_CODE_IN_SAMPLE_LENGTH,
QR_CODE_IN_SAMPLE_LENGTH);
options.inJustDecodeBounds = false;
int[] pixels = null;
QRCodeReader reader = new QRCodeReader();
int retryTimes = 0;
Result result = null;
while (result == null && retryTimes < MAX_RETRY_TIMES) {
Bitmap picture = BitmapFactory.decodeFile(path, options);
int width = picture.getWidth();
int height = picture.getHeight();
if (pixels == null) {
pixels = new int[picture.getWidth() * picture.getHeight()];
}
picture.getPixels(pixels, 0, width, 0, 0, width, height);
picture.recycle();
LuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
result = reader.decode(bitmap, TRY_HARDER);
} catch (NotFoundException | ChecksumException | FormatException ignored) {
retryTimes++;
options.inSampleSize *= 2;
}
}
reader.reset();
return result;
}).flatMap(result -> {
if (result == null) {
return Observable.error(NotFoundException.getNotFoundInstance());
}
return Observable.just(result);
});
}
@ReactMethod
public void decode(String path, Callback callback) {
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); // 设置二维码内容的编码
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 先获取原大小
options.inJustDecodeBounds = false; // 获取新的大小
int sampleSize = (int) (options.outHeight / (float) 200);
if (sampleSize <= 0)
sampleSize = 1;
options.inSampleSize = sampleSize;
Bitmap scanBitmap = null;
if (path.startsWith("http://")||path.startsWith("https://")) {
scanBitmap = this.getbitmap(path);
} else {
scanBitmap = BitmapFactory.decodeFile(path, options);
}
if (scanBitmap == null) {
callback.invoke("cannot load image");
return;
}
int[] intArray = new int[scanBitmap.getWidth()*scanBitmap.getHeight()];
scanBitmap.getPixels(intArray, 0, scanBitmap.getWidth(), 0, 0, scanBitmap.getWidth(), scanBitmap.getHeight());
RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap.getWidth(), scanBitmap.getHeight(), intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
try {
Result result = reader.decode(bitmap, hints);
if (result == null) {
callback.invoke("image format error");
} else {
callback.invoke(null, result.toString());
}
} catch (Exception e) {
callback.invoke("decode error");
}
}
@SuppressLint("StaticFieldLeak")
private void scanImage(final Uri uri) {
if (progressDialog != null) return;
progressDialog = new ProgressDialogBuilder(this)
.setTitle(R.string.please_wait)
.setMessage(R.string.qr_scan_processing)
.setCancelable(false)
.show();
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... voids) {
UniFile file = UniFile.fromUri(QRCodeScanActivity.this, uri);
if (file == null) return null;
// ZXing can't process large image
Bitmap bitmap = BitmapUtils.decodeStream(new UniFileInputStreamPipe(file), 1024, 1024);
if (bitmap == null) return null;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
bitmap.recycle();
int[] newPixels = null;
for (int i = 0; i < 4; i++) {
if (i > 0) {
newPixels = BitmapUtils.rotate(pixels, width, height, newPixels);
int temp = width;
width = height;
height = temp;
int[] tempPixels = pixels;
pixels = newPixels;
newPixels = tempPixels;
}
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
final HybridBinarizer hybBin = new HybridBinarizer(source);
final BinaryBitmap bBitmap = new BinaryBitmap(hybBin);
QRCodeReader reader = new QRCodeReader();
Map<DecodeHintType, Boolean> hints = new HashMap<>();
try {
return reader.decode(bBitmap, hints).getText();
} catch (NotFoundException | FormatException | ChecksumException e) {
// Try PURE_BARCODE
hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
reader.reset();
try {
return reader.decode(bBitmap, hints).getText();
} catch (NotFoundException | FormatException | ChecksumException ee) {
// pass
}
}
}
return null;
}
@Override
protected void onPostExecute(String text) {
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}
if (text != null) {
processCookieText(text);
} else {
Toast.makeText(QRCodeScanActivity.this, R.string.qr_scan_invalid, Toast.LENGTH_SHORT).show();
}
}
}.execute();
}