前言
- 在深入理解图片底层原理的过程中,会接触到各种概念,今天我们简单梳理一下。
- 如果能帮上忙,请务必点赞加关注,这真的对我非常重要。
系列文章
- 《图形学 | 蓄势待发!说一说图片相关的那些概念》
- 《图形学 | 格物致知!PNG 除了无损压缩你还知道什么?》
- 《Android | 毫分缕析!说说图片加载的整个过程》
- 《Android | 老生常谈!屏幕适配原理 & 方案总结笔记》
目录
1. 存储形式
图像的主要存储形式分为:File、Stream、Bitmap。
2. 图片分类
2.1 有损压缩 & 无损压缩
所谓损失指的是图片的质量,根据压缩过程是否损失图片质量分为两种:
- 有损压缩(Lossy compression)
压缩过程中损失图片的一部分信息 / 质量,而这种损失是不可逆的。最常见的有损压缩手段是矢量量化,即按照一定的算法将颜色相似的一块区域合并为同一种颜色。
举例:JPEG。
- 无损压缩(Lossless Compression)
压缩过程中优化冗余数据,而这种优化不会造成图片质量损失。
举例:PNG。
2.2 位图 & 矢量图
-
位图(Bitmap,又称点阵图、栅格图)
- 通过像素阵列的排列来来显示图像;
- 像素是位图的最小单位,每个像素都有自己的颜色信息;
- 位图缩放会是增大 / 缩小单个像素,会出现失真(锯齿)。
举例:JEPG、PNG、GIF、WebP。
-
矢量图(Vector)
- 通过记录图像元素的形状和颜色的算法,根据算法运算来显示图像;
- 无限放大缩小不失真。
举例:SVG。
2.3 直接色 & 索引色
- 直接色(Index Colour)
像素数据数值本身就代表一种颜色,例如一个 ARGB 颜色类型的数值0xFFFF0000
就代表正红色。
- 索引色(Direct Colour)
像素数据本身不代表颜色,而是一个指向颜色索引表的索引号。索引色格式适用于图像颜色类型较少的情况,相对于直接色能够大大缩小文件大小。
引用自 https://developer.android.com/topic/performance/network-xfer —— Android Developers3. 色彩
3.1 色彩深度(Bit Depth)
表示像素能呈现的颜色数量,一般用数据位数表示。例如 8 bit 色彩深度,就是把每种颜色通道分为 256 种不同强度等级,所以 RGB 三种颜色通道加起来一共可以表示种颜色。
3.2 色彩空间(ColorSpace)
又称色域(Color Gamut),表示像素能涵盖的色彩范围,主要有以下几种:
- CIE XYZ
1931 年,国际照明委员会(CIE)在测得三原色的准确波长后,定义了一个 XYZ 色彩空间,第一次表示出了人类肉眼可见的色彩范围。
引用自 https://baike.baidu.com/item/%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4 —— 百度百科经过数学运算之后可以转换为这张更直观的 CIE XY 色度图:
引用自 https://baike.baidu.com/item/%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4 —— 百度百科- sRGB
目前互联网上最常见的色域标准,大概覆盖了 35% 的CIE XYZ 色彩空间。
- YUV
主要用于表示彩色视频的色彩空间(节省带宽,每个像素位深最大不超过 12 位,最小为 6位)
- CMYK
主要用于彩色印刷的色彩空间。
引用自 https://baike.baidu.com/item/%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4 —— 百度百科4. 文件格式
Editting...
GIF位深为8位,所以文件通常较小,而且支持alpha通道以及动画
Webp在等质量大小上和等大小清晰度上都占极大优势
SVG由xml描述,可以适配任何分辨率而保证图像不失真
所以图片压缩主要是针对PNG和JPEG这两种格式
png压缩采用libpng进行压缩,主要场景为编译阶段以及api层调用
jpeg压缩采用libjpeg(Android7后是)进行压缩,主要场景为api层调用
推荐阅读
- 密码学 | Base64是加密算法吗?
- 算法面试题 | 回溯算法解题框架
- 算法面试题 | 链表问题总结
- 计算机网络 | 图解 DNS & HTTPDNS 原理
- Android | 带你探究 LayoutInflater 布局解析原理
- Android | 适可而止!看 Glide 如何把生命周期安排得明明白白
- Android | View & Fragment & Window 的 getContext() 一定返回 Activity 吗?
网友评论