参考:http://blog.csdn.net/lmj623565791/article/details/41874561
首先ImagView显示图片的时候,如果图片较大,经常会遇到OOM(Out Of Memory)的问题。
为了避免OOM,可以使用BitmapFactory.Options这个类。BitmapFactory.Options这个类,有一个字段叫做inJustDecodeBounds 。SDK中对这个成员的说明是这样的: 如果我们把它设为true,那么BitmapFactory.decodeFile(String path,Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
其次根据需求的宽和高以及图片实际的宽和高计算BitmapFactory.Options.inSampleSize。
inSampleSize的默认值和最小值为1(当小于1时,解码器将该值当做1来处理),且在大于1时,该值只能为2的幂(当不为2的幂时,解码器会取与该值最接近的2的幂)。例如,当inSampleSize为2时,一个2000*1000的图片,将被缩小为1000*500,相应地,它的像素数和内存占用都被缩小为了原来的1/4:
再其次使用获得到的InSampleSize再次解析图片。
然后将获取到的压缩图片保存到指定目录。具体代码如下:
package activity.mainimag; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.ViewGroup; import android.widget.ImageView; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImageView = (ImageView) findViewById(R.id.imageView); // 获得图片的宽和高,并不把图片加载到内存中 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile("/storage/sdcard0/baobao.jpg", options); options.inSampleSize = caculateInSampleSize(options,200,200); // 使用获得到的InSampleSize再次解析图片 options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile("/storage/sdcard0/baobao.jpg", options); saveCurrentBitmap(bitmap,"snowTest"); } public void saveCurrentBitmap(Bitmap mBitmap,String bitName) { File f = new File( Environment.getExternalStorageDirectory().getPath()+"/"+bitName + ".jpg"); FileOutputStream fOut = null; try { fOut = new FileOutputStream(f); } catch (FileNotFoundException e) { e.printStackTrace(); } mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut); try { fOut.flush(); } catch (IOException e) { e.printStackTrace(); } try { fOut.close(); } catch (IOException e) { e.printStackTrace(); } } // 根据需求的宽和高以及图片实际的宽和高计算SampleSize public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { int width = options.outWidth; int height = options.outHeight; int inSampleSize = 1; if (width > reqWidth || height > reqHeight) { int widthRadio = Math.round(width * 1.0f / reqWidth); int heightRadio = Math.round(height * 1.0f / reqHeight); inSampleSize = Math.max(widthRadio, heightRadio); } return inSampleSize; } }