精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何為你的Android應用縮放圖片

移動開發 Android
如何為你的Android應用縮放圖片?我們所提供的解決方案,將有一個結構類似上述代碼,其中的一部分將取代行1,這樣為縮放做準備。另一部分將取代行2,做最后的縮放。我們將開始替換行2的部分代碼,引入兩個新的概念,裁剪和合適。

很難為你的應用程序得到正確的圖像縮放嗎?是你的圖片過大,造成內存問題?還是圖片不正確縮放造成不良用戶體驗的結果?為了尋求一個好的解決方案,我們咨詢了Andreas Agvard(索尼愛立信軟件部門),讓他分享一些關于這方面的經驗。

[[73551]]

在索尼愛立信軟件部門工作,我經常遇到需要圖片縮放的應用,例如:當處理別人或者網絡上提供的圖片??s放是必要的,因為通常情況下的圖片不是你想要呈現的那樣。

典型的例子,如果你正在為你的應用開發一個LiveView™擴展。大多數人開發應用利用LiveView™和其他第二屏幕設備,可能需要重新調整圖片,重要的是要保持適當的縮放比例和圖像質量。當然,在很多情況下,改變圖片尺寸是一個有點困難,但是很有效的途徑。

ImageView解決了許多的圖片縮放問題,首先,至少你在設置完一個圖片源后,不用去解碼或縮放圖片。但有時需要你自己去解碼控制,這是本教程的用武之地。隨著本教程,我寫了一個代碼示例,下載圖片縮放代碼示例。在文本中呈現的效果,可以通過編譯和運行該項目來看到。

孤立的問題

我做這個教程,是因為我已經有一些實用方法來實現圖片的縮放,為了避免最常見的圖片縮放問題。如下面的例子:

  1. Bitmap unscaledBitmap = BitmapFactory.decodeResource(getResources(), mSourceId); 
  2. Bitmap scaledBitmap = Bitmap.createScaledBitmap(unscaledBitmap, wantedWidth, wantedHeight, true); 

那么在上面的代碼中,什么是正確的,什么是錯的?讓我們來看看在不同的代碼行。

行1:整個源圖像解碼到一個位圖。

  • 這可能會導致內存不足的錯誤,如果圖片太大的話。
  • 這可能會導致在一個高分辨率上解碼圖像。這可能會很慢,但智能解碼器可為解碼提高性能。
  • 縮放圖片很多時候是,高分辨率位圖縮放到低分辨率,會導致鋸齒的問題。使用位圖過濾(例如,通過傳送`true`參數到Bitmap.createScaledBitmap(...))減少了鋸齒,但是還是不夠。

行2:解碼的位圖縮放到想要的大小。

  • 源圖像的尺寸和想要的圖像尺寸在長寬比上可能是不一樣的。這將導致圖像的拉伸。

左邊的圖片:原始圖像。右邊的圖片:縮放后圖片??梢钥闯雒黠@的失真問題,如原圖的眼睛非常的鮮明,縮放后就沒有了。高度出現拉伸。

創建一個解決方案

我們的解決方案,將有一個結構類似上述代碼,其中的一部分將取代行1,這樣為縮放做準備。另一部分將取代行2,做最后的縮放。我們將開始替換行2的部分代碼,引入兩個新的概念,裁剪和合適。

替換行2

在這一部分,我們將縮放位圖到我們所需要的。這一步很必要,因為之前的解碼能力是有限的。此外,在這一步為了避免拉伸,我們可能要重新調整圖片到想要的大小。

有兩種可能性可以避免拉伸。不管是那種,我們都要調整尺寸,以確保他們有相同的寬高比;即縮放圖像作為源圖像,直到它適合想要的尺寸,或裁剪具有相同的寬高比的源圖像為想要的尺寸。

左邊的圖片:圖像通過fit方法縮放。圖片已被縮小到適合的尺寸和高度,結果是小于想要的高度。右邊的圖像:圖像crop方法縮放。圖像已被縮放到適應至少想要的尺寸。因此原圖已被裁剪,切割了成左邊和右邊二部分。

