位图模式,bitmap颜色位数是1位
灰度模式,bitmap颜色位数是8位,和256色一样
RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红、绿、蓝三个字节
CMYK模式,bitmap颜色位数是32位 在CMYK模式下,一个像素对应的是青、品、黄、黑四个字节
图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8)
例如:一幅640*480图像分辨率、RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24/8=921600字节=900KB(1KB=l千字节=1024字节)。
注: 一个图像文件占的磁盘空间大小还和磁盘的文件格式有关。如:NTFS最小单位为4KB 所以图像文件大小肯定是4KB的倍数。但是有图图片压缩算法的存 在,图片文件在保存时,体积要比在内存的大小小得多,如640x480的图片文件大小一般只在200K~300K。这也是为什么,加载几MB的图片文件, 会导致JVM内存溢出,导致OutofMemoryException的原因。
由上面的公式,我们可以得出,加载的图片所占的内存大小,取决于其分辨率和颜色数。
我们再来看看Google官方的介绍:
这个已经非常的明白了,我们VM的app进程所获得的内存只有区区的16MB,普普通通的5MP摄像头拍出来的图片,直接加载,将占用接近19MB的内存。可见,不进行压缩,内存将会直接溢出。
再了解一下,android读取解析图片的方式,基本与Java的方式类型,通过文件输入流,然后进行解码,再转成图片格式;
当然google的 android也为我们封装好了若干方法,来方便快捷地完成这项工作,如ImageView的 setImageBitmap,setImageResource,BitmapFactory的decodeResource等,但是尽量不要使用 setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些 函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存;
因此,改用先通过 BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,加载显示。 decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用 java层的createBitmap,从而节省了java层的空间。
public static Bitmap readBitmapAutoSize(String filePath, int outWidth, int outHeight) {
//outWidth和outHeight是目标图片的最大宽度和高度,用作限制
FileInputStream fs = null;
BufferedInputStream bs = null;
try {
fs = new FileInputStream(filePath);
bs = new BufferedInputStream(fs);
BitmapFactory.Options options = setBitmapOption(filePath, outWidth, outHeight);
return BitmapFactory.decodeStream(bs, null, options);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bs.close();
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
private static BitmapFactory.Options setBitmapOption(String file, int width, int height) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
//设置只是解码图片的边距,此操作目的是度量图片的实际宽度和高度
BitmapFactory.decodeFile(file, opt);
int outWidth = opt.outWidth; //获得图片的实际高和宽
int outHeight = opt.outHeight;
opt.inDither = false;
opt.inPreferredConfig = Bitmap.Config.RGB_565;
//设置加载图片的颜色数为16bit,默认是RGB_8888,表示24bit颜色和透明通道,但一般用不上
opt.inSampleSize = 1;
//设置缩放比,1表示原比例,2表示原来的四分之一....
//计算缩放比
if (outWidth != 0 && outHeight != 0 && width != 0 && height != 0) {
int sampleSize = (outWidth / width + outHeight / height) / 2;
opt.inSampleSize = sampleSize;
}
opt.inJustDecodeBounds = false;//最后把标志复原
return opt;
}
BitmapFactory.Options opts = new BitmapFactory.Options(); //设置图片的DPI为当前手机的屏幕dpi opts.inTargetDensity = ctx.getResources().getDisplayMetrics().densityDpi; opts.inScaled = true;
if(!bmp.isRecycle() ){ bmp.recycle() //回收图片所占的内存 system.gc() //提醒系统及时回收
相关推荐
Android有效解决加载大图片时内存溢出的问题
android加载大量图片内存溢出的三种解决办法
android 解析加载图片是一个常用的技术 但是如何优化 这是一个问题 想要用户体验好必须加载速度快 稳定 那么你看了这个代码就明白了
本篇文章是介绍 android 解决ViewPager加载大量图片内存溢出问题,并附有代码实例,希望能帮到有需要的小伙伴
分虽然多了点,但是项目...图片过大内存溢出:在图片读取是处理里图片,解决了溢出问题 项目下载后,直接导入就可以运行,是2.2的版本,有个插件android-async-http-1.4.4.jar,可能要配置下,还有服务器,端口是8080
android 显示大的gif图片 能解决内存溢出的问题 用jni实现
android加载大图片的时候防止内存溢出的分析
很久没上传资源了,今天特意把自己收集的,自己用过的资源上传。Android 异步加载网络的图片,开始的时候显示默认的,当加载完成图片后替换掉原来的默认图片,绝对不会发生内存溢出的问题。
主要介绍了Android加载图片内存溢出问题解决方法,本文讲解使用BitmapFactory.Options解决内存溢出问题,需要的朋友可以参考下
比较傻瓜式的 解决了 listview 中图片太多 引起的 内存溢出问题。代码很简单 非常容易掌握
Android有效解决加载大图片时内存溢出的问题
一个android小工程,里面有我自己写的一个工具类,可以轻松避免加载图片列表内存溢出,分享给需要的朋友,工程使用android 1.6SDK完成
首先解析一下基本的知识:位图模式,bitmap颜色位数是1位灰度模式,bitmap颜色位数是8位,和256色一样 首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 ...
* 使用SubsamplingScaleImageView实现局部加载超大图片 巨大图片等. * 自带图片手势缩放和双击放大缩小等功能 * 有效解决 viewpager+fragment 内存溢出OOM
android加载大图片oom是常遇到的问题,此资源加载前将图片进行缩放,按缩放比例加载缩放后的图片来解决oom问题。Gallery和ImageSwitcher配合展示图片
ListView异步加载图片和文字,避免内存溢出和滑动效率.
实现图片压缩,可以节约内存,应用场合:ListView异步加载大量网络图片时,可以适当压缩显示,可以有效防止内存溢出,适合新手学习之用,gb编码
但是如果图片多了就会遇到内存溢出的情况,及时你对图片做了缩放处理但是图片张数多了还是一样的会内存溢出。所以这个时候就需要我们动态的释放和加载图片资源。附件中是小弟根据自己的想法实现的动态加载和释放图片...