使用zbar扫描条形码图像?

时间:2016-08-02 01:44:03

标签: java android camera barcode-scanner zbar

我正在处理涉及扫描条形码的应用程序。到目前为止,我已成功使用相机预览扫描条形码,如下所示。链接https://github.com/ZBar/ZBar

然而,它的工作方式并不能真正满足我的需求。该示例使用了相机预览。但是在我的项目应用程序中,我有一个应用程序,允许用户通过单击按钮(Intent)访问摄像机。

之后,它将捕获的图像转换为字节数组。

无论如何使用启用Zbar来扫描图像(字节数组)?或者无论如何使用Zbar与Android的相机而不是相机预览?

谢谢。

这是我的MainActivity.java,允许用户通过意图访问相机。

public class MainActivity extends Activity {

Button cameraBtn;
final int REQUEST_IMAGE_CAPTURE = 1;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    cameraBtn = (Button)findViewById(R.id.cameraBtn);

    cameraBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
        }
    });
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
    }
}}

1 个答案:

答案 0 :(得分:0)

Zbar libs通过继承所有相机功能,使您的工作更轻松。但是,您仍然可以使用Zbar api创建自己的Camera / CameraPreview来扫描条形码。

下面的代码段解释了Zbar如何扫描每个帧的条形码。 onPreviewFrame回调会为您提供相机拍摄的每个帧。

public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Parameters parameters = camera.getParameters();
            Size size = parameters.getPreviewSize();

            Image barcode = new Image(size.width, size.height, "Y800");
            barcode.setData(data);

            int result = scanner.scanImage(barcode);
            if (result != 0) {
                SymbolSet syms = scanner.getResults();
                for (Symbol sym : syms) {
                    Log.v("", sym.getData());
                }
            }
}

在这里,您需要创建自己的相机活动,该活动会覆盖onPreviewFrame callabck。此外,您需要加载iconv库(Zlib的一部分),实例化Scanner实例。

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

ImageScanner scanner = new ImageScanner();
scanner.setConfig(0, Config.X_DENSITY, 3);
scanner.setConfig(0, Config.Y_DENSITY, 3);