Android getting an image from gallery comes rotated

后端 未结 6 1282
闹比i
闹比i 2020-11-30 20:08

I am trying to let users select a profile picture from gallery. My issue is that some pictures come as rotated to the right.

I start the image picker like so:

<
6条回答
  •  抹茶落季
    2020-11-30 20:50

    I use these static methods. The first determines the orientation and the second rotates the image shrinking it as needed.

    public static int getOrientation(Context context, Uri photoUri) {
    
        Cursor cursor = context.getContentResolver().query(photoUri,
                new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null);
    
        if (cursor == null || cursor.getCount() != 1) {
            return 90;  //Assuming it was taken portrait
        }
    
        cursor.moveToFirst();
        return cursor.getInt(0);
    }
    
    /**
    * Rotates and shrinks as needed
    */
    public static Bitmap getCorrectlyOrientedImage(Context context, Uri photoUri, int maxWidth)
                    throws IOException {
    
                InputStream is = context.getContentResolver().openInputStream(photoUri);
                BitmapFactory.Options dbo = new BitmapFactory.Options();
                dbo.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(is, null, dbo);
                is.close();
    
    
                int rotatedWidth, rotatedHeight;
                int orientation = getOrientation(context, photoUri);
    
                if (orientation == 90 || orientation == 270) {
                    Log.d("ImageUtil", "Will be rotated");
                    rotatedWidth = dbo.outHeight;
                    rotatedHeight = dbo.outWidth;
                } else {
                    rotatedWidth = dbo.outWidth;
                    rotatedHeight = dbo.outHeight;
                }
    
                Bitmap srcBitmap;
                is = context.getContentResolver().openInputStream(photoUri);
                Log.d("ImageUtil", String.format("rotatedWidth=%s, rotatedHeight=%s, maxWidth=%s",
                        rotatedWidth, rotatedHeight, maxWidth));
                if (rotatedWidth > maxWidth || rotatedHeight > maxWidth) {
                    float widthRatio = ((float) rotatedWidth) / ((float) maxWidth);
                    float heightRatio = ((float) rotatedHeight) / ((float) maxWidth);
                    float maxRatio = Math.max(widthRatio, heightRatio);
                    Log.d("ImageUtil", String.format("Shrinking. maxRatio=%s",
                            maxRatio));
    
                    // Create the bitmap from file
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = (int) maxRatio;
                    srcBitmap = BitmapFactory.decodeStream(is, null, options);
                } else {
                    Log.d("ImageUtil", String.format("No need for Shrinking. maxRatio=%s",
                            1));
    
                    srcBitmap = BitmapFactory.decodeStream(is);
                    Log.d("ImageUtil", String.format("Decoded bitmap successful"));
                }
                is.close();
    
            /*
             * if the orientation is not 0 (or -1, which means we don't know), we
             * have to do a rotation.
             */
                if (orientation > 0) {
                    Matrix matrix = new Matrix();
                    matrix.postRotate(orientation);
    
                    srcBitmap = Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(),
                            srcBitmap.getHeight(), matrix, true);
                }
    
                return srcBitmap;
            }
    

提交回复
热议问题