為了縮放這樣的效果,我們的實現代碼如下:

  1. public static Bitmap createScaledBitmap(Bitmap unscaledBitmap, int dstWidth, int dstHeight, ScalingLogic scalingLogic) { 
  2.       Rect srcRect = calculateSrcRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(), dstWidth, dstHeight, scalingLogic); 
  3.       Rect dstRect = calculateDstRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(), dstWidth, dstHeight, scalingLogic); 
  4.       Bitmap scaledBitmap = Bitmap.createBitmap(dstRect.width(), dstRect.height(), Config.ARGB_8888); 
  5.       Canvas canvas = new Canvas(scaledBitmap); 
  6.       canvas.drawBitmap(unscaledBitmap, srcRect, dstRect, new Paint(Paint.FILTER_BITMAP_FLAG));return scaledBitmap; 
  7.       } 

在上面的代碼,我們使用canvas.drawBitmap(...)做縮放。這種方法的裁剪區域是從源圖像的規模面積定義畫布的矩形為指定的目標矩形區 域。為了避免拉伸,這兩個矩形需要有相同的長寬比。我們還調用了兩個實用的方法,一個為創建源矩形和另一個為創建目標矩形。方法如下:

  1. public static Rect calculateSrcRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight, ScalingLogic scalingLogic) { 
  2.       if (scalingLogic == ScalingLogic.CROP) { 
  3.         final float srcAspect = (float)srcWidth / (float)srcHeight; 
  4.         final float dstAspect = (float)dstWidth / (float)dstHeight; 
  5.         if (srcAspect > dstAspect) { 
  6.           final int srcRectWidth = (int)(srcHeight * dstAspect); 
  7.           final int srcRectLeft = (srcWidth - srcRectWidth) / 2
  8.           return new Rect(srcRectLeft, 0, srcRectLeft + srcRectWidth, srcHeight); 
  9.         } else { 
  10.           final int srcRectHeight = (int)(srcWidth / dstAspect); 
  11.           final int scrRectTop = (int)(srcHeight - srcRectHeight) / 2
  12.           return new Rect(0, scrRectTop, srcWidth, scrRectTop + srcRectHeight); 
  13.         } 
  14.       } else { 
  15.         return new Rect(00, srcWidth, srcHeight); 
  16.       } 
  17.     } 
  18.     public static Rect calculateDstRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight, ScalingLogic scalingLogic) { 
  19.       if (scalingLogic == ScalingLogic.FIT) { 
  20.         final float srcAspect = (float)srcWidth / (float)srcHeight; 
  21.         final float dstAspect = (float)dstWidth / (float)dstHeight; 
  22.         if (srcAspect > dstAspect) { 
  23.           return new Rect(00, dstWidth, (int)(dstWidth / srcAspect)); 
  24.         } else { 
  25.           return new Rect(00, (int)(dstHeight * srcAspect), dstHeight); 
  26.         } 
  27.       } else { 
  28.         return new Rect(00, dstWidth, dstHeight); 
  29.       } 
  30.     } 

在剛好合適的情況下源矩形會包含整個源尺寸。在需要裁剪的情況下,它會計算好具有相同寬高比的目標圖像,來裁剪源圖像的寬度或高度,以達到你想要的尺寸。而剛好在合適的情況下,將有相同寬高比的源圖像,調整成你想要的尺寸的寬度或高度。

替換行1

解碼器很智能,特別是用于JPEG和PNG的格式。這些解碼器在圖片解碼時可以進行縮放,并且性能也有所改善,這樣鋸齒問題也可以避免。此外,由于圖片解碼后變小了,需要的內存也會較少。

縮放解碼的時候,只要簡單設置上BitmapFactory.Options對象的inSampleSize參數,并把它傳遞給 BitmapFactory。樣本大小指定一個縮放圖像大小的抽象因素,例如2是640×480圖像在320×240圖像上解碼的因素。樣本大小設置時, 你不能保證嚴格按照這個數字,圖像將被縮減,但至少它不會更小。例如,3倍640×480的圖像可能會導致在一個320×240圖像不支持值。通常情況 下,至少2的一次方支持[1,2,4,8,...]。

