0

この投稿に関連する質問が以前にも寄せられたことは知っていますが、明確な答えを見つけることができませんでした。私はAndroidの初心者です。誰かが段階的に私を助けてくれれば本当にありがたいです. カメラを開き、そのプレビュー フレームを Zxing に渡すアプリを作成する必要があります。Zxing は、これらの各フレームを処理し、QR コードが存在するかどうかを確認する必要があります。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

それはほぼ正しいです。RGBLuminanceSourceJavaSE用なので使えません。が必要PlanarYUVLuminanceSourceです。

これらの例外も処理する必要があります。QRCodeReaderQRコードをスキャンするだけの場合に使用できます。

Barcode Scanner のソース コード、特に DecodeHandler を見てください。これは、プレビュー フレームを操作する方法を示しています。または、少なくとも1つの方法です。

于 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 に答える