最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年11月14日 17:02:18   作者:妖久  
是為了更加高效的加載Bitmap。所以我們需要把a(bǔ)ndroid中的圖片進(jìn)行采樣縮放,下面小編給大家分享Android圖片采樣縮放功能實(shí)例代碼,需要的朋友參考下吧

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

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

所以我們可以使用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ù)來(lái)代替,不過(guò)經(jīng)過(guò)驗(yàn)證,這個(gè)結(jié)論并不是在所有的Android版本上都成立。

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

1、將BitmapFactory.Option的inJustDecodeBound參數(shù)設(shè)為true,加載圖片,這個(gè)時(shí)候圖片并沒(méi)有加載進(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ì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android開(kāi)發(fā)之Sqliteopenhelper用法實(shí)例分析

    Android開(kāi)發(fā)之Sqliteopenhelper用法實(shí)例分析

    這篇文章主要介紹了Android開(kāi)發(fā)之Sqliteopenhelper用法,實(shí)例分析了SQLiteOpenHelper類操作數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Android?Flutter實(shí)現(xiàn)搜索的三種方式詳解

    Android?Flutter實(shí)現(xiàn)搜索的三種方式詳解

    這篇文章主要為大家詳細(xì)介紹了Android?Flutter實(shí)現(xiàn)搜索的三種方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下
    2022-08-08
  • Android ListView實(shí)現(xiàn)ImageLoader圖片加載的方法

    Android ListView實(shí)現(xiàn)ImageLoader圖片加載的方法

    這篇文章主要介紹了Android ListView實(shí)現(xiàn)ImageLoader圖片加載的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了開(kāi)源框架Imageloader的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-07-07
  • Android實(shí)現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法

    Android實(shí)現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法,結(jié)合實(shí)例形式分析了Android遠(yuǎn)程播放音頻文件的相關(guān)步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • 詳解如何在Android Studio中添加RecyclerView-v7支持包

    詳解如何在Android Studio中添加RecyclerView-v7支持包

    本篇文章主要介紹了詳解如何在Android Studio中添加RecyclerView-v7支持包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 解決Android 高CPU占用率的問(wèn)題

    解決Android 高CPU占用率的問(wèn)題

    最近測(cè)試測(cè)試APP的一個(gè)功能,發(fā)現(xiàn)點(diǎn)擊頁(yè)面上的按鈕后,CPU占有率比之前的版本要高,所以本文給大家介紹了如何解決Android 高CPU占用率的問(wèn)題,需要的朋友可以參考下
    2023-09-09
  • Android開(kāi)發(fā)中的ViewModel使用實(shí)戰(zhàn)案例

    Android開(kāi)發(fā)中的ViewModel使用實(shí)戰(zhàn)案例

    在Android應(yīng)用開(kāi)發(fā)中,ViewModel作為架構(gòu)組件,重要的功能是管理UI數(shù)據(jù)與生命周期,文章深入分析ViewModel如何感知View的生命周期,以及其核心優(yōu)勢(shì),包括生命周期感知、數(shù)據(jù)持久化和與UI層解耦,幫助開(kāi)發(fā)者利用ViewModel優(yōu)化應(yīng)用架構(gòu),需要的朋友可以參考下
    2024-10-10
  • 利用kotlin實(shí)現(xiàn)一個(gè)餅圖實(shí)例代碼

    利用kotlin實(shí)現(xiàn)一個(gè)餅圖實(shí)例代碼

    餅狀圖是以不同顏色的圓的切片表示的值。下面這篇文章主要給大家介紹了關(guān)于利用kotlin實(shí)現(xiàn)一個(gè)餅圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 微信Android熱更新Tinker使用詳解(星空武哥)

    微信Android熱更新Tinker使用詳解(星空武哥)

    Tinker是微信官方的Android熱補(bǔ)丁解決方案,它支持動(dòng)態(tài)下發(fā)代碼、So庫(kù)以及資源,讓?xiě)?yīng)用能夠在不需要重新安裝的情況下實(shí)現(xiàn)更新。當(dāng)然,你也可以使用Tinker來(lái)更新你的插件
    2017-09-09
  • Android那兩個(gè)你碰不到但是很重要的類之ViewRootImpl

    Android那兩個(gè)你碰不到但是很重要的類之ViewRootImpl

    這兩個(gè)類就是ActivityThread和ViewRootImpl,之所以說(shuō)碰不到是因?yàn)槲覀儫o(wú)法通過(guò)正常的方式引用這兩個(gè)類或者其類的對(duì)象,本文就嘗試從幾個(gè)我們經(jīng)常接觸的方面先談?wù)刅iewRootImpl,感興趣的可以參考閱讀下
    2023-05-05

最新評(píng)論

宣化县| 清水县| 枞阳县| 格尔木市| 新乡市| 兴化市| 瑞安市| 边坝县| 漠河县| 肃宁县| 辉南县| 博野县| 尚义县| 庆城县| 宁海县| 永年县| 武城县| 成都市| 科技| 青河县| 牡丹江市| 资兴市| 盐山县| 清涧县| 民勤县| 雷州市| 兴宁市| 灌阳县| 咸丰县| 永州市| 潞城市| 台南市| 图木舒克市| 莱阳市| 安远县| 蚌埠市| 兴安盟| 吉木乃县| 东乡县| 清水县| 永和县|