android 图片压缩之 injustdecodebounds
2016-09-13 11:03
344 查看
转载自:博客园 博主 减掉一斤是一斤
今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候
就要用BitmapFactory.Options这个东东了,Options里主要有两个参数比较重要.
第一步就是获取图片的宽高
这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,
然后第二步就是设置合适的压缩比例inSampleSize,这时候获得合适的Bitmap.这里我画了简单的流程图,如下:
主要是通过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);
具体实现:
补充:
保存bitmap 到文件
/**
* 保存bitmap到sd卡filePath文件中 如果有,则删除
* @param bitmap
* @param filePath :图片绝对路径
* @return
*/
public static boolean saveBitmap2file(Bitmap bitmap,String filePath){
if (bitmap==null){
return false;
}
//压缩格式
CompressFormat format = CompressFormat.JPEG;
int quality =100;
OutputStream stream=null;
File file=new File(filePath);
File dir=file.getParentFile();
if (!dir.exists()){
dir.mkdirs();//创建父目录
}
if (file.exists()){
file.delete();
}
try {
stream = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return bitmap.compress(format,quality,stream);
}在由 bitmap 保存到 文件的过程中需要的还可以使用 Bitmap.compress 方法 对图片进行进一步的压缩
public boolean compress(CompressFormat format, int quality, OutputStream stream) {}quality :0~100 表示压缩率,如:当quality=30,表示压缩率为70% ; 即quality 值越小图片越失真
网友观点:
Android的JPG保存方法降质比较厉害,保存大概3、4次后出现明显马赛克,保存PNG虽然能防止但速度太慢,所以我公司现在保存JPG都是调自己写的一套JPG库来保存
参考资料:多次compress 傲娇Android二三事之天不长地不久的Bitmap.compress
今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候
就要用BitmapFactory.Options这个东东了,Options里主要有两个参数比较重要.
options.inJustDecodeBounds = false/true; //图片压缩比例. options.inSampleSize = ssize;我们去解析一个图片,如果太大,就会OOM,我们可以设置压缩比例inSampleSize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,
第一步就是获取图片的宽高
这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,
然后第二步就是设置合适的压缩比例inSampleSize,这时候获得合适的Bitmap.这里我画了简单的流程图,如下:
主要是通过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; } }------------------------
补充:
保存bitmap 到文件
/**
* 保存bitmap到sd卡filePath文件中 如果有,则删除
* @param bitmap
* @param filePath :图片绝对路径
* @return
*/
public static boolean saveBitmap2file(Bitmap bitmap,String filePath){
if (bitmap==null){
return false;
}
//压缩格式
CompressFormat format = CompressFormat.JPEG;
int quality =100;
OutputStream stream=null;
File file=new File(filePath);
File dir=file.getParentFile();
if (!dir.exists()){
dir.mkdirs();//创建父目录
}
if (file.exists()){
file.delete();
}
try {
stream = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return bitmap.compress(format,quality,stream);
}在由 bitmap 保存到 文件的过程中需要的还可以使用 Bitmap.compress 方法 对图片进行进一步的压缩
public boolean compress(CompressFormat format, int quality, OutputStream stream) {}quality :0~100 表示压缩率,如:当quality=30,表示压缩率为70% ; 即quality 值越小图片越失真
网友观点:
Android的JPG保存方法降质比较厉害,保存大概3、4次后出现明显马赛克,保存PNG虽然能防止但速度太慢,所以我公司现在保存JPG都是调自己写的一套JPG库来保存
参考资料:多次compress 傲娇Android二三事之天不长地不久的Bitmap.compress
相关文章推荐
- Android获取图片指定大小的缩略图--inJustDecodeBounds的使用
- Android-injustdecodebounds实现对大图压缩
- 预压缩处理图片 options.inJustDecodeBounds = true
- android 的injustdecodebounds
- Android中的inJustDecodeBounds
- android 的injustdecodebounds
- 大图片溢出 inJustDecodeBounds
- android 的injustdecodebounds
- 图片缩放 inJustDecodeBounds inSampleSize
- [转]android 的injustdecodebounds
- android 的injustdecodebounds
- 图片缩放 inJustDecodeBounds inSampleSize matrix
- android 的injustdecodebounds
- android 的injustdecodebounds
- Android图片缩放,压缩总结(inSampleSize,Matrix比较)
- Android图片缩放,压缩总结(inSampleSize,Matrix比较)
- 对BitmapFactory.Options.inJustDecodeBounds的理解
- BitmapFactory.decodeStream使用inJustDecodeBounds参数解析网络流的问题
- Android图片尺寸与质量压缩你用对了吗?inSampleSize与quality的浅析
- Bitmap的inJustDecodeBounds属性