All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.zxing.client.android.decode.DecodeUtils Maven / Gradle / Ivy

/*
 * Copyright (c) 2015 [[email protected] | [email protected]]
 *
 * Licensed under the Apache License, Version 2.0 (the "License”);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.zxing.client.android.decode;

import android.graphics.Bitmap;
import android.graphics.Rect;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;

import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.Map;

/**
 * Author:  Tau.Chen
 * Email:   [email protected] | [email protected]
 * Date:    15/7/23
 * Description:
 */
public class DecodeUtils {

    public static final int DECODE_MODE_ZBAR = 10001;
    public static final int DECODE_MODE_ZXING = 10002;

    public static final int DECODE_DATA_MODE_ALL = 10003;
    public static final int DECODE_DATA_MODE_QRCODE = 10004;
    public static final int DECODE_DATA_MODE_BARCODE = 10005;

    private int mDataMode;
    private ImageScanner mImageScanner;

    static {
        System.loadLibrary("iconv");
    }

    public DecodeUtils(int dataMode) {
        mImageScanner = new ImageScanner();
        mImageScanner.setConfig(0, Config.X_DENSITY, 3);
        mImageScanner.setConfig(0, Config.Y_DENSITY, 3);
        mDataMode = (dataMode != 0) ? dataMode : DECODE_DATA_MODE_ALL;
    }

    public String decodeWithZbar(byte[] data, int width, int height, Rect crop) {
        changeZBarDecodeDataMode();

        Image barcode = new Image(width, height, "Y800");
        barcode.setData(data);
        if (null != crop) {
            barcode.setCrop(crop.left, crop.top, crop.width(), crop.height());
        }

        int result = mImageScanner.scanImage(barcode);
        String resultStr = null;

        if (result != 0) {
            SymbolSet syms = mImageScanner.getResults();
            for (Symbol sym : syms) {
                resultStr = sym.getData();
            }
        }

        return resultStr;
    }

    public String decodeWithZxing(byte[] data, int width, int height, Rect crop) {
        MultiFormatReader multiFormatReader = new MultiFormatReader();
        multiFormatReader.setHints(changeZXingDecodeDataMode());

        Result rawResult = null;
        PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height,
                crop.left, crop.top, crop.width(), crop.height(), false);

        if (source != null) {
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            try {
                rawResult = multiFormatReader.decodeWithState(bitmap);
            } catch (ReaderException re) {
                // continue
            } finally {
                multiFormatReader.reset();
            }
        }

        return rawResult != null ? rawResult.getText() : null;
    }

    public String decodeWithZbar(Bitmap bitmap) {
        changeZBarDecodeDataMode();

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Image barcode = new Image(width, height, "Y800");

        int size = width * height;
        int[] pixels = new int[size];
        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
        byte[] pixelsData = new byte[size];
        for (int i = 0; i < size; i++) {
            pixelsData[i] = (byte) pixels[i];
        }

        barcode.setData(pixelsData);

        int result = mImageScanner.scanImage(barcode);
        String resultStr = null;

        if (result != 0) {
            SymbolSet syms = mImageScanner.getResults();
            for (Symbol sym : syms) {
                resultStr = sym.getData();
            }
        }

        return resultStr;
    }

    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;
    }

    private Map changeZXingDecodeDataMode() {
        Map hints = new EnumMap(DecodeHintType.class);
        Collection decodeFormats = new ArrayList();

        switch (mDataMode) {
            case DECODE_DATA_MODE_ALL:
                decodeFormats.addAll(DecodeFormatManager.getBarCodeFormats());
                decodeFormats.addAll(DecodeFormatManager.getQrCodeFormats());
                break;

            case DECODE_DATA_MODE_QRCODE:
                decodeFormats.addAll(DecodeFormatManager.getQrCodeFormats());
                break;

            case DECODE_DATA_MODE_BARCODE:
                decodeFormats.addAll(DecodeFormatManager.getBarCodeFormats());
                break;
        }
        hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);

        return hints;
    }

    private void changeZBarDecodeDataMode() {
        switch (mDataMode) {
            case DECODE_DATA_MODE_ALL:
                mImageScanner.setConfig(Symbol.NONE, Config.ENABLE, 1);
                break;

            case DECODE_DATA_MODE_QRCODE:
                mImageScanner.setConfig(Symbol.NONE, Config.ENABLE, 0);
                // bar code
                mImageScanner.setConfig(Symbol.I25, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.CODABAR, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.CODE128, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.CODE39, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.CODE93, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.DATABAR, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.DATABAR_EXP, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.EAN13, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.EAN8, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.ISBN10, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.ISBN13, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.UPCA, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.UPCE, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.PARTIAL, Config.ENABLE, 0);
                // qr code
                mImageScanner.setConfig(Symbol.QRCODE, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.PDF417, Config.ENABLE, 1);

                break;

            case DECODE_DATA_MODE_BARCODE:
                mImageScanner.setConfig(Symbol.NONE, Config.ENABLE, 0);
                // bar code
                mImageScanner.setConfig(Symbol.I25, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.CODABAR, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.CODE128, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.CODE39, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.CODE93, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.DATABAR, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.DATABAR_EXP, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.EAN13, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.EAN8, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.ISBN10, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.ISBN13, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.UPCA, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.UPCE, Config.ENABLE, 1);
                mImageScanner.setConfig(Symbol.PARTIAL, Config.ENABLE, 1);
                // qr code
                mImageScanner.setConfig(Symbol.QRCODE, Config.ENABLE, 0);
                mImageScanner.setConfig(Symbol.PDF417, Config.ENABLE, 0);

                break;
        }
    }

    public int getDataMode() {
        return mDataMode;
    }

    public void setDataMode(int dataMode) {
        this.mDataMode = dataMode;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy