Santhosh
Santhosh

Reputation: 5016

Captured Photo orientation is changing in android

I'am opening camera app on click of a button. And displaying the captured photo in next activity. But the captured photo is rotating by 90 degrees. When I display the image in a view after I capture it, it's orientation is always landscape. Why is the photo not being shown in portrait as is when the photo is taken in portrait mode?

onClick of a button :

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png")));       
startActivityForResult(i, CAPTURE_PHOTO_CONSTANT);

Inside onActvityresult:

bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png");
startActivity(new Intent(this, DisplayActivity.class));

Displaying captured photo:

photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp));

Upvotes: 10

Views: 35515

Answers (5)

Jaydeep Khambhayta
Jaydeep Khambhayta

Reputation: 5279

call this method with path of bitmap and bitmap

   getRotateImage(path, bm)

Add getRotateImage method as static in any util class and use it.

public static Bitmap getRotateImage(String photoPath, Bitmap bitmap) throws IOException {
        ExifInterface ei = new ExifInterface(photoPath);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_UNDEFINED);

        Bitmap rotatedBitmap = null;
        switch (orientation) {

            case ExifInterface.ORIENTATION_ROTATE_90:
                rotatedBitmap = rotateImage(bitmap, 90);
                break;

            case ExifInterface.ORIENTATION_ROTATE_180:
                rotatedBitmap = rotateImage(bitmap, 180);
                break;

            case ExifInterface.ORIENTATION_ROTATE_270:
                rotatedBitmap = rotateImage(bitmap, 270);
                break;

            case ExifInterface.ORIENTATION_NORMAL:
            default:
                rotatedBitmap = bitmap;
        }

        return rotatedBitmap;

    }


  public static Bitmap rotateImage(Bitmap source, float angle) {
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                matrix, true);
    }

Upvotes: 4

Sundus
Sundus

Reputation: 468

Please use Glide instead. It fixes the orientation itself and is irrespective of the mobile you're using. Here\s a sample

Glide.with(_c).load(horizontalList.get(position).imagePath).into(holder.img_injury);

Upvotes: 3

Shabbir Panjesha
Shabbir Panjesha

Reputation: 1939

I had the same problem mostly with the Samsung handsets.Apparently Samsung phones set the EXIF orientation tag, rather than rotating individual pixels.Reading the Bitmap using BitmapFactory does not support this tag.What i found the solution to this problem was using ExifInterface in onActivityResult method of the activity.Which checks for orientation associated with URI of the captured image from the camera.

                        int rotate = 0;
                        try {
                            getContentResolver().notifyChange(imageUri, null);
                            File imageFile = new File(imagePath);
                            ExifInterface exif = new ExifInterface(
                                    imageFile.getAbsolutePath());
                            int orientation = exif.getAttributeInt(
                                    ExifInterface.TAG_ORIENTATION,
                                    ExifInterface.ORIENTATION_NORMAL);

                            switch (orientation) {
                            case ExifInterface.ORIENTATION_ROTATE_270:
                                rotate = 270;
                                break;
                            case ExifInterface.ORIENTATION_ROTATE_180:
                                rotate = 180;
                                break;
                            case ExifInterface.ORIENTATION_ROTATE_90:
                                rotate = 90;
                                break;
                            }
                            Log.v(Common.TAG, "Exif orientation: " + orientation);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        /****** Image rotation ****/
                        Matrix matrix = new Matrix();
                        matrix.postRotate(orientation);
                        Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true);

Upvotes: 17

Bob Richardson
Bob Richardson

Reputation: 51

I got it somewhat working. When I take the photo in Landscape mode everything works fine as before. If I take the photo in portrait mode, I need to turn the camera upside down and the pic looks good. If you notice I changed your code a bit by adding the "ExifInterface" in front of each orientation. I used the following code:

    try {
      ExifInterface exif = new ExifInterface(filename); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
                          ExifInterface.ORIENTATION_NORMAL);
      int rotate = 0;
         switch(orientation) {
            case  ExifInterface.ORIENTATION_ROTATE_270:
                 rotate-=90;break;
            case  ExifInterface.ORIENTATION_ROTATE_180:
                 rotate-=90;break;
            case  ExifInterface.ORIENTATION_ROTATE_90:
                 rotate-=90;break;
            }
              Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate);
         } catch (IOException e) {
             Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e);
         }

Upvotes: 1

Dheeresh Singh
Dheeresh Singh

Reputation: 15701

you can just simpaly rotate it

get the orietation of the image taken using this code in onActvityresult ....

File imageFile = new File(imageUri.toString());
       ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
       int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
       int rotate = 0;
       switch(orientation) {
         case ORIENTATION_ROTATE_270:
             rotate-=90;break;
         case ORIENTATION_ROTATE_180:
             rotate-=90;break
         case ORIENTATION_ROTATE_90:
             rotate-=90;break
       }

Upvotes: 0

Related Questions