1. 程式人生 > >Android--生成縮圖------方法總結

Android--生成縮圖------方法總結

在Android中對大圖片進行縮放真的很不盡如人意,不知道是不是我的方法不對。下面我列出3種對圖片縮放的方法,並給出相應速度。請高人指教。

第一種是BitmapFactory和BitmapFactory.Options。
首先,BitmapFactory.Options有幾個Fields很有用:
inJustDecodeBounds:If set to true, the decoder will return null (no bitmap), but the out...
也就是說,當inJustDecodeBounds設成true時,bitmap並不載入到記憶體,這樣效率很高哦。而這時,你可以獲得bitmap的高、寬等資訊。

outHeight:The resulting height of the bitmap, set independent of the state of inJustDecodeBounds.
outWidth:The resulting width of the bitmap, set independent of the state of inJustDecodeBounds. 
看到了吧,上面3個變數是相關聯的哦。
inSampleSize :If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.

這就是用來做縮放比的。這裡有個技巧:
inSampleSize=(outHeight/Height+outWidth/Width)/2
實踐證明,這樣縮放出來的圖片還是很好的。
最後用BitmapFactory.decodeFile(path, options)生成。
由於只是對bitmap載入到記憶體一次,所以效率比較高。解析速度快。

第二種是使用Bitmap加Matrix來縮放。

首先要獲得原bitmap,再從原bitmap的基礎上生成新圖片。這樣效率很低。

第三種是用2.2新加的類ThumbnailUtils來做。
讓我們新看看這個類,從API中來看,此類就三個靜態方法:createVideoThumbnail、extractThumbnail(Bitmap source, int width, int height, int options)、extractThumbnail(Bitmap source, int width, int height)。
我這裡使用了第三個方法。再看看它的原始碼,下面會附上。是上面我們用到的BitmapFactory.Options和Matrix等經過人家一陣加工而成。
效率好像比第二種方法高一點點。

