国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android圖片采樣縮放功能實(shí)例代碼

2019-10-22 18:23:21
字體:
供稿:網(wǎng)友

為什么要對(duì)Android中的圖片進(jìn)行采樣縮放呢?

是為了更加高效的加載Bitmap。假設(shè)通過imageView來顯示圖片,很多時(shí)候ImageView并沒有圖片的原始尺寸那么大,這時(shí)候把整張圖片加載進(jìn)來后再設(shè)給ImageView是沒有必要的,因?yàn)镮magView并沒有辦法顯示原始的圖片。

所以我們可以使用BitmapFactory.Options按照一定的采樣率加載縮小后的圖片,將縮小后的圖片在ImageView中顯示,這樣就能降低內(nèi)存占用,在一定程度上避免OOM,提高bitma加載時(shí)候的性能。

BitmapFactory有一個(gè)參數(shù):inSampleSize(采樣率)。

inSampleSize為1,那么采樣后圖片大小等于原始圖片大小。

inSampleSize為2,那么采樣后圖片寬高均為原始圖片的1/2,像素為原圖的1/4,占有的內(nèi)存大小為原圖的1/4。

例如:一張的圖片像素為1024*1024,儲(chǔ)存格式為ARGB8888格式儲(chǔ)存,那么它占有內(nèi)存1024*1024*4=4M,用采樣率為2采樣后內(nèi)存占用為512*512*4=1M。

總結(jié):inSampleSize是必須大于1的整數(shù)才有效果,小與1就相當(dāng)于1,并且同時(shí)作用于寬高,所以縮放后的圖片大小以采樣率的2次方形式遞減.根據(jù)最新的官方文檔,inSampleSize的取值應(yīng)該總是為2的指數(shù),若給系統(tǒng)的inSampleSize不為2的指數(shù),那么系統(tǒng)會(huì)向下取整并且選擇一個(gè)最接近2的指數(shù)來代替,不過經(jīng)過驗(yàn)證,這個(gè)結(jié)論并不是在所有的Android版本上都成立。

 那么我們?nèi)绾潍@取采樣率呢?

1、將BitmapFactory.Option的inJustDecodeBound參數(shù)設(shè)為true,加載圖片,這個(gè)時(shí)候圖片并沒有加載進(jìn)內(nèi)存,僅僅是去解析圖片原始寬高信息而已。

2、從BitmapFactory.Option取出圖片的原始寬高信息,對(duì)應(yīng)于outWidth,outHeight參數(shù)。

3、根據(jù)采樣率的規(guī)則和目標(biāo)原始View的所需大小計(jì)算出采樣率inSampleSize。

4、將BitmapFactory.Option的inJustDecodeBound參數(shù)設(shè)為false,重新加載圖片,這時(shí)候圖片才真正被載進(jìn)內(nèi)存。

以下提供一份代碼模板:package com.example.chatting.chatting.utils;

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.util.DisplayMetrics;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;public class ImagesTool {  /**   * 根據(jù)ImageView的大小壓縮圖片   * @param path   * @param imageView   * @return   */  public static Bitmap decodeSampledBitmapFromPath(String path,ImageView imageView)  {    Options options = new Options();    options.inJustDecodeBounds=true;    BitmapFactory.decodeFile(path,options);    ImageSize imageSize=getImageViewSize(imageView); //獲取圖片大小,ImageSize是封裝著ImageView大小的類    //計(jì)算采樣率    options.inSampleSize=caculateInSampleSize(options,imageSize.width,imageSize.height);    options.inJustDecodeBounds=false;    Bitmap bitmap=BitmapFactory.decodeFile(path, options);    return bitmap;  }  //計(jì)算采樣率  public static int caculateInSampleSize(Options options,ImageView imageView)  {    ImageSize imageSize=getImageViewSize(imageView);    int inSampleSize=caculateInSampleSize(options, imageSize.width,imageSize.height);    return inSampleSize;  }  /**   * 根據(jù)具體的大小要求解析圖片   * @param path   * @param reqWidth   * @param reqHeight   * @return   */  public static Bitmap decodeSampledBitmapFromPath(String path,int reqWidth, int reqHeight)  {    Options options = new Options();    options.inJustDecodeBounds=true;    BitmapFactory.decodeFile(path,options);    //計(jì)算采樣率    options.inSampleSize=caculateInSampleSize(options,reqWidth,reqHeight);    options.inJustDecodeBounds=false;    Bitmap bitmap=BitmapFactory.decodeFile(path, options);    return bitmap;  }  //計(jì)算采樣率  private static int caculateInSampleSize(Options options, int reqWidth, int reqHeight)   {    int width=options.outWidth; //原始圖片寬    int height=options.outHeight; //原始圖片高    int inSampleSize=1; //采樣率    if(width>reqWidth || height>reqHeight) //原始的寬比目標(biāo)寬大,或者原始高比目標(biāo)高大    {      int widthRadio=Math.round(width *1.0f/reqWidth);      int heightRadio = Math.round(height * 1.0f / reqHeight);      inSampleSize = Math.max(widthRadio, heightRadio);    }    return inSampleSize;  }  //獲取ImageView的大小  protected static ImageSize getImageViewSize(ImageView imageView)   {    ImageSize imageSize = new ImageSize();    DisplayMetrics metrics = imageView.getContext().getResources().getDisplayMetrics();    LayoutParams lp = imageView.getLayoutParams();    int width = imageView.getWidth();    if (width <= 0) {      width = lp.width;    }    if (width <= 0) {      width = imageView.getMaxWidth();    }    if (width <= 0) {      width = metrics.widthPixels;    }    int height = imageView.getHeight();    if (height <= 0) {      height = lp.height;    }    if (height <= 0) {      height = imageView.getMaxHeight();    }    if (height <= 0) {      height = metrics.heightPixels;    }    imageSize.width = width;    imageSize.height = height;    return imageSize;  }  //ImageView大小的封裝類  private static class ImageSize  {    int width;    int height;  }}

總結(jié)

以上所述是小編給大家介紹的Android圖片采樣縮放功能實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 呼玛县| 壶关县| 中卫市| 新河县| 灵石县| 陆川县| 建瓯市| 门源| 郴州市| 历史| 清新县| 藁城市| 金塔县| 泰和县| 阳西县| 嵩明县| 堆龙德庆县| 运城市| 奉节县| 晴隆县| 崇阳县| 全南县| 饶阳县| 潢川县| 兴隆县| 封丘县| 会泽县| 高邑县| 女性| 九台市| 锡林郭勒盟| 华亭县| 兴业县| 陆河县| 九江县| 历史| 常熟市| 宜君县| 虹口区| 京山县| 得荣县|