如何使用捕获图像的位图扫描QR码?

时间:2014-09-09 08:48:44

标签: android bitmap zxing

我在QR码项目中工作。我用ZXING库生成QR码。我想在我的应用程序中扫描QR码。但为此,我使用自己的自定义相机。在我的相机中,我捕获了图像并创建了捕获图像的位图。是否可以通过调用ZXING库的解码函数并在其中传递该位图或byte []来使用该位图扫描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());
        }
    }
};

1 个答案:

答案 0 :(得分: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;
    }
}