Bitmap的二次采样
2015-12-22 11:51
274 查看
Bitmap可以理解为通过一个bit数组来存储特定数据的一种数据结构。
一,二次采样的意义和目的;
当网络访问加载图片的时候,我们会遇到OOM异常。这是因为图片过大产生的。想要正确使用则需要分配更少的内存空间。
1、首先看下bitmapFactory.decodeFile(imageFile,option)和bitmapFactory.decodeFile(imageFile);
返回的都Bitmap对象。第一个方法法是根据根据图片地址和参数来返回一个Bitmap对象,第二个方法根据图片的url来返回Bitmap.
2、为了设置图片的裁剪要了解、BitmapFactory.Options.inSampleSize
来设置宽高的比例。(个人理解就是:拿到图片的以前宽高和现在的宽高,算出比例可以往下看下代码)
BitmapFactory.Options bop=new BitmapFactory.Options() ;
bop.inSampleSize=4;
BitmapFactory.decodeFile("path",bop);
3.还有一个关于BitmapFactory.Option.inJustDecodeBounds,true为不分配控件。
是为了管理系统是否为BitmapFactory.decodeFile("uri",option)返回的Bitmap分配空间。可以设置true和false.
看完上面的一个方法和两个属性。下面具体写下代码
/**
* 把二次裁剪封装一个方法。
*/
private Bitmap createImageThumbnail(String filepath,int newWidth,int newheight){
BitmapFactory.Options opts=new BitmapFactory.Options();
//此时并不会为 BitmapFactory.decodeFile(filepath, opts)分配空间
//因为已经设置了inJustDecodeBounds为fales;
opts.inJustDecodeBounds=true;
//此时opts已经包含了未裁剪的宽高
BitmapFactory.decodeFile(filepath, opts);
//得到原图片的宽高
int oldHeight=opts.outHeight;
int oldWidth=opts.outWidth;
//获取新旧图片的比例
int rationHeight=oldHeight/newheight;
int rationWidth=oldWidth/newWidth;
opts.inSampleSize=rationHeight>rationWidth?rationWidth:rationHeight;
//确定bitmap的单位字节像素
opts.inPreferredConfig=Config.RGB_565;
opts.inJustDecodeBounds=false;
Bitmap bm=BitmapFactory.decodeFile(filepath, opts);
return bm;
}
三、借鉴别人的
三)、图片格式占用内存的计算方法:以一张100*100px的图片占用内存为例
ALPHA_8:
图片长度*图片宽度
100*100=10000字节
ARGB_4444:
图片长度*图片宽度*2
100*100*2=20000字节
ARGB_8888:
图片长度*图片宽度*4
100*100*4=40000字节
RGB_565:
图片长度*图片宽度*2
100*100*2=20000字节
一,二次采样的意义和目的;
当网络访问加载图片的时候,我们会遇到OOM异常。这是因为图片过大产生的。想要正确使用则需要分配更少的内存空间。
1、首先看下bitmapFactory.decodeFile(imageFile,option)和bitmapFactory.decodeFile(imageFile);
返回的都Bitmap对象。第一个方法法是根据根据图片地址和参数来返回一个Bitmap对象,第二个方法根据图片的url来返回Bitmap.
2、为了设置图片的裁剪要了解、BitmapFactory.Options.inSampleSize
来设置宽高的比例。(个人理解就是:拿到图片的以前宽高和现在的宽高,算出比例可以往下看下代码)
BitmapFactory.Options bop=new BitmapFactory.Options() ;
bop.inSampleSize=4;
BitmapFactory.decodeFile("path",bop);
3.还有一个关于BitmapFactory.Option.inJustDecodeBounds,true为不分配控件。
是为了管理系统是否为BitmapFactory.decodeFile("uri",option)返回的Bitmap分配空间。可以设置true和false.
看完上面的一个方法和两个属性。下面具体写下代码
/**
* 把二次裁剪封装一个方法。
*/
private Bitmap createImageThumbnail(String filepath,int newWidth,int newheight){
BitmapFactory.Options opts=new BitmapFactory.Options();
//此时并不会为 BitmapFactory.decodeFile(filepath, opts)分配空间
//因为已经设置了inJustDecodeBounds为fales;
opts.inJustDecodeBounds=true;
//此时opts已经包含了未裁剪的宽高
BitmapFactory.decodeFile(filepath, opts);
//得到原图片的宽高
int oldHeight=opts.outHeight;
int oldWidth=opts.outWidth;
//获取新旧图片的比例
int rationHeight=oldHeight/newheight;
int rationWidth=oldWidth/newWidth;
opts.inSampleSize=rationHeight>rationWidth?rationWidth:rationHeight;
//确定bitmap的单位字节像素
opts.inPreferredConfig=Config.RGB_565;
opts.inJustDecodeBounds=false;
Bitmap bm=BitmapFactory.decodeFile(filepath, opts);
return bm;
}
三、借鉴别人的
三)、图片格式占用内存的计算方法:以一张100*100px的图片占用内存为例
ALPHA_8:
图片长度*图片宽度
100*100=10000字节
ARGB_4444:
图片长度*图片宽度*2
100*100*2=20000字节
ARGB_8888:
图片长度*图片宽度*4
100*100*4=40000字节
RGB_565:
图片长度*图片宽度*2
100*100*2=20000字节
相关文章推荐
- JSR 133
- Android子线程中更新UI
- 灭点
- java程序中加入@SuppressWarnings("serial")实践
- Redis学习笔记~Redis并发锁机制
- UML类图
- 原生的强大DOM选择器querySelector
- Xcode真机调试
- 高性能Java网络框架 MINA
- TCP/IP、Http、Socket的区别
- this.getServletContext().getRealPath("WEB-INF");
- 架设WEBIM
- 类的三大特性
- python datetime
- 快速掌握htop
- win10怎么卸载程序软件?几种卸载软件方法详细介绍
- iOS开发系列--地图与定位
- servlet-------HttpServletRequest对象
- poj 1389Area of Simple Polygons(矩形面积并)
- unity中世界坐标和绝对坐标之间的转换