图片的二次采样

    默认情况下,bitmap每个像素点占用4个字节(ARGB_8888),比如一张3543×3503的图片差不多在内存中占用44M,安卓系统给每个应用分配的内存都是有限的,可以使用Runtime.getRuntime().maxMemory()来获取内存有限空间。默认情况下图片存储又需要大量的空间,于是就容易产生OOM(out of memory)。

本次需要显示的图片信息:宽高都为3500个像素,大小约为1.1M,通过

imageView.setImageResource(R.drawable.bigpic);会产生out of memory,采用二次采样,就可以把图片显示出来。

  1. package com.dy.outofmemorydemo;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.widget.ImageView;
  7. import com.lidroid.xutils.ViewUtils;
  8. import com.lidroid.xutils.view.annotation.ContentView;
  9. import com.lidroid.xutils.view.annotation.ViewInject;

  10. @ContentView(R.layout.activity_main)
  11. public class MainActivity extends AppCompatActivity {
  12.     @ViewInject(R.id.image)
  13.     private ImageView imageView;
  14.     final int MAX_WIDTH = 1000;//定义图片最大的宽
  15.     final int MAX_HEIGHT = 1000;

  16.     @Override
  17.     protected void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         ViewUtils.inject(this);

  20. //        imageView.setImageResource(R.drawable.bigpic);
  21.         Bitmap bitmap = compressImage();
  22.         imageView.setImageBitmap(bitmap);
  23.     }

  24.     /**
  25.      * 对图片进行二次采样,实际上就是对图片进行压缩
  26.      * 技术关键点就是不用将图片放到内存中,也能测量图片的宽高
  27.      */

  28.     public Bitmap compressImage() {
  29.        //第一次采样
  30.         BitmapFactory.Options options = new BitmapFactory.Options();
  31.         options.inJustDecodeBounds = true;//只测量边框,而不把整张图片加载到内存
  32.         BitmapFactory.decodeResource(getResources(), R.drawable.bigpic, options);
  33.         int iWidth = options.outWidth;//测量出实际的宽
  34.         int iHeight = options.outHeight;//测量出实际的高
  35.         int iSimple = 1;//压缩比(采样率),2的倍数,simple等于4,表示压缩到原来的1/4.

  36.         while ((iWidth > MAX_WIDTH) || (iHeight > MAX_HEIGHT)) {
  37.             iSimple = iSimple * 2;
  38.             iWidth = iWidth / 2;
  39.             iHeight = iHeight / 2;
  40.         }
  41.        //第二次采样,根据压缩比压缩图片
  42.         options.inJustDecodeBounds = false;//解码整个压缩后的图片
  43.         options.inSampleSize = iSimple;//设置压缩比
  44.         Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bigpic, options);
  45.         return bitmap;
  46.     }
  47. }

效果如图:

图片的二次采样_第1张图片

你可能感兴趣的:(图片的二次采样)