主要是通过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);
import java.io.File;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.ImageView;
/**
* 获取图片和视频的缩略图
* 这两个方法必须在2.2及以上版本使用,因为其中使用了ThumbnailUtils这个类
*/
public class AndroidTestActivity extends Activity {
private ImageView imageThumbnail;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageThumbnail = (ImageView) findViewById(R.id.image_thumbnail);
String imagePath = Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ File.separator
+ "photo"
+ File.separator
+ "yexuan.jpg";
imageThumbnail.setImageBitmap(getImageThumbnail(imagePath, 60, 60));
}
/**
* 根据指定的图像路径和大小来获取缩略图
* 此方法有两点好处:
* 1. 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,
* 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。
* 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使
* 用这个工具生成的图像不会被拉伸。
* @param imagePath 图像的路径
* @param width 指定输出图像的宽度
* @param height 指定输出图像的高度
* @return 生成的缩略图
*/
private Bitmap getImageThumbnail(String imagePath, int width, int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
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();
}
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);
import java.io.File;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.ImageView;
/**
* 获取图片和视频的缩略图
* 这两个方法必须在2.2及以上版本使用,因为其中使用了ThumbnailUtils这个类
*/
public class AndroidTestActivity extends Activity {
private ImageView imageThumbnail;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageThumbnail = (ImageView) findViewById(R.id.image_thumbnail);
String imagePath = Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ File.separator
+ "photo"
+ File.separator
+ "yexuan.jpg";
imageThumbnail.setImageBitmap(getImageThumbnail(imagePath, 60, 60));
}
/**
* 根据指定的图像路径和大小来获取缩略图
* 此方法有两点好处:
* 1. 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,
* 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。
* 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使
* 用这个工具生成的图像不会被拉伸。
* @param imagePath 图像的路径
* @param width 指定输出图像的宽度
* @param height 指定输出图像的高度
* @return 生成的缩略图
*/
private Bitmap getImageThumbnail(String imagePath, int width, int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
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();
}