1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Android圖片采樣縮放功能實例代碼

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

      創(chuàng)新互聯(lián)是一家專業(yè)提供勐臘企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站設(shè)計、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為勐臘眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。

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

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

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

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

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

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

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

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

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

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

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

      4、將BitmapFactory.Option的inJustDecodeBound參數(shù)設(shè)為false,重新加載圖片,這時候圖片才真正被載進內(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大小的類
          //計算采樣率
          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;
        }
        /**
         * 根據(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);
          //計算采樣率
          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;
        }
      }

      總結(jié)

      以上所述是小編給大家介紹的Android圖片采樣縮放功能實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!


      分享名稱:Android圖片采樣縮放功能實例代碼
      文章源于:http://www.ef60e0e.cn/article/pgdjcg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        龙川县| 沁水县| 南靖县| 海伦市| 景泰县| 合作市| 昆山市| 准格尔旗| 广宁县| 普格县| 收藏| 潮安县| 易门县| 抚松县| 山东| 郓城县| 增城市| 古丈县| 济宁市| 虹口区| 宁海县| 博湖县| 莱西市| 佛教| 雅江县| 高陵县| 板桥市| 甘南县| 鹤壁市| 公安县| 鄂尔多斯市| 高雄市| 怀集县| 岑巩县| 广东省| 勐海县| 昆明市| 台南县| 定西市| 广元市| 涪陵区|