关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解

A:透明度

R:红色

G:绿

B:蓝

Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位

Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位

Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位

Bitmap.Config ALPHA_8:每个像素占四位,只有透明度,没有颜色。

一般情况下我们都是使用的ARGB_8888,由此可知它是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。假设有一张480x800的图片,如果格式为ARGB_8888,那么将会占用480x800x4/1024=1525KB的内存。

对于jpeg,图片压缩成此种格式的时候有压缩比率,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。比如可以把1.37Mb的BMP位图文件压缩至20.3KB。

其实由于jpeg格式是有损压缩格式,因此同样大小的图片,就算参数完全相同的情况下,保存后的大小也是有很大差异的,因此只能估算最大值和最小值,无法在没有实际输入的情况下算出输出大小。

而在估算时,起到主要影响因素的包括以下几点(可能不全,但一般够用了):

  1. 图片像素尺寸

  2. 色彩数——影响解压后的每像素字节数

  3. 品质——分11级,0时图片变化最明显,体积也最小,这个主要影响压缩率;

    8级一般是比较推荐的等级,不对比的情况下基本看不出质量损失

    有些软件用百分比形式映射,有些软件从1开始因此最大是12

  4. 色彩分布——这个对压缩的影响很大,是接近估值最小值还是估值最大值几乎都受他影响,是造成没有准确值只有估值的最大变数

  5. 至于基线、差值、是否连续等优化,对最终体积是有影响,但相比于品质的压缩率在图片不是特别小的情况下影响可以忽略

说完这些简单的理论,接着说说怎么估算和误差大小。

    1. 首先是用图片像素尺寸和色彩数,我们能算出图片在内存中的体积

      Size=Width * Height * 每像素字节数

      这里每像素字节数很好理解,不懂可以百度,这里给几个常用的,照片一般是第一个:
      RGB(888) - 3字节,RGB(565) - 2字节,256色 - 1字节,16色-1/2字节,黑白-1/8字节

    2. 之后就是依据品质和图片大小推测压缩率范围

      这个比较复杂,只能经验性估值,这里只介绍影像压缩率的几个变量:

      a. 图片越小压缩率越小,并逐渐趋向当前质量的最小压缩率,
          图片越大压缩率越大,并逐渐趋于当前质量的最大压缩率,

      图片非常小时有可能比1还小;

      b. 品质越低压缩率越高,0级时一般会在200:1到30:1间浮动,大多集中在60:1附近

      8级时一般会在40:1到4:1间浮动,大多集中在16:1

      11级时一般会在16:1到2:1间浮动,大多集中在7:1附近

      c. 色彩分布越趋向于单色、连续颜色、重复色块时压缩比越高,极端时(比如纯白的图),就算图片很大,图片也只会有几百字节到几十K字节。

      3. 因此文件大小的范围就是前一步得到的 size * 估算的压缩率范围

图片处理之-Bitmap.Config,jpeg压缩与大小的更多相关文章

  1. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  2. Android图片缓存之Bitmap详解(一)

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. Bitmap: Bitmap是Android ...

  3. Android图片二进制与Bitmap、Drawable之间的转换

    Android图片二进制与Bitmap.Drawable之间的转换 Java代码  public byte[] getBitmapByte(Bitmap bitmap){      ByteArray ...

  4. 【Android开发】Bitmap的质量压缩法

    public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputS ...

  5. JS获取剪贴板图片之后的格式选择与压缩问题

    前言 某年某月的某一天,突然发现博客服务器上上传的图片都比较大,一些很小的截图都有几百kb,本来服务器带宽就慢,不优化一下说不过去. 问题细述 特别说明:本文代码因为只是用于我自己后台写markdow ...

  6. 移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

    现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片 ...

  7. Bitmap.Config 详解

    前言 Android是一个内存相当吃紧的系统,那么在做程序的过程中使用内存就需要相当谨慎,而我们接触最大的大对象估计就是Bitmap了,那么下面就根据Bitmap.Config值的介绍来看下Bitma ...

  8. 读取sd卡下图片,由图片路径转换为bitmap

    public Bitmap convertToBitmap(String path, int w, int h) {             BitmapFactory.Options opts = ...

  9. Bitmap.Config 说明 ALPHA_8 ARGB_4444 ARGB_8888 RGB_565

    这篇文章的目的是了解Bitmap.Config 你可以在使用这个方法的时候会遇到 Bitmap android.graphics.Bitmap.createBitmap(int width, int ...

随机推荐

  1. 关于App的一些迷思以及一些动画效果开源库的推荐

    http://www.open-open.com/lib/view/open1427856817396.html

  2. Ice_cream’s world III(prime)

    Ice_cream’s world III Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Othe ...

  3. Hibernate + MySQL中文乱码问题

    如果持久化的类中有包括了汉字的String对象,那么对应到数据库中汉字的部分就会是乱码.这主要是由于MySQL数据表的字符集与我们当前使用的本地字符集不相同造成的. 如果是windows系统,那么系统 ...

  4. C语言课程设计—图书管理系统

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<std ...

  5. UML视图(四)状态图

    以下是一个图书馆管理系统的状态图,非常典型,涵盖状态图的全部元素的使用,由于状态图相对照较简单,直接从看图就能非常好地掌握.假设想对状态图的元素严谨的概念进行了解,在图下方,有仔细的叙述. 看了上面的 ...

  6. 去除express.js 3.5中报connect.multipart() will be removed in connect 3.0的警告

     1 $ node app.js  2 connect.multipart() will be removed in connect 3.0  3 visit https://github.com/s ...

  7. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第七步---英雄要升级&amp;属性--解析csv配置文件

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  8. Android 查看通讯录Contacts是否发生变化

    目的:确定通讯录是否发生变化 根据:參见ContactsContract.RawContacts类中的VERSION常量,该值是仅仅读的,当通讯录发生变化时,都会使该值变化 方法:version值是相 ...

  9. hyper-v新内容

    摘自http://geek.csdn.net/news/detail/30249 继开源.NET,微软推出Hyper-V Container技术及Nano Server Hyper-V Server  ...

  10. z-index解决弹出层遮罩层覆盖子div不能显示输出的问题

    // 添加以下代码来进行测试: // ajax 发生错误,就会执行$('body').ajaxError(function(e, xhr, setting, text){    // e - even ...