精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产特黄大片aaaa毛片| 999久久久精品视频| 男女视频在线观看免费| 蜜桃视频在线观看一区| 欧美成人精品一区二区| www.自拍偷拍| www.91精品| 五月天欧美精品| 亚洲欧美成人一区| 欧美一级性视频| 热久久一区二区| 色综合久综合久久综合久鬼88| 免费在线观看你懂的| 国产视频网站一区二区三区| 都市激情亚洲色图| eeuss中文| 男人天堂亚洲二区| 成人禁用看黄a在线| 国产噜噜噜噜噜久久久久久久久| 日韩成人免费在线视频| 91精品国产乱码久久久久久久| 日韩va亚洲va欧洲va国产| 福利视频999| japanese23hdxxxx日韩 | 欧美日韩免费做爰视频| 欧美日韩性在线观看| 亚洲精品不卡在线| 亚洲av综合色区无码另类小说| 成人久久网站| 日本久久一区二区三区| 免费看黄在线看| 日本色护士高潮视频在线观看| 国产精品久久国产精麻豆99网站| 免费久久久一本精品久久区| 亚洲精品综合网| 激情五月婷婷综合网| 国产精品99久久久久久人| 日本中文字幕在线免费观看| 欧美~级网站不卡| 精品国内产的精品视频在线观看| 黄免费在线观看| 亚洲深夜福利在线观看| 亚洲精品99久久久久| www.四虎精品| eeuss国产一区二区三区四区| 欧美一区二区三区不卡| 亚洲精品第三页| 欧美一级在线| 69久久99精品久久久久婷婷| 久久99999| 欧美综合影院| 91精品在线免费观看| 青青草原国产在线视频| 久久福利在线| 5566中文字幕一区二区电影| 亚洲三级在线观看视频| 国产精品成人**免费视频| 欧美精品日韩综合在线| 亚洲一区二区中文字幕在线观看| 91成人精品观看| 日韩一本二本av| 中文字幕永久免费| 国产一区二区三区不卡av| 亚洲国产精品一区二区三区| 97人妻精品一区二区三区免| 九热爱视频精品视频| 亚洲视频axxx| 在线视频这里只有精品| 欧美日韩国产色综合一二三四| 欧美激情图片区| 日韩成年人视频| 石原莉奈在线亚洲二区| 国产色婷婷国产综合在线理论片a| 国产又大又粗又硬| 丁香婷婷综合五月| 久久综合狠狠综合久久综青草| 免费国产在线视频| 国产精品毛片高清在线完整版| 成年人免费观看的视频| 色在线视频网| 欧美日韩在线视频首页| 牛夜精品久久久久久久| 亚洲伦理一区二区| 亚洲福利视频网站| 国产三级短视频| 欧美精品三级| 亚州国产精品久久久| 日本久久综合网| 国产精品一级在线| 国产精品免费观看高清| 天堂中文在线8| 国产精品久久久久久久裸模 | 中文在线观看免费| 欧美日韩一区二区在线播放| 国产精欧美一区二区三区白种人| 澳门久久精品| 精品国产一区二区三区久久久狼| 国产一卡二卡在线| 美女www一区二区| 在线成人av网站| 亚洲毛片在线看| 水蜜桃色314在线观看| 正在播放日韩精品| 欧美一区二区三区小说| 国产美女喷水视频| 午夜日韩福利| 国产精品电影观看| 凸凹人妻人人澡人人添| 久久国产乱子精品免费女| 国产成人精品视频在线| 日日夜夜精品视频免费观看| 亚洲精品黑牛一区二区三区| 国产一区二区日韩精品欧美精品| 欧美片一区二区| 玖玖玖国产精品| 国产免费高清一区| 免费大片黄在线观看视频网站| 91麻豆免费视频| 五月天色婷婷综合| 成人做爰视频www网站小优视频| 精品国产一区二区三区忘忧草| 成年人看的免费视频| 欧美日本不卡| 国产综合视频在线观看| 男生女生差差差的视频在线观看| 亚洲成人免费在线观看| 免费欧美一级片| 精品熟妇无码av免费久久| 色老板在线视频一区二区| www.久久久久| 超碰在线免费97| 2023国产一二三区日本精品2022| 免费拍拍拍网站| 亚洲成人三级| 欧美日韩国产综合新一区| 美女日批在线观看| av亚洲一区| 国产亚洲a∨片在线观看| 亚洲精品男人的天堂| av高清久久久| 欧美a在线视频| 国产精品视频首页| 久久亚洲一区二区三区四区五区高| 午夜剧场免费在线观看| 日韩高清在线电影| 日韩精品欧美在线| 日韩成人亚洲| 亚洲高清自拍| 韩国视频理论视频久久| 亚洲成a人片在线| 91天堂素人约啪| 男人的天堂99| 日韩手机在线| 久久躁日日躁aaaaxxxx| 精品国产av一区二区三区| 一区二区在线观看免费| 911亚洲精选| 久久在线免费| 亚洲专区中文字幕| 乱插在线www| 欧美一级午夜免费电影| 中文字幕乱码免费| 日韩高清在线| 久久中文字幕一区| 亚洲天堂网视频| 91网上在线视频| 最新av网址在线观看| 国产精品15p| 欧美亚洲午夜视频在线观看| 第九色区av在线| 91精品国产综合久久国产大片 | 久久精品av| 亚洲一区二区三区香蕉| 2019中文字幕在线电影免费| 亚洲美女激情视频| 一级做a爰片久久毛片16| 一区二区三区四区蜜桃 | 国产精品色噜噜| 亚洲天堂小视频| 国产精品试看| 伊人天天久久大香线蕉av色| 综合久久成人| 国产成人久久精品| а√天堂资源地址在线下载| 日韩精品视频观看| 亚洲综合精品视频| 亚洲国产aⅴ天堂久久| 亚洲一区二区自偷自拍 | 国产全是老熟女太爽了| 九九**精品视频免费播放| www.欧美黄色| 久久人人88| 精品国产一区二区三区四区vr | 欧美精品第1页| 日韩欧美一区二区一幕| 国产精品久久久久精k8| 尤物网站在线观看| 久久国产精品免费| 欧美网站免费观看| 亚洲国产精品日韩专区av有中文| 久久综合九色欧美狠狠| 日韩精品视频中文字幕| 国产福利精品视频| 免费在线观看av电影| 中文字幕日韩精品在线| 日韩在线观看视频网站| 56国语精品自产拍在线观看| 国产性生活视频| 午夜伊人狠狠久久| 黄色录像二级片| 久久九九99视频| 亚洲啪av永久无码精品放毛片 | 亚洲成人黄色网址| 国产精品视频在线观看免费| 色天天综合色天天久久| 国产小视频在线观看免费| 国产精品高清亚洲| 婷婷色一区二区三区| 好吊成人免视频| 午夜在线观看av| 国产精品久久久一区二区| 2025韩国大尺度电影| 九九视频免费观看视频精品 | 久久久久高潮毛片免费全部播放| 国产三级精品网站| 成人精品一区二区三区电影| √天堂8在线网| 91精品婷婷国产综合久久性色| 日韩av大片在线观看| 一区二区三区在线看| 亚洲熟女少妇一区二区| 国产女主播一区| 日韩欧美另类一区二区| 日韩有码在线电影| 91精彩视频在线观看| 亚洲欧美视频在线| 你懂的视频在线观看| 日韩国产精品视频| 五月天丁香视频| 亚洲国产精品va在看黑人| xxxx18国产| 日韩精品专区在线影院重磅| av免费观看网址| 日韩一区国产二区欧美三区| 97人妻精品一区二区三区软件| 欧美裸体一区二区三区| 91美女精品网站| 欧美一区二区三区免费大片| 国内精品国产成人国产三级| 日韩女优制服丝袜电影| 蜜臀久久久久久999| 亚洲国产天堂久久综合| 涩爱av在线播放一区二区| 亚洲精品综合精品自拍| 国产69精品久久app免费版| 国产一区二区三区在线免费观看| 国产一级二级三级在线观看| 中文字幕日韩在线观看| 黄色免费网站在线| 欧美夫妻性生活xx| av在线最新| 国产成人av网址| 日韩一级视频| 成人区精品一区二区| 欧美激情极品| 午夜午夜精品一区二区三区文| 99九九热只有国产精品| 国产精品视频二| 免费在线观看成人av| 美女黄色片视频| 国产精品中文欧美| 免费观看一级一片| 欧美激情中文字幕| 麻豆changesxxx国产| 黑人狂躁日本妞一区二区三区 | 91国偷自产一区二区三区成为亚洲经典 | 欧美日韩国产成人在线免费| 夜夜爽8888| 精品第一国产综合精品aⅴ| 久热av在线| 另类色图亚洲色图| 欧美aa在线观看| 成人在线观看视频网站| 久久精品国产亚洲5555| 一区二区三区在线观看www| 国产精品观看| 中文字幕视频在线免费观看| 国产成人自拍在线| 亚洲精品国产精品国自产网站| 亚洲精品高清在线观看| 亚洲熟女综合色一区二区三区| 7777精品久久久大香线蕉| 日韩精品视频无播放器在线看| 久久精品99国产精品酒店日本| 91福利在线尤物| 成人福利网站在线观看| 亚洲丝袜啪啪| 99er在线视频| 麻豆精品国产传媒mv男同| 中文字幕一区二区人妻电影丶| 国产精品久久久久久妇女6080| 国产小视频在线免费观看| 欧美一区二区三区色| 国产黄色在线播放| 韩剧1988免费观看全集| 精品入口麻豆88视频| 亚洲国产一区二区三区在线| 99精品久久久| wwwxxxx在线观看| 中文字幕综合网| 色老头在线视频| 亚洲国产精品成人精品| 欧美成人二区| 国产精品高潮粉嫩av| 久久香蕉精品香蕉| 国产内射老熟女aaaa| 蜜桃视频第一区免费观看| 亚洲av无码一区二区二三区| 亚洲一卡二卡三卡四卡五卡| 国产精品探花视频| 中文字幕国产亚洲2019| 另类激情视频| 久久www免费人成精品| 国产一区二区三区四区三区四| 网站在线你懂的| 国产精品三级av| 在线观看亚洲黄色| 亚洲人成五月天| 自拍一区在线观看| 久久免费看av| 美女网站久久| 欧美人妻一区二区三区| 在线视频中文字幕一区二区| 色av男人的天堂免费在线| 97免费中文视频在线观看| 加勒比久久高清| av网站大全免费| 成人av网站在线观看免费| 久久高清无码视频| 欧美成人性战久久| 丰满诱人av在线播放| 国产日韩一区二区| 亚洲激情成人| 泷泽萝拉在线播放| 欧美午夜美女看片| 欧美zozo| 国产精品午夜国产小视频| 91亚洲国产成人久久精品| 亚洲天堂网2018| 亚洲乱码国产乱码精品精的特点| 精品女同一区二区三区| 欧美激情欧美狂野欧美精品 | 国产老女人精品毛片久久| 在线免费观看亚洲视频| 欧美www视频| 女人让男人操自己视频在线观看 | 91网在线免费观看| 在线国产一区| 国产xxxx视频| 色94色欧美sute亚洲线路一ni| 成人免费高清在线播放| 国产日韩精品视频| 欧美日韩精品免费观看视频完整| 亚洲成a人无码| 欧美午夜精品久久久久久久| 国产高清美女一级毛片久久| 国产中文欧美精品| 国产精品大片免费观看| 久久只有这里有精品| 欧美日韩成人激情| 国精一区二区三区| 日韩国产精品一区二区| 国产在线视频一区二区| 亚洲精品午夜久久久久久久| 亚洲天堂日韩电影| 亚洲欧美综合久久久久久v动漫| 欧美无砖专区免费| 国产亚洲婷婷免费| 国产男女裸体做爰爽爽| 51午夜精品视频| 99久久99热这里只有精品 | 欧美电影在线观看免费| 538在线视频观看| 一级精品视频在线观看宜春院 | 久久伊人蜜桃av一区二区| 中文字幕精品一区二| 欧美精品久久久久| 日韩国产一区二区三区| 激情av中文字幕| 欧美特级限制片免费在线观看| 国内老司机av在线| 亚洲女人毛片| 91亚洲永久精品| 99国产揄拍国产精品| 日韩免费精品视频| 欧美三级小说| 国产精品综合激情| 国产偷国产偷亚洲清高网站| 欧美精品三级在线| 性生活免费在线观看|