咱们在android开发中会经常用到图片,那么就会经常遇到图片格式上的选择问题
JPEG:有损压缩格式,不支持透明。
PNG:无损压缩位图图形格式,支持透明背景和Alpha透明度
BMP:Window系统中的图片格式,无任何压缩,所以意味着BMP文件会是巨大的
GIF:位图图形格式,背景可透明,无损压缩可使用多帧实现动画效果,最多只能存储256种不同的颜色
WebP:google提供,可选择性的有损或者无损压缩,支持透明,支持动画,无损webp支持alpha通道,缺点是android4.0才开始支持webp,4.2.1开始支持无损webp
至于WebP,据 A new image format for the Web 官方说明介绍,webp无损压缩会比png小26%,有损webp会比jpeg小25%到34%,主要得益于webp更优的压缩算法
至于单位像素占用字节数(1byte=8bites):
根据官方说明,支持的图片格式有JPEG、PNG、BMP、GIF、WebP
JPEG:有损压缩格式,不支持透明。
PNG:无损压缩位图图形格式,支持透明背景和Alpha透明度
BMP:Window系统中的图片格式,无任何压缩,所以意味着BMP文件会是巨大的
GIF:位图图形格式,背景可透明,无损压缩可使用多帧实现动画效果,最多只能存储256种不同的颜色
WebP:google提供,可选择性的有损或者无损压缩,支持透明,支持动画,无损webp支持alpha通道,缺点是android4.0才开始支持webp,4.2.1开始支持无损webp
文件大小:
对于JPEG、PNG、BMP、Gif的文件大小对比可以参考StackOverFlow的帖子:至于WebP,据 A new image format for the Web 官方说明介绍,webp无损压缩会比png小26%,有损webp会比jpeg小25%到34%,主要得益于webp更优的压缩算法
图片内存计算:
内存=图片长度*图片宽度*单位像素占用的字节数:比如一张100*100的图片,单位像素占用4字节,那么就是100*100*4=40000字节至于单位像素占用字节数(1byte=8bites):
ALPHA_8 | 只有ALPHA占用8bites,没有RGB值,每像素占用1字节 |
ARGB_4444 | ARGB四个值各占用4bites,每像素占用2字节,质量太差,已弃用 |
ARGB_8888 | ARGB各占用8bites,每像素占用4字节 |
RGB_565 | 无APLHA,RGB分别占用5、6、5bites,每像素占用2字节 |
Bitmap内存管理:
android Bitmap内存管理演变过程在android2.2以及更低版本中,当GC开始工作时,app线程是停止工作的,会导致性能问题,Android2.3增加了GC并发,就意味着Bitmap不被引用了之后,很快就会被GC回收。
在android2.3.3及更低版本中,位图的像素数据存储在本机内存中,这个和存储在Dalvik堆中的位图是分开的,所以它的释放是不可控制的,可能会导致app超出内存限制甚至崩溃,从android3.0开始,像素数据和位图都存储在Dalvik堆中android各版本Bitmap内存管理
在android2.3.3及更低版本中,建议使用recycle(),不过只有保证Bitmap不再使用的情况下。
在android3.0中及更高版本中,使用BitmapFactory.Options.inBitmap属性,可以实现位图重用,可以保存一个位图供后边使用
参考文档:
1.
Supported Media Formats
android官方支持媒体格式说明