一.
主要是通過BitmapFactory.Options 來實現。
Options中有個屬性inJustDecodeBounds。我們可以充分利用它,來避免大圖片的溢出問題。他是什么原理呢?
API這樣說:如果該 值設為true那么將不返回實際的bitmap,也不給其分配內存空間這樣就避免內存溢出了。但是允許我們查詢圖片的信息這其中就包括圖片大小信息(
options.outHeight (圖片原始高度)和option.outWidth(圖片原始寬度))。
Options中有個屬性inSampleSize。我們可以充分利用它,實現縮放。
如果被設置為一個值> 1,要求解碼器解碼出原始圖像的一個子樣本,返回一個較小的bitmap,以節省存儲空間。
例如,inSampleSize = = 2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片大小就為原始大小的1/4。
對於任何值< = 1的同樣處置為1。
那么相應的方法也就出來了,通過設置 inJustDecodeBounds為true,獲取到outHeight(圖片原始高度)和 outWidth(圖片的原始寬度),然后計算一個inSampleSize(縮放值),
然后就可以取圖片了,這里要注意的是,inSampleSize 可能小於0,必須做判斷。
實現步驟:
第一步:BitmapFactory.Option
設置 inJustDecodeBounds為true
第二步:BitmapFactory.decodeFile(path,option)方法
解碼圖片路徑為一個位圖。如果指定的文件名是空的,或者不能解碼到一個位圖,函數將返回null[空值]。
獲取到outHeight(圖片原始高度)和 outWidth(圖片的原始寬度)
第三步:計算縮放比例,也可以不計算,直接給它設定一個值。
options.inSampleSize = "你的縮放倍數";
如果是2就是高度和寬度都是原始的一半。
第四步:設置options.inJustDecodeBounds = false;
重新讀出圖片
bitmap = BitmapFactory.decodeFile(path, options);
具體實現:
package xiaosi.compress; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; public class Compress extends Activity { /** Called when the activity is first created. */ private ImageView image = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); image = (ImageView) findViewById(R.id.image); image.setImageBitmap(decodeBitmap()); } public Bitmap decodeBitmap() { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 通過這個bitmap獲取圖片的寬和高 Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/MTXX/3.jpg", options); if (bitmap == null) { System.out.println("bitmap為空"); } float realWidth = options.outWidth; float realHeight = options.outHeight; System.out.println("真實圖片高度:" + realHeight + "寬度:" + realWidth); // 計算縮放比 int scale = (int) ((realHeight > realWidth ? realHeight : realWidth) / 100); if (scale <= 0) { scale = 1; } options.inSampleSize = scale; options.inJustDecodeBounds = false; // 注意這次要把options.inJustDecodeBounds 設為 false,這次圖片是要讀取出來的。 bitmap = BitmapFactory.decodeFile("/sdcard/MTXX/3.jpg", options); int w = bitmap.getWidth(); int h = bitmap.getHeight(); System.out.println("縮略圖高度:" + h + "寬度:" + w); return bitmap; } }
效果圖:


這樣我們就可以讀取較大的圖片而不會內存溢出了。如果你想把壓縮后的圖片保存在Sdcard上的話就很簡單了:
File file=new File("/sdcard/feng.png"); try { FileOutputStream out=newFileOutputStream(file); if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){ out.flush(); out.close(); } } catch (FileNotFoundException e){ // TODO Auto-generated catchblock e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catchblock e.printStackTrace(); }
from:http://blog.csdn.net/sjf0115/article/details/7366746
二.
Android2.2 開始系統新增了一個縮略圖ThumbnailUtils類,位於framework的android.media.ThumbnailUtils位置,可 以幫助我們從mediaprovider中獲取系統中的視頻或圖片文件的縮略圖,該類提供了三種靜態方法可以直接調用獲取。
1、 static Bitmap createVideoThumbnail(String filePath, int kind) //獲取視頻文件的縮略圖,第一個參數為視頻文件的位置,比如/sdcard/android123.3gp,而第二個參數可以為MINI_KIND或 MICRO_KIND最終和分辨率有關
2、 static Bitmap extractThumbnail(Bitmap source, int width, int height, int options) //直接對Bitmap進行縮略操作,最后一個參數定義為OPTIONS_RECYCLE_INPUT ,來回收資源
3、 static Bitmap extractThumbnail(Bitmap source, int width, int height) // 這個和上面的方法一樣,無options選項最后Android開發網再次提醒大家,ThumbnailUtils類是API Level從8或更高才開始支持的。
