亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android圖片采樣縮放功能實例代碼

發布時間:2020-09-09 20:58:14 來源:腳本之家 閱讀:157 作者:妖久 欄目:移動開發

為什么要對Android中的圖片進行采樣縮放呢?

是為了更加高效的加載Bitmap。假設通過imageView來顯示圖片,很多時候ImageView并沒有圖片的原始尺寸那么大,這時候把整張圖片加載進來后再設給ImageView是沒有必要的,因為ImagView并沒有辦法顯示原始的圖片。

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

BitmapFactory有一個參數:inSampleSize(采樣率)。

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

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

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

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

 那么我們如何獲取采樣率呢?

1、將BitmapFactory.Option的inJustDecodeBound參數設為true,加載圖片,這個時候圖片并沒有加載進內存,僅僅是去解析圖片原始寬高信息而已。

2、從BitmapFactory.Option取出圖片的原始寬高信息,對應于outWidth,outHeight參數。

3、根據采樣率的規則和目標原始View的所需大小計算出采樣率inSampleSize。

4、將BitmapFactory.Option的inJustDecodeBound參數設為false,重新加載圖片,這時候圖片才真正被載進內存。

以下提供一份代碼模板: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 
{
  /**
   * 根據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大小的類
    //計算采樣率
    options.inSampleSize=caculateInSampleSize(options,imageSize.width,imageSize.height);
    options.inJustDecodeBounds=false;
    Bitmap bitmap=BitmapFactory.decodeFile(path, options);
    return bitmap;
  }
  //計算采樣率
  public static int caculateInSampleSize(Options options,ImageView imageView)
  {
    ImageSize imageSize=getImageViewSize(imageView);
    int inSampleSize=caculateInSampleSize(options, imageSize.width,imageSize.height);
    return inSampleSize;
  }
  /**
   * 根據具體的大小要求解析圖片
   * @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);
    //計算采樣率
    options.inSampleSize=caculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds=false;
    Bitmap bitmap=BitmapFactory.decodeFile(path, options);
    return bitmap;
  }
  //計算采樣率
  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) //原始的寬比目標寬大,或者原始高比目標高大
    {
      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;
  }
}

總結

以上所述是小編給大家介紹的Android圖片采樣縮放功能實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥西县| 镇原县| 鄂托克前旗| 常熟市| 辉县市| 宝清县| 和田市| 萨嘎县| 日照市| 新和县| 涟源市| 冀州市| 通海县| 平顺县| 鹰潭市| 遂宁市| 米林县| 温宿县| 志丹县| 乌拉特前旗| 新密市| 佛山市| 通州区| 建阳市| 岑巩县| 黄龙县| 忻城县| 水富县| 凤凰县| 平南县| 溧阳市| 三都| 湛江市| 贡嘎县| 怀集县| 上蔡县| 伊金霍洛旗| 无为县| 赫章县| 宁德市| 嘉黎县|