0

我知道以前有人问过与这篇文章相关的问题,但我无法找到明确的答案。我是 Android 的初学者,如果有人能逐步帮助我,我将不胜感激。我必须构建一个应用程序,打开一个相机并将其预览帧传递给 Zxing。Zxing 必须处理这些帧中的每一个,并找出其中是否存在二维码。我有这个代码片段,它解码存储在 SD 卡中的图像。

Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image2.png");
    TextView textv = (TextView) findViewById(R.id.mytext);
    View webbutton=findViewById(R.id.webbutton);
    LuminanceSource source = new RGBLuminanceSource(bMap); 
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    Reader reader = new MultiFormatReader();
    try {
         Result result = reader.decode(bitmap);
         Global.text = result.getText(); 
            byte[] rawBytes = result.getRawBytes(); 
            BarcodeFormat format = result.getBarcodeFormat(); 
            ResultPoint[] points = result.getResultPoints();
            textv.setText(Global.text);
            webbutton.setOnClickListener(this);
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ChecksumException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FormatException e) {
        // TODO Auto-generated catch block
e.printStackTrace();


    }   
}

我需要将它与预览回调集成,以便解码器获取预览帧而不是 SD 卡图像。谁能告诉我该怎么做?任何示例代码都会有很大帮助。谢谢,

4

3 回答 3

2

这差不多。您不能使用RGBLuminanceSource,因为它是用于 JavaSE。你需要PlanarYUVLuminanceSource.

您还需要处理这些异常。QRCodeReader如果您只是扫描二维码,则可以使用。

查看 Barcode Scanner 的源代码,尤其是 DecodeHandler的源代码。这显示了您如何与预览框架进行交互。或者至少是一种方式。

于 2012-05-28T17:47:14.747 回答
0

首先你必须打电话给画廊。为此使用此代码。

private void callGallery() {
    if(newBitmap!=null){
    imageView=null;
}
 Intent intent = new Intent();
 intent.setType("image/*");
 intent.setAction(Intent.ACTION_GET_CONTENT);
 startActivityForResult(Intent.createChooser(intent,
         "Select Picture"), SELECT_PICTURE);
}

并在 onActivityResult

 if (requestCode == SELECT_PICTURE) {
      if (resultCode == RESULT_OK) {

         Uri selectedImageUri = intent.getData();
         //OI FILE Manager
         filemanagerstring = selectedImageUri.getPath();
         //MEDIA GALLERY
         selectedImagePath = getPath(selectedImageUri);
         scanQRImage(selectedImagePath);
     }
  }
protected void scanQRImage(String imagePath) {
    // TODO Auto-generated method stub

      BitmapFactory.Options options = new BitmapFactory.Options();
      options.inScaled = true;
      options.inDensity = 240;// previously it was 240
      options.inTargetDensity = 240;//previously it was 240

      Bitmap bMap = scaleImage(imagePath);

      ImageView view = (ImageView) findViewById(R.id.image_view);
        view.setImageBitmap(bMap);

      LuminanceSource source = new RGBLuminanceSource(bMap); 
      BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
      Reader reader = new MultiFormatReader();

      try {

           Result result = reader.decode(bitmap);
           String contents = result.getText(); 
              byte[] rawBytes = result.getRawBytes(); 
              BarcodeFormat format = result.getBarcodeFormat(); 
              ResultPoint[] points = result.getResultPoints();

您将在内容字符串中获得结果。

于 2012-05-29T12:49:35.123 回答
0
public void onPreviewFrame(byte[] data, Camera arg1) {
                FileOutputStream outStream = null;
                try {
                    YuvImage yuvimage = new YuvImage(data,ImageFormat.NV21,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height,null);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    yuvimage.compressToJpeg(new Rect(0,0,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height), 80, baos);

                    outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
                    outStream.write(baos.toByteArray());
                    outStream.close();

                    Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                }
                Preview.this.invalidate();
            }

“onPreviewFrame() 提供的 byte[] 数据实际上是无用的,因为没有有效的方法可以转换为 Android 其余部分可以理解的格式” - https://code.google.com/p/android/issues/详细信息?id=823

所以继续在 onPreview 中将你的字节转换为 YuvImage

于 2015-06-11T07:39:42.177 回答