图片的编码格式
|--reference
https://www.cnblogs.com/popfisher/p/6959106.html
|--1.颜色模型
|---RGB(ARGB)
RGB色彩模式是工业界的一种颜色标准, 是通过对红(R), 绿(G), 蓝(B)三个颜色通道的变化
以及它们相互之间的叠加来得到各式各样的颜色的, RGB即是代表红, 绿, 蓝三个通道的颜色,
这个标准几乎包括了人类视力所能感知的所有颜色, 是目前运用最广的颜色系统之一。
还有(android)包含透明度Alpha的颜色模型, 即ARGB。
|---YUV
YUV, 分为三个分量, "Y"表示明亮度(Luminance或Luma), 也就是灰度值;
而"U"和"V" 表示的则是色度(Chrominance或Chroma),
作用是描述影像色彩及饱和度, 用于指定像素的颜色。
YUV的原理是把亮度与色度分离, 研究证明, 人眼对亮度的敏感超过色度。
利用这个原理, 可以把色度信息减少一点, 人眼也无法查觉这一点。
主要用于电视系统以及模拟视频领域, 它将亮度信息(Y)与色彩信息(UV)分离,
没有UV信息一样可以显示完整的图像, 只不过是黑白的,
这样的设计很好地解决了彩色电视机与黑白电视的兼容问题
YUV的存储中与RGB格式最大不同在于, RGB格式每个点的数据是连继保存在一起的。
即R, G, B是前后不间隔的保存在2-4byte空间中。而YUV的数据中为了节约空间,
U, V分量空间会减小。每一个点的Y分量独立保存, 但连续几个点的U, V分量是保存在一起的,
(反正人眼一般也看不出区别).这几个点合起来称为macro-pixel, 这种存储格式称为Packed格式。
另外一种存储格式是把一幅图像中Y, U, V分别用三个独立的数组表示。这种模式称为planar模式。
|---CMYK
CMYK也称作印刷色彩模式, 顾名思义就是用来印刷的。
印刷四分色模式是彩色印刷时采用的一种套色模式, 利用色料的三原色混色原理,
加上黑色油墨, 共计四种颜色混合叠加, 形成所谓"全彩印刷"。四种标准颜色是:
C:Cyan = 青色, 又称为'天蓝色'或是'湛蓝'
M:Magenta = 品红色, 又称为'洋红色'
Y:Yellow = 黄色
K:Key(blacK) = 定位套版色(黑色),
有些文献解释说这里的K指代Black黑色, 且为了避免与RGB的Blue蓝色混淆不用B而改称,
虽然这是一种有用的助忆, 但事实上这种说法是不正确的。
CMYK和RGB相比有一个很大的不同:RGB模式是一种发光的色彩模式,
在一间黑暗的房间内仍然可以看见屏幕上的内容;CMYK是一种依靠反光的色彩模式,
我们是怎样阅读报纸的内容呢?是由阳光或灯光照射到报纸上, 再反射到我们的眼中, 才看到内容。
它需要有外界光源, 如果你在黑暗房间内是无法阅读报纸的。只要是在印刷品上看到的图像,
就是CMYK模式表现的。比如期刊, 杂志, 报纸, 宣传画等, 都是印刷出来的, 那么就是CMYK模式的了。
|--2.RGB在计算机中颜色值的数字化编码
在不考虑透明度的情况下, 一个像素点的颜色值在计算机中的表示方法有以下3种:
浮点数编码:比如float: (1.0, 0.5, 0.75), 每个颜色分量各占1个float字段,
其中1.0表示该分量的值为全红或全绿或全蓝;
24位的整数编码:比如24-bit:(255, 128, 196), 每个颜色分量各占8位, 取值范围0-255,
其中255表示该分量的值为全红或全绿或全蓝;
16位的整数编码:比如16-bit:(31, 45, 31), 第1和第3个颜色分量各占5位, 取值范围0-31,
第2个颜色分量占6位, 取值范围0-63;
在Java中, float类型的变量占32位, int类型的变量占32位, short和char类型的变量都在16位,
因此可以看出, 用浮点数表示法编码一个像素的颜色, 内存占用量是96位即12字节;
而用24位整数表示法编码, 只要一个int类型变量, 占用4个字节(高8位空着, 低24位用于表示颜色);
用16位整数表示法编码, 只要一个short类型变量, 占2个字节;因此可以看出采用整数表示法编码颜色值,
可以大大节省内存,当然, 颜色质量也会相对低一些。在Android中获取Bitmap的时候一般也采用整型编码。
|--3.Android中RGB编码格式(整型编码)
RGB888(int):R, G, B分量各占8位
RGB565(short):R, G, B分量分别占5, 6, 5位
RGB555(short):RGB分量都用5位表示(剩下的1位不用)
ARGB8888(int):A, R, G, B分量各占8位
ARGB4444(short):A, R, G, B分量各占4位
回想一下Android的BitmapConfig类中, 有ARGB_8888, ARGB_4444, RGB565等常量,
现在可以知道它们分别代表了什么含义。同时也可以计算一张图片在内存中可能占用的大小,
比如采用ARGB_8888编码载入一张1920*1200的图片, 大概就会占用1920*1200*4/1024/1024=8.79MB的内存。
|--4.降低要显示的图片色彩质量
采用低内存占用量的编码方式, 比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存
1920*1200的图片:
ARGB_8888:1920*1200*4/1024/1024=8.79MB
ARGB_4444, RGB565:1920*1200*2/1024/1024=4.39MB
|--总结
在Android中, 对图片的使用一定要关注, 大多数情况下, 占用内存多,
OOM发生都是因为图片资源使用不当。不要盲目加一个大图到Android项目中,
能使用绘制实现就不要加一个图片资源。有些时候, 在不影响用户体验的情况下,
可以降低图片素材质量, 比如不需要透明度的就不要, 有些透明度用肉眼看不出来。
eg: 一张图片占用多少内存(800*600 分辨率 编码格式:)
1. 图片占用内存的计算公式:图片高度 * 图片宽度 * 一个像素占用的内存大小
2. 图片占用内存是:800 * 600 * 4 byte = 1875KB = 1.83M
4byte是跟图片的编码格式有关系
eg: ARGB: 0xff223344
0xff = alpha,
0x22 = red color,
0x33 = green color,
0x44 = blue color,
|--图片格式:
1 Webp格式
2 BMP格式
3 PCX格式
4 TIF格式
5 GIF格式
6 JPEG格式
7 TGA格式
8 EXIF格式
9 FPX格式
10 SVG格式
11 PSD格式
12 CDR格式
13 PCD格式
14 DXF格式
15 UFO格式
16 EPS格式
17 AI格式
18 PNG格式
19 HDRI格式
20 RAW格式
21 WMF格式
22 FLIC格式
23 EMF格式
24 ICO格式
eg:
SVG格式
SVG可以算是目前最最火热的图像文件格式了, 它的英文全称为Scalable Vector Graphics,
意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),
由World Wide Web Consortium(W3C)联盟进行开发的。
严格来说应该是一种开放标准的矢量图形语言, 可让你设计激动人心的, 高分辨率的Web图形页面。
用户可以直接用代码来描绘图像, 可以用任何文字处理工具打开SVG图像,
通过改变部分代码来使图像具有交互功能, 并可以随时插入到HTML中通过浏览器来观看。
eg:在嵌入式设备中常直接将图片或者绘制图像写入到framebuffer中显示
常见方式为 linuxfb, direct fb(QT)
查看/dev/fbx