2014-09-09 3 views
1

Я работаю над проектом QR-кодов. Я использовал библиотеку ZXING для генерации QR-кодов. Я хочу отсканировать QR-код в своем приложении. Но для этого я использую свою собственную пользовательскую камеру. В моей камере я снял изображение и создал растровое изображение захваченного изображения. Возможно ли использовать это растровое изображение для сканирования QR-кодов, вызывая функции декодирования библиотеки ZXING и передавая в нем растровое изображение или байт []? Я буду благодарен вам за помощь. Вот моя реализация,Как использовать растровое изображение захваченного изображения для сканирования QR-кода?

public void onCreate(Bundle savedInstanceState) { 

    // TODO OnCreate Method 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_layout); 
    cameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
    activity = this; 
    filepath = Environment.getExternalStorageDirectory(); 

    if (checkCameraHardware(this)) { 

     // Create an instance of Camera 
     mCamera = getCameraInstance(); 

     setCameraDisplayOrientation(this, cameraId, mCamera); 

     try { 
      // Get Camera Parameters 
      Camera.Parameters params = mCamera.getParameters(); 
      // Set the Focus Mode 
      params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 

      mCamera.setParameters(params); 
      Toast.makeText(getApplicationContext(), "Camera Available", 
        Toast.LENGTH_LONG).show(); 

      mPreview = new CameraPreview(this, mCamera); 

      FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview); 
      preview.addView(mPreview); 

     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), 
        "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 

    } else { 

     Toast.makeText(getApplicationContext(), "Camera Not Available", 
       Toast.LENGTH_LONG).show(); 
    } 

    Button captureButton = (Button) findViewById(R.id.button_capture); 
    captureButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // get an image from the camera 
      mCamera.takePicture(null, null, mPicture); 
     } 
    }); 
} 

@Override 
protected void onPause() { 
    // TODO OnPause Method 
    super.onPause(); 
    releaseCamera(); 
} 

// TODO Detecting Camera Hardware 
private boolean checkCameraHardware(Context context) { 
    if (context.getPackageManager().hasSystemFeature(
      PackageManager.FEATURE_CAMERA)) { 
     // This device has camera 
     return true; 
    } else { 
     // No Camera on this Device 
     return false; 
    } 
} 

// TODO Accessing Camera 
public static Camera getCameraInstance() { 
    Camera c = null; 

    try { 
     c = Camera.open(); 
    } catch (Exception e) { 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 

private PictureCallback mPicture = new PictureCallback() { 

    @SuppressLint("InlinedApi") 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     // TODO Takes the picture and write to file 

     File pictureFile = getOutputMediaFile(FileColumns.MEDIA_TYPE_IMAGE); 

     if (pictureFile == null) { 
      Log.d("PICFILE", 
        "Error creating media file, check storage permissions"); 
      return; 
     } 

     try { 
      Bitmap bmp = BitmapFactory 
        .decodeByteArray(data, 0, data.length); 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
      updateGallery(); 

      // Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, 
      // data.length); 
      Intent i = new Intent(getApplicationContext(), 
        TestActivity.class); 
      i.putExtra("Image", data); 
      startActivity(i); 
     } catch (Exception e) { 
      Log.d("IOEXCEPTION", "Error accessing file: " + e.getMessage()); 
     } 
    } 
}; 

ответ

0

Да, вы можете использовать метод декодирования. Проверьте приведенный ниже код для реализации.

String detectBarCode(Bitmap bitmap) { 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()]; 
    bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray); 
    Reader reader = new QRCodeReader(); 
    try { 
     Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(source))); 
     return result.getText(); 
    } catch (NotFoundException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (ChecksumException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (FormatException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
Смежные вопросы