Android 解码后的图像有时会旋转90度

Android 解码后的图像有时会旋转90度,android,bitmap,drawable,Android,Bitmap,Drawable,嘿,各位,我正在尝试使用以下代码将大型图像加载到我的应用程序背景中: final Drawable drawable =new BitmapDrawable(colorResource,decodeFile(new File(LMApplication.sharedpreferences.getString(path,"")))); new Handler(Looper.getMainLooper()).post(new Runnable

嘿,各位,我正在尝试使用以下代码将大型图像加载到我的应用程序背景中:

        final Drawable drawable =new BitmapDrawable(colorResource,decodeFile(new File(LMApplication.sharedpreferences.getString(path,""))));    

                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                            if(LMApplication.CurrentSDK < android.os.Build.VERSION_CODES.JELLY_BEAN) {
                                view.setBackgroundDrawable(drawable);
                            }else{
                                view.setBackground(drawable);
                            }
                        }
                });


public Bitmap decodeFile(File input){
            Bitmap bmpCompressed = null;
            try {
                //Decode image size

                BitmapFactory.Options o11 = new BitmapFactory.Options();
                o11.inJustDecodeBounds = true;

                BitmapFactory.decodeStream(new FileInputStream(input),null,o11);

                //The new size we want to scale to
                final int REQUIRED_SIZE=500;

                //Find the correct scale value. It should be the power of 2.
                int scale=1;
                while(o11.outWidth/scale/2>=REQUIRED_SIZE && o11.outHeight/scale/2>=REQUIRED_SIZE)
                    scale*=2;

                //Decode with inSampleSize
                BitmapFactory.Options o22 = new BitmapFactory.Options();
                o22.inSampleSize=scale;
                BitmapFactory.decodeStream(new FileInputStream(input), null, o22);
                bmpCompressed = BitmapFactory.decodeFile(input.toString(), o22);

                //    FileOutputStream out = null;
                try {
             //      out = new FileOutputStream(file);
              //     bmpCompressed.compress(CompressFormat.JPEG, 100, out); 

                } catch (Exception e) {
                e.printStackTrace();
                } finally {
                   try{
                 //      out.close();
                   } catch(Throwable ignore) {}
                }

               } catch (FileNotFoundException e) {}
              return bmpCompressed;
              }

使用ExiFinInterface进行如下旋转

picturePath = getIntent().getStringExtra("path");
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
ExifInterface exif = new ExifInterface(picturePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
    matrix.postRotate(90);
    break;
case ExifInterface.ORIENTATION_ROTATE_180:
    matrix.postRotate(180);
    break;
case ExifInterface.ORIENTATION_ROTATE_270:
    matrix.postRotate(270);
    break;
default:
    break;
}

myImageView.setImageBitmap(bitmap);
bitmap.recycle();

注意:此处
picturePath
是从
Gallery

中选择的图像路径,是的,但问题是exifinterface通过转换创建1个位图+位图,所以OOM被抛出,无论如何都不适用于
exifinterface
。它用于旋转
矩阵
。尝试在使用后回收所有位图,就像我在回答中显示的那样。如果出现OOM,则尝试对这些图像进行采样。

picturePath = getIntent().getStringExtra("path");
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
ExifInterface exif = new ExifInterface(picturePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
    matrix.postRotate(90);
    break;
case ExifInterface.ORIENTATION_ROTATE_180:
    matrix.postRotate(180);
    break;
case ExifInterface.ORIENTATION_ROTATE_270:
    matrix.postRotate(270);
    break;
default:
    break;
}

myImageView.setImageBitmap(bitmap);
bitmap.recycle();