下一步是指定一個合適的樣本大小。合適的樣本大小將產生最大的縮放,但仍然是大于等于你想要的圖像尺寸。如下面代碼:

  1. public static Bitmap decodeFile(String pathName, int dstWidth, int dstHeight, ScalingLogic scalingLogic) { 
  2.       Options options = new Options(); 
  3.       options.inJustDecodeBounds = true
  4.       BitmapFactory.decodeFile(pathName, options); 
  5.       options.inJustDecodeBounds = false
  6.       options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth, dstHeight, scalingLogic); 
  7.       Bitmap unscaledBitmap = BitmapFactory.decodeFile(pathName, options); 
  8.       return unscaledBitmap; 
  9.     } 
  10.     public static int calculateSampleSize(int srcWidth, int srcHeight, int dstWidth, int dstHeight, ScalingLogic scalingLogic) { 
  11.       if (scalingLogic == ScalingLogic.FIT) { 
  12.         final float srcAspect = (float)srcWidth / (float)srcHeight; 
  13.         final float dstAspect = (float)dstWidth / (float)dstHeight; 
  14.         if (srcAspect > dstAspect) { 
  15.           return srcWidth / dstWidth; 
  16.         } else { 
  17.           return srcHeight / dstHeight; 
  18.         } 
  19.       } else { 
  20.         final float srcAspect = (float)srcWidth / (float)srcHeight; 
  21.         final float dstAspect = (float)dstWidth / (float)dstHeight; 
  22.         if (srcAspect > dstAspect) { 
  23.           return srcHeight / dstHeight; 
  24.         } else { 
  25.           return srcWidth / dstWidth; 
  26.         } 
  27.       } 
  28.     } 

在decodeFile(...)方法中,我們解碼一個文件進行了最終縮放尺度。這是首先要通過解碼源圖片尺寸,然后使用 calculateSampleSize(...)計算最佳樣本大小,最后使用此樣本的大小解碼圖像。如果你有興趣的話,你可以更深入了解 calculateSampleSize(...)方法,但以上方法基本可確保圖片進行縮放。

全部放在一起

根據上面我們指定的方法的,現在可以執行替換最初的代碼行:

  1. Bitmap unscaledBitmap = decodeFile(pathname, dstWidth, dstHeight, scalingLogic); 
  2. Bitmap scaledBitmap = createScaledBitmap(unscaledBitmap, dstWidth, dstHeight, scalingLogic);

左邊的圖像:原始解決方案,解碼消耗6693 KB的內存和1/4秒左右。結果被拉長失真。中間的圖像:同比縮放解決方案,解碼消耗418 KB的內存和1/10秒左右。右邊的圖像:裁剪解決方案,解碼消耗418 KB的內存和1/10秒左右。

想要了解更多信息,請下載我們的代碼示例。有了這個源碼項目,你可以看到你的Android手機上運行的結果。

責任編輯:閆佳明 來源: open-open
相關推薦

2013-08-06 13:50:09

2011-02-22 14:42:52

AndroidPad

2021-06-29 09:00:00

機器人ITRPA

2021-06-30 09:11:17

KubernetesDevtronK8S

2024-09-30 08:01:44

2012-12-31 13:13:13

App出售

2020-04-24 06:26:09

LinuxPython應用

2021-07-14 13:30:44

KubernetesLinux文件

2012-04-25 22:56:10

Android

2016-12-26 10:28:00

2015-03-31 10:26:01

數據庫數據庫事務

2023-12-26 10:04:29

Electron應用開發框架

2015-06-08 10:07:04

公有云云服務商選擇公有云遷移

2020-03-30 17:43:13

開源開源項目編寫文檔

2023-06-12 15:01:07

縮放神器Web工具

2022-12-26 10:28:08

CIO技術領導者

2010-12-14 13:40:33

IPv4IPv6Windows 7

2015-08-31 09:38:33

Linux安裝

2020-12-31 09:39:39

應用圖像格式SVGOMG

2012-02-07 09:31:59

點贊
收藏

51CTO技術棧公眾號

