Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Facing Orientation issue with Camera captured image on Android phones

Tags:

android

I am using exifInterface for photo rotation issue code is below: Facing captured image orientation issue from camera.

  • Create a Bitmap from the file
Bitmap b = BitmapFactory.decodeFile(imagePath);
  • Resize the Bitmap by scaling it to appropriate level
int width = b.getWidth();
int height = b.getHeight();
int newWidth = 150;
int newHeight = 150;
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, width, height, matrix, true);
// resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);
  • Handle orientation of the image
 ExifInterface exif = new ExifInterface(imagePath);
    String orientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
    if (orientation.equals(ExifInterface.ORIENTATION_NORMAL)) {
            // Do nothing. The original image is fine.
    } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_90+"")) {
            matrix.postRotate(90);
    } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_180+"")) {
            matrix.postRotate(180);
    } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_270+"")) {
            matrix.postRotate(270);
}
  • Save the new bitmap
 out = new FileOutputStream(new File("some output file path"));
    Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, width, height, matrix, true);
    resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);

This code not working for resolve rotation issue, please give me guideline. On Lg devices it's exifinterface always returning 0 orientation, Samsung devices returning 6 and 1.

How to fix this issue with all the devices like htc, Motorola, samsung , Sony and LG.

I am thankful to you all please help me.

like image 798
user991429 Avatar asked Sep 06 '12 12:09

user991429


1 Answers

You can use this function to do the same thing you require. Have this function in your activity or any util class and call it to get bitmap from file path.

I have been using this function in my application and my prime testing devices are LG.

public static Bitmap decodeFile(String path) {
    int orientation;
    try {
        if (path == null) {
            return null;
        }
        // decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        // Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE = 70;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 8;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
                    || height_tmp / 2 < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale++;
        }
        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        Bitmap bm = BitmapFactory.decodeFile(path, o2);
        Bitmap bitmap = bm;

        ExifInterface exif = new ExifInterface(path);
        orientation = exif
                .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
        Log.e("orientation", "" + orientation);
        Matrix m = new Matrix();

        if ((orientation == 3)) {
            m.postRotate(180);
            m.postScale((float) bm.getWidth(), (float) bm.getHeight());
            // if(m.preRotate(90)){
            Log.e("in orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), m, true);
            return bitmap;
        } else if (orientation == 6) {
            m.postRotate(90);
            Log.e("in orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), m, true);
            return bitmap;
        }
        else if (orientation == 8) {
            m.postRotate(270);
            Log.e("in orientation", "" + orientation);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), m, true);
            return bitmap;
        }
        return bitmap;
    } catch (Exception e) {
    }
    return null;
}
like image 124
MKJParekh Avatar answered Sep 29 '22 06:09

MKJParekh