Android中處理大圖片時圖片壓縮

來源:互聯網
上載者:User

標籤:壓縮   圖片   bitmapfactory   

1、BitmapFactory.Options中的屬性

在進行圖片壓縮時,是通過設定BitmapFactory.Options的一些值來改變圖片的屬性的,下面我們來看看BitmapFactory.Options中常用的屬性意思:

  • options.inPreferredConfig - 設定Bitmap的偏好配置,值有Bitmap.Config.ARGB_8888,Bitmap.Config.ARGB_4444,Bitmap.Config.ARGB_8888,Bitmap.Config.RGB_565。預設為ARGB_8888,顧名思義,這是設定Bitmap的顯示品質的。
  • options.outHeight - 得到該Bitmap的高。
  • options.outWidth - 得到該Bitmap的寬。
  • options.outMimeType - 得到該Bitmap的MIME值。
  • options.inSampleSize - 壓縮比例,如果options.inSampleSize = 4;那麼壓縮後的圖片的寬和高都為原來圖片的1/4,壓縮後的圖片的像素為原來圖片的1/16。
  • options.inJustDecodeBounds  - 官方文檔上是這樣介紹的:
      • If set to true, the decoder will return null (no bitmap), but
        the out... fields will still be set, allowing the caller to query
        the bitmap without having to allocate the memory for its pixels.
      • 意思就是:如果設定為true,那麼使用BitmapFactory.decodeStream(InputStream is, Rect outPadding, 
        Options opts)或BitmapFactory.decodeXXX(....,Options opts)方法並不會真的返回一個Bitmap對象,而是返回null,雖然返回null,但是我們卻可以通過options來獲得該Bitmap的一些值,如它的寬、高、MimeType等值。這樣就不必為Bitmap對象分配記憶體空間也可以獲得它的Width和Height,從而節約記憶體。所以這個屬性對我們壓縮圖片前進行檢查大有協助。常用的技巧就是為了避免圖片過大而導致OOM,所以在我們載入圖片之前就通過設定它為true,擷取到圖片的寬、高等值,然後進行一些判斷檢查等,決定圖片是否壓縮。我們來看看載入一張405x579圖片的例子:
      • final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeResource(getResource(), R.mipmap.two, options);Log.v("zxy","bitmap="+bitmap);int height = options.outHeight;int width = options.outWidth;String mimeType = options.outMimeType;Log.v("zxy","mimeType="+mimeType+",height="+height+",width="+width);
        上述代碼輸出的是:可以知道確實是返回null了,而且還獲得了該Bitmap的寬高等值。
2、通過執行個體來看看怎麼壓縮圖片

public class MainActivity extends ActionBarActivity {    private ImageView mImageView, mResizeImageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mImageView = (ImageView) findViewById(R.id.imageView);        mResizeImageView = (ImageView) findViewById(R.id.resize_imageView);        mImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.two));        Bitmap bitmap = compressBitmap(getResources(), R.mipmap.two, 100, 100);        Log.v("zxy", "compressBitmap,width=" + bitmap.getWidth() + ",height=" + bitmap.getHeight());        mResizeImageView.setImageBitmap(bitmap);    }    /**     * @param res Resource     * @param resId 資源id     * @param targetWidth 靶心圖表片的寬,單位px     * @param targetHeight 靶心圖表片的高,單位px     * @return 返回壓縮後的圖片的Bitmap     */    public Bitmap compressBitmap(Resources res, int resId, int targetWidth, int targetHeight) {        final BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;//設為true,節約記憶體        BitmapFactory.decodeResource(res, resId, options);//返回null        int height = options.outHeight;//得到源圖片height,單位px        int width = options.outWidth;//得到源圖片的width,單位px        //計算inSampleSize        options.inSampleSize = calculateInSampleSize(width,height,targetWidth,targetHeight);        options.inJustDecodeBounds = false;//設為false,可以返回Bitmap        return BitmapFactory.decodeResource(res,resId,options);    }    /**     * 計算壓縮比例     * @param width  源圖片的寬     * @param height 源圖片的高     * @param targetWidth  靶心圖表片的寬     * @param targetHeight 靶心圖表片的高     * @return inSampleSize 壓縮比例     */    public int calculateInSampleSize(int width,int height, int targetWidth, int targetHeight) {        int inSampleSize = 1;        if (height > targetHeight || width > targetWidth) {            //計算圖片實際的寬高和靶心圖表片寬高的比率            final int heightRate = Math.round((float) height / (float) targetHeight);            final int widthRate = Math.round((float) width / (float) targetWidth);            //選取最小的比率作為inSampleSize            inSampleSize = heightRate < widthRate ? heightRate : widthRate;        }        return inSampleSize;    }}
我們通過看Log可以知道壓縮後圖片的寬高:


我們再看看:


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android中處理大圖片時圖片壓縮

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.