1

I need to upload photo from camera to server in my app. It works great on most of the devices. But a few devices are causing image to rotate by 90' which is not my desired behavior. After research, I came to know that its due to EXIF data attached with image. To strip EXIF data from the image bitmap, I tried various things like re-sizing image etc but none of them worked for me. Anybody please suggest a way to perform this task.

Ammar
  • 1,811
  • 5
  • 26
  • 60
  • As per your requirement, were you able to strip the EXIF data from the image? The solutions given here rotates the image. – Rahul Nov 06 '19 at 07:11

2 Answers2

3

Try this,

public static Bitmap getImage(Context context, Uri uri)
            throws FileNotFoundException, IOException {

        InputStream input = context.getContentResolver().openInputStream(uri);

        BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
        onlyBoundsOptions.inJustDecodeBounds = true;
        onlyBoundsOptions.inDither = true;// optional
        onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// optional
        BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
        input.close();

        if ((onlyBoundsOptions.outWidth == -1)
                || (onlyBoundsOptions.outHeight == -1))
            return null;

        BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
        bitmapOptions.inJustDecodeBounds = false;
        bitmapOptions.inDither = true;
        bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// optional
        input = context.getContentResolver().openInputStream(uri);
        Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
        input.close();

        ExifInterface ei = new ExifInterface(uri.getPath());
        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;
        }

        return bitmap;
    }

here uri is the uri of image taken from camera.

For understanding exif orienatation: goto http://www.impulseadventure.com/photo/exif-orientation.html

Chirag Jain
  • 1,612
  • 13
  • 20
0

Here we use the ExifInterface object to read tags in a JPEG file and fetch the orientation attribute of image e.g.

// Variable to store the corrected bitmap.
Bitmap correctedBitMap = null;

ExifInterface exifInterface = new ExifInterface(<PATH OF YOUR PHOTO>);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

Now the integer variable orientation has the info about how much is the image rotated by, which is then checked against ExifInterface constant value & respectively the changes are made.

switch(orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
        correctedBitMap = rotateImage(<YOUR BITMAP OBJECT>, 90);
        break;

    case ExifInterface.ORIENTATION_ROTATE_180:
        correctedBitMap = rotateImage(<YOUR BITMAP OBJECT>, 180);
        break;
}

Here is the code for rotateImage method:

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 e) {
        e.printStackTrace();
    }
    return bitmap;
}
Tushski
  • 242
  • 2
  • 12
  • Appreciate your effort. Actually I'm already requesting `URI` to load bitmap. And the problem is since photo taken by camera in app are stored temporarily. So when I again request the `URI`, it causes crash. Any other suggestion? Is there a way to perform this function on `Bitmap` object? – Ammar Oct 20 '14 at 09:49
  • For that you can take a look at my this answer http://stackoverflow.com/a/26463347/2330675 . Here check the last block of code. – Tushski Oct 20 '14 at 10:22