下面是我的例子:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <ImageView
  8.     android:id="@+id/imageShow"
  9.     android:layout_width="wrap_content"
  10.     android:layout_height="wrap_content"
  11. />
  12. <ImageView
  13.     android:id="@+id/image2"
  14.     android:layout_width="wrap_content"
  15.     android:layout_height="wrap_content"
  16. />
  17. <TextView
  18.     android:id="@+id/text"
  19.     android:layout_width="fill_parent"
  20.     android:layout_height="wrap_content"
  21.     android:text="@string/hello"
  22.     />
  23. </LinearLayout>

  1. package com.linc.ResolvePicture;  
  2. import java.io.File;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import android.app.Activity;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.graphics.Matrix;  
  10. import android.graphics.drawable.BitmapDrawable;  
  11. import android.graphics.drawable.Drawable;  
  12. import android.media.ThumbnailUtils;  
  13. import android.os.Bundle;  
  14. import android.util.Log;  
  15. import android.widget.ImageView;  
  16. import android.widget.TextView;  
  17. publicclass ResolvePicture extends Activity {  
  18.     privatestatic String tag="ResolvePicture";  
  19.     Drawable bmImg;    
  20.     ImageView imView;   
  21.     ImageView imView2;   
  22.     TextView text;  
  23.     String theTime;  
  24.     long start, stop;   
  25.     /** Called when the activity is first created. */
  26.     @Override
  27.     publicvoid onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.         text=(TextView)findViewById(R.id.text);  
  31.         imView=(ImageView) findViewById(R.id.imageShow);  
  32.         imView2=(ImageView) findViewById(R.id.image2);  
  33.         Bitmap bitmap = BitmapFactory.decodeResource(getResources(),     
  34.                 R.drawable.pic);  
  35.         start=System.currentTimeMillis();  
  36. //        imView.setImageDrawable(resizeImage(bitmap, 300, 100)); 
  37.         imView2.setImageDrawable(resizeImage2("/sdcard/2.jpeg"200100));   
  38.         stop=System.currentTimeMillis();  
  39.         String theTime= String.format("\n1 iterative: (%d msec)",    
  40.                 stop - start);    
  41.         start=System.currentTimeMillis();  
  42.         imView.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap,200,100));//2.2才加進來的新類,簡單易用
  43. //        imView.setImageDrawable(resizeImage(bitmap, 30, 30)); 
  44.         stop=System.currentTimeMillis();  
  45.          theTime+= String.format("\n2 iterative: (%d msec)",    
  46.                 stop - start);   
  47.         text.setText(theTime);  
  48.     }  
  49.     //使用Bitmap加Matrix來縮放
  50.     publicstatic Drawable resizeImage(Bitmap bitmap, int w, int h)   
  51.     {    
  52.         Bitmap BitmapOrg = bitmap;    
  53.         int width = BitmapOrg.getWidth();    
  54.         int height = BitmapOrg.getHeight();    
  55.         int newWidth = w;    
  56.         int newHeight = h;    
  57.         float scaleWidth = ((float) newWidth) / width;    
  58.         float scaleHeight = ((float) newHeight) / height;    
  59.         Matrix matrix = new Matrix();    
  60.         matrix.postScale(scaleWidth, scaleHeight);    
  61.         // if you want to rotate the Bitmap   
  62.         // matrix.postRotate(45);   
  63.         Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 00, width,    
  64.                         height, matrix, true);    
  65.         returnnew BitmapDrawable(resizedBitmap);    
  66.     }  
  67.     //使用BitmapFactory.Options的inSampleSize引數來縮放
  68.     publicstatic Drawable resizeImage2(String path,  
  69.             int width,int height)   
  70.     {  
  71.         BitmapFactory.Options options = new BitmapFactory.Options();  
  72. 相關推薦

    Android--生成------方法總結

    在Android中對大圖片進行縮放真的很不盡如人意,不知道是不是我的方法不對。下面我列出3種對圖片縮放的方法,並給出相應速度。請高人指教。 第一種是BitmapFactory和BitmapFactory.Options。 首先,BitmapFactory.Opti

    Android生成方法

    Android9.0 之前,使用BitmapFactory生成縮圖。 舉例:使用ThumbnailTask生成縮圖,GridViewAdapter顯示縮圖 static class ThumbnailTask extends AsyncTask<Object, LoadedImag

    php生成方法封裝

    ------------------------------------------------- 引數: $filename : 要裁剪的圖片路徑 $destination : 要生成的圖片資料夾和路徑 $dst_w : 要把圖片裁剪到多寬 $dst_h : 要把圖片裁剪到多高

    php上傳圖片自動生成方法函式

    $file_name='C:\AppServ\www\_MG_9888.jpg'; $file_new='C:\AppServ\www\bbbb.jpg'; scal_pic($file_name,$file_new); function scal_pic($file_n

    Android之通過ContentResolver獲取手機圖片和視訊的路徑和生成路徑

    1 問題 獲取手機所有圖片和視訊的路徑和生成圖片和視訊的縮圖和縮圖路徑 生成縮圖我們用的系統函式 public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Opti

    PHP一個方法調整影象大小(生成

    背景:  天氣很冷 PHP程式碼: /** * @param $imagedata 影象資料 * @param $width 縮放寬度 * @param $height 縮放高度 * @param int $per 縮放

    android視訊生成

    Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(data.getLocalityContent(), Video.Thumbnails.MINI_KIND); LogUtil.i(Tag, "wdh CH

    C#生成不失真的方法

    最近一個手持機專案有個需求,因為物料圖片的大小不一,有的很大顯示到手持機上會只顯示圖片的一部分,介面顯得非常亂,很影響客戶的體驗度。所以需要一個方法,將上傳到伺服器上的圖片進行處理,按照一定的大小格式進行儲存。 下面提供了兩種獲取圖片縮圖的方法,供大家參考。

    thinkphp5上傳圖片及生成公共方法

    直接上程式碼,可以寫在公共檔案common和繼承的基礎類中,方便呼叫 /* * $name為表單上傳的name值 * $filePath為為儲存在入口資料夾public下面uploads/下面的資料夾名稱,沒有的話會自動建立 * $width指

    Android方法總結

    最近研究了一些Android的截圖方法,做一個總結。 圖片剪裁方法 使用View.getDrawingCache()得到Bitmap。非常簡單但是隻能截圖本應用的圖片,並且沒辦法控制截圖的範圍。 對Bitmap進行截圖。可以方便的操作擷取大小,但是

    Android開發根據Json直接生成Java Bean方法總結

    在開發過程中拿到從伺服器請求的json字串需要解析成Bean物件方便我們使用,自己寫bean又太麻煩 經過這麼長時間的Android開發,我收集了三種比較常用的通過json自動生成Bean物件的方法:

    C++生成隨機數的方法總結

    oca cnblogs nbsp seconds wmi iostream 代碼 cin std 網上有很多使用C++生成隨機數的文章,其原理不再贅述,這裏貼出windows系統上生成各種隨機數的代碼,方便查用。 1 #include <iostream>

    java按比例之原生成

    package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import jav

    android平臺開發debug方法總結

    一. 獲取Trace 呼叫棧資訊(Trace)是分析異常經常使用的,這裡簡單劃分兩類情況: 當前執行緒Trace: 當前執行流所線上程的呼叫棧資訊; 目標程序Trace:可獲取目標程序的呼叫棧,用於動態除錯; 1.1 當前執行緒Trace 1) Java層

    unity 生成

    根據記憶體的圖片生成縮圖 public void CreateThumbnail(byte[] bytes, string path) { int w = 125, h = 125; Text

    js生成

    1.傳遞三個引數 url(連線),width(寬度),height(高度) function(url, width, height) { if (!url) {    return ''; } if (!width || !height) {    return

    Android App測試分析方法(總結 && 重寫)

    前言: nick說過,沒個人都要有一套自己的測試方法,針對模組有一套自己的解決思路,之後一直在尋找。雖然之前寫過一次,但是還是欠缺了什麼,至少框架不變,慢慢補充細節吧! 元素分析: 這裡之前一篇只分析了靜態的元素,經過工作中實踐後應該擴充

    AndroidThumbnails

    在Android,多媒體檔案(視訊和圖片)都是有縮圖的,在很多應用中,我們需要獲取這些縮圖。比如最近在做一個類似相簿的應用,需要掃描相簿裡面的圖片,然後獲取其縮圖,使用GridView去展示縮圖,當點選之後,我們需要獲取其原始圖,所以相關的需求如下: 1)獲取縮圖(一個問

    Android端影象處理方法總結

    Android端影象處理方法 在Android機中進行影象處理,常用的方式有兩種: 一種是單純使用JAVA語言進行圖形處理,相當於你將C或者C++編寫的影象處理方法,又重新用JAVA編寫了一遍。這種開發方法需要你在opencv官網,首先下載好Opencv的Android的版本,然後將它

    C#上傳視訊生成

    注意:需要FFmpeg軟體,用到ffmpeg.exe;FFmpeg是一個開源免費跨平臺的視訊和音訊流方案,屬於自由軟體,採用LGPL或GPL許可證(依據你選擇的元件)。它提供了錄製、轉換以及流化音視訊的完整解決方案。 前臺程式碼 <%@ Page Language