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;

    }

}

效果图:

android - 使用缩略图

 


这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在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或更高才开始支持的。

你可能感兴趣的:(android)