Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capturing image from camera, results in blowing up the orientation

I am trying to capture image from the camera, it works fine with landscape mode, when I take the picture in portrait it is rotated. Below is the code I am using:

            BitmapFactory.Options bounds = new BitmapFactory.Options();
            bounds.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(largeImagePath, bounds);

            Bitmap bm = BitmapFactory.decodeFile(largeImagePath, opts);
            ExifInterface exif = new ExifInterface(largeImagePath);
            String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
            System.out.println("Orientation camera:"+orientString);
            int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL;
            int rotationAngle = 0;
            if (orientation == ExifInterface.ORIENTATION_ROTATE_90){
                rotationAngle = 90;




                System.out.println("In 90 degrees rotate");
            }
            if (orientation == ExifInterface.ORIENTATION_ROTATE_180){ 
                rotationAngle = 180;
                System.out.println("In 180 degrees rotate");
            }
            if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                rotationAngle = 270;
                System.out.println("In 270 degrees rotate");
            }

            Matrix matrix = new Matrix();
            System.out.println("Rotation Angle"+rotationAngle);
            matrix.setRotate(rotationAngle, (float) thumbnail.getWidth() / 2, (float) thumbnail.getHeight() / 2);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true); 

On Debug, the control enters the :

if (orientation == ExifInterface.ORIENTATION_ROTATE_90){
                rotationAngle = 90;}

block, however no rotation to set the picture back to correct happens.

This is my XML:

<ImageView
        android:id="@+id/imageView1"
        android:layout_width="140dp"
        android:layout_height="160dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="30dp"
        android:src="@drawable/btn_upload" />

UPDATE: I am getting the following exception:

02-27 13:51:55.126: I/System.out(16549): Exceptionjava.lang.IllegalArgumentException: x + width must be <= bitmap.width()
like image 286
User3 Avatar asked Dec 27 '25 20:12

User3


2 Answers

you can arrange your code as follow...

    Bitmap bm = BitmapFactory.decodeFile(largeImagePath, opts);
    ExifInterface ei;
    try {
        ei = new ExifInterface(largeImagePath);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            bitmap = rotateImage(bitmap, 90);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            bitmap = rotateImage(bitmap, 180);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            bitmap = rotateImage(bitmap, 270);
            break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

write rotateImage() method as follows....

private Bitmap rotateImage(Bitmap source, float angle) {

    Bitmap bitmap = null;
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    try {
        bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                matrix, true);
    } catch (OutOfMemoryError err) {
        err.printStackTrace();
    }
    return bitmap;
}
like image 130
Hamid Shatu Avatar answered Dec 30 '25 22:12

Hamid Shatu


Use bm.getWidth() and bm.getHeight() instead bounds.outWidth and bounds.outHeight in createBitmap() method.

like image 41
Roman Black Avatar answered Dec 31 '25 00:12

Roman Black



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!