2016-08-02 112 views
-2

我正在研究涉及扫描条形码的应用程序。到目前为止,我已经成功使用相机预览按照以下方式扫描条形码。链接https://github.com/ZBar/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"); 
    } 
}} 

回答

0

Zbar库使您的工作在继承所有的相机功能更容易。不过,您仍然可以使用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);