欧美性xxxx极品hd满灌| 国产精品一级在线| 中国人与牲禽动交精品| 一级片视频免费观看| 蜜桃视频在线观看www社区| 国产高清在线精品| 欧美一区二区.| 久久av红桃一区二区禁漫| 伊人久久大香线蕉av超碰| 红桃av永久久久| 亚洲欧美丝袜| 黄色片一区二区| 日韩av在线播放中文字幕| 两个人的视频www国产精品| 你懂的在线观看网站| 日韩一区精品| 亚洲成人tv网| 亚洲午夜精品一区二区| 婷婷开心激情网| 美女一区二区久久| 97**国产露脸精品国产| 一级片一级片一级片| 欧美日韩麻豆| 91精品欧美福利在线观看| 熟女视频一区二区三区| 色资源在线观看| 国产毛片精品国产一区二区三区| 国产91精品高潮白浆喷水| 亚洲女人毛茸茸高潮| 欧美精品中文| 日韩视频一区在线观看| 最新中文字幕免费视频| а√天堂中文在线资源8| 中文字幕一区在线观看视频| 久中文字幕一区| 不卡av中文字幕| 麻豆精品久久久| 欧美最猛性xxxx| 免费成人深夜夜行网站| 欧美猛男做受videos| 337p日本欧洲亚洲大胆精品| 中文字幕在线视频一区二区三区 | 久久久av毛片精品| 国产精品9999久久久久仙踪林 | 神马久久资源| 午夜久久久久久电影| 肉大捧一出免费观看网站在线播放| 成全电影播放在线观看国语| 久久亚洲捆绑美女| 麻豆av福利av久久av| 欧美自拍偷拍一区二区| 成人免费视频视频| 国产精品亚洲一区| 老牛影视av牛牛影视av| 成人午夜免费电影| 国产精品国产亚洲精品看不卡15| 精品国产无码一区二区三区| 国产激情一区二区三区| 亚洲一区二区三区成人在线视频精品 | 911精品美国片911久久久| 深夜福利一区二区| 香蕉成人在线视频| 91精品蜜臀一区二区三区在线| 最近更新的2019中文字幕| 日本裸体美女视频| 欧美电影三区| 欧美xxxx做受欧美| 久久激情免费视频| 国产欧美69| 日韩美女激情视频| 天堂免费在线视频| 久久99在线观看| av成人综合网| 色播色播色播色播色播在线| 久久久www免费人成精品| 亚洲精品国产一区| 天堂av最新在线| 婷婷中文字幕综合| 日韩欧美在线免费观看视频| 日韩国产大片| 精品国产伦理网| 亚洲最大的黄色网| 热久久天天拍国产| 欧美精品在线播放| 探花视频在线观看| 三级不卡在线观看| 99九九电视剧免费观看| 日韩午夜影院| 亚洲欧美一区二区三区国产精品| 男人添女人下部视频免费| 岛国av在线网站| 欧美日韩一区中文字幕| 国模大尺度视频| 亚洲香蕉视频| 欧美精品亚州精品| 免费黄色av片| 国产丶欧美丶日本不卡视频| 久久日韩精品| 成人日韩欧美| 日韩欧美国产成人| 超级砰砰砰97免费观看最新一期| 亚洲天堂日韩在线| 欧美美最猛性xxxxxx| 精品久久久久久久久久久久久久久久| 精品中文字幕一区二区| 精品一区二区三区自拍图片区| lutube成人福利在线观看| 亚洲综合色婷婷| www.精品在线| 青青草久久爱| 欧美激情喷水视频| 又污又黄的网站| 91在线国产观看| 中文字幕第一页亚洲| 唐人社导航福利精品| 欧美xxxx在线观看| 亚洲欧洲综合网| 性欧美videos另类喷潮| 超碰97在线人人| 免费黄色在线网站| 在线观看欧美黄色| 成年人的黄色片| 欧美日韩1区| 国产欧美欧洲在线观看| 蜜桃视频在线观看视频| 亚洲成人精品影院| 中文字幕一二三区| 国产精品久久久久9999赢消| 国产精品久久不能| 欧洲伦理片一区 二区 三区| 午夜精品一区二区三区电影天堂| 污免费在线观看| 久久精品久久久| 国产欧美日韩精品在线观看| 国产精品四虎| 日韩欧美在线字幕| 男男做爰猛烈叫床爽爽小说| 国产精品99免费看| 99中文视频在线| 性欧美video高清bbw| 欧美一区二区视频在线观看2022| 中国1级黄色片| 麻豆成人久久精品二区三区小说| 手机看片福利永久国产日韩| 美女100%一区| 亚洲人午夜精品| 久久精品视频2| 国产视频一区在线播放| 成人黄色片视频| 欧美美乳视频| 国产精品偷伦免费视频观看的| 成年人在线免费观看| 欧美吻胸吃奶大尺度电影| 真实乱视频国产免费观看 | 欧洲精品在线视频| 五月婷在线视频| 色噜噜狠狠成人中文综合| 色婷婷av777| 日韩制服丝袜av| 亚洲国产欧美日韩| 动漫一区二区三区| 欧美乱大交做爰xxxⅹ性3| 老司机午夜福利视频| 欧美日韩午夜剧场| 色一情一交一乱一区二区三区| 日韩高清在线不卡| www亚洲国产| 日韩一二三区| 97超级碰在线看视频免费在线看| 天堂中文字幕在线| 色综合久久久网| av在线播放中文字幕| 久99久精品视频免费观看| 99亚洲国产精品| 欧美日韩一区二区三区不卡视频| 日韩免费av一区二区| 1769在线观看| 欧美岛国在线观看| 中文字幕视频网| 国产精品乱人伦中文| 亚洲欧美日韩中文字幕在线观看| 亚洲激情视频| 亚洲人成网站在线播放2019| 亚洲精品v亚洲精品v日韩精品| 97在线视频一区| 最新真实国产在线视频| 精品国产一区二区亚洲人成毛片| www.中文字幕在线观看| 国产精品久久夜| 影音先锋资源av| 日韩av一二三| 800av在线免费观看| 国产毛片一区二区三区| 亚洲一区二区中文字幕| 成人欧美一区二区三区的电影| 久久久91精品国产一区不卡| 亚洲av成人精品毛片| 色婷婷国产精品久久包臀| 9999热视频| www亚洲一区| 一级黄色免费毛片| 视频一区二区欧美| 中文字幕日韩精品无码内射| 国产欧美久久一区二区三区| 国产精品久久九九| 欧美黑粗硬大| 人人做人人澡人人爽欧美| 中文字幕在线播放网址| 亚洲性猛交xxxxwww| 粉嫩av一区二区夜夜嗨| 欧美日韩一本到| 亚洲视频 欧美视频| 亚洲综合久久久| 顶级黑人搡bbw搡bbbb搡| 久久综合资源网| 能看毛片的网站| 寂寞少妇一区二区三区| 免费观看成人在线视频| 亚洲麻豆av| 久久www视频| 日本电影一区二区| 欧美一区二区三区四区在线观看地址 | 免费久久99精品国产自在现线| 伊人再见免费在线观看高清版| 欧美电影免费| 夜夜爽99久久国产综合精品女不卡 | 日本免费高清一区二区| 日韩美女国产精品| 国产精品区一区二区三在线播放| 电影一区中文字幕| 国产一区二中文字幕在线看| 新片速递亚洲合集欧美合集| 2018国产精品视频| www在线观看黄色| 久久久久久久久久国产| caoporm免费视频在线| 日韩天堂在线视频| 在线观看av黄网站永久| 伊人亚洲福利一区二区三区| 欧美理论在线观看| 日韩国产在线播放| 亚洲AV成人无码一二三区在线 | 成人动漫在线免费观看| 亚洲免费中文字幕| 青梅竹马是消防员在线| 精品香蕉在线观看视频一| 午夜一区在线观看| 日韩大片免费观看视频播放| 污污视频在线免费看| 亚洲国产精品99| 香蕉视频成人在线| 亚洲乱码av中文一区二区| 日本人妖在线| 国产亚洲精品美女久久久久| av在线收看| www.久久撸.com| 国内精品不卡| 欧美激情视频一区二区三区不卡| av手机在线观看| 青草青草久热精品视频在线网站 | 在线亚洲一区观看| 中文字幕二区三区| 在线综合视频播放| 亚洲av无码乱码在线观看性色| 精品国产一区二区三区四区四| 午夜福利一区二区三区| 日韩精品在线免费| 成年人视频在线看| 久久久国产一区| 欧美性video| 欧美在线视频导航| 51一区二区三区| 92看片淫黄大片欧美看国产片| 中文字幕av一区二区三区四区| 国产尤物99| 成人嘿咻视频免费看| 经典三级在线视频| 亚洲伊人观看| 亚洲一级片网站| 国产成人精品免费网站| 国产特级黄色录像| 中文字幕一区二区三区不卡在线| 国产亚洲精品av| 91豆麻精品91久久久久久| 国产男男gay网站| 日韩va亚洲va欧洲va国产| av网站在线免费观看| 久久91精品国产91久久跳| 色老头在线一区二区三区| 国产日韩在线观看av| 精品亚洲免a| 一区二区三区国| 一本色道88久久加勒比精品| 亚洲国产成人va在线观看麻豆| eeuss影院一区二区三区| 91在线无精精品白丝| 亚洲国产成人高清精品| 日本妇乱大交xxxxx| 欧美草草影院在线视频| av电影在线观看一区二区三区| 欧美激情视频一区| 亚洲国产综合在线观看| 久久这里精品国产99丫e6| 伊人情人综合网| 免费看a级黄色片| 成人精品亚洲人成在线| 欧美美女性生活视频| 欧美日韩国产一区在线| wwwav在线播放| 色偷偷av一区二区三区| 日韩性xxx| 国产欧美亚洲日本| 99热精品久久| 久久午夜夜伦鲁鲁一区二区| aaa国产一区| 久草网在线观看| 91精品国产综合久久久久久久| 每日更新av在线播放| 97在线视频免费观看| 久久久久久亚洲精品美女| 亚洲国产午夜伦理片大全在线观看网站| 99热这里只有成人精品国产| 又黄又爽又色的视频| 中文字幕av资源一区| 无码人妻av一区二区三区波多野| 亚洲国产精品久久久久秋霞不卡| av片哪里在线观看| 国产精品视频一区国模私拍| 亚洲国产精品嫩草影院久久av| www插插插无码视频网站| 国产成人一区二区精品非洲| 四虎884aa成人精品| 欧美日韩高清一区二区三区| а天堂8中文最新版在线官网| 国产成人高清激情视频在线观看| 日韩三级视频| www.爱色av.com| 成人av在线资源网| 久久中文字幕无码| 精品电影一区二区| 激情影院在线| 国产偷久久久精品专区| 亚洲第一伊人| 精品人妻一区二区三区日产乱码卜 | 亚洲国产精品毛片| 秋霞电影一区二区| 亚洲一二三精品| 欧美丰满少妇xxxbbb| 成人看av片| av一区二区三区免费| 狠狠综合久久av一区二区老牛| 中国男女全黄大片| 亚洲一区二区三区爽爽爽爽爽| 黄色av免费观看| 91av视频在线播放| 亚洲专区视频| 成人午夜激情av| 亚洲视频一二区| 丰满熟妇乱又伦| 91精品国产高清| 国产欧美一区二区精品久久久| 波多野结衣天堂| 国产精品久99| 精品久久国产视频| 97碰在线观看| 国内亚洲精品| 在线播放av中文字幕| 一级日本不卡的影视| 亚洲av成人无码久久精品老人| 国产国语刺激对白av不卡| 日韩在线视屏| 国产欧美视频一区| 色婷婷综合视频在线观看| 1769视频在线播放免费观看| 91手机在线播放| 久久蜜桃精品| 一级黄色录像视频| 精品视频中文字幕| 在线日韩三级| 一区二区传媒有限公司| 日本一二三四高清不卡| 朝桐光av在线一区二区三区| 91高清视频免费观看| 欧美电影免费| 青青草视频播放| 制服丝袜一区二区三区| 24小时免费看片在线观看| 亚洲欧美日韩不卡一区二区三区| 国产精品99久久久久久久女警| 国产精品777777| 久久亚洲精品国产亚洲老地址| 日韩电影不卡一区| 超碰在线超碰在线| 色综合久久88色综合天天6 | 9.1国产丝袜在线观看| 日韩专区精品| 欧美日韩一区二区三区四区五区六区| 欧美影视一区在线| heyzo高清中文字幕在线| 一区二区三区四区在线视频|