android - 使用縮略圖


一.

主要是通過BitmapFactory.Options 來實現。

Options中有個屬性inJustDecodeBounds。我們可以充分利用它,來避免大圖片的溢出問題。他是什么原理呢?

API這樣說:如果該 值設為true那么將不返回實際的bitmap,也不給其分配內存空間這樣就避免內存溢出了。但是允許我們查詢圖片的信息這其中就包括圖片大小信息(

options.outHeight (圖片原始高度)和option.outWidth(圖片原始寬度))。

Options中有個屬性inSampleSize我們可以充分利用它,實現縮放。

如果被設置為一個值> 1,要求解碼器解碼出原始圖像的一個子樣本,返回一個較小的bitmap,以節省存儲空間。

例如,inSampleSize = = 2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片大小就為原始大小的1/4

對於任何值< = 1的同樣處置為1。

那么相應的方法也就出來了,通過設置 inJustDecodeBoundstrue,獲取到outHeight(圖片原始高度)和 outWidth(圖片的原始寬度),然后計算一個inSampleSize(縮放值)

然后就可以取圖片了,這里要注意的是,inSampleSize 可能小於0,必須做判斷。


實現步驟:

第一步:BitmapFactory.Option

設置 inJustDecodeBoundstrue

第二步: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獲取圖片的寬和高&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
        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);
        // 計算縮放比&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
        int scale = (int) ((realHeight > realWidth ? realHeight : realWidth) / 100);
        if (scale <= 0)
        {
            scale = 1;
        }
        options.inSampleSize = scale;
        options.inJustDecodeBounds = false;
        // 注意這次要把options.inJustDecodeBounds 設為 false,這次圖片是要讀取出來的。&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
        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或更高才開始支持的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM