位图是一个像素数组。
数组
将一张位图放大,
能够看到一个一个小格子,
每一个小格子就是一个像素: bash
512 * 512 * 4 * 8 = 6291456 bit ≈ 768 kb框架
在图片传输以前咱们会将位图进行压缩,
常见的压缩格式有 PNG & JPEG,这里不作深刻。
仍是刚刚的 512 * 512 的 lena 图,
工具
事实上,解压后的图片大小跟原始文件大小之间没有任何关系,
只与图片的像素数量有关。
spa
顺带一提,简介中的预览效果,
是自带的 JPG Decoder 对图片解压后的位图效果,
压缩文件不通过解压是没法预览的。
设计
滤镜是对像素数组进行的操做,
大体能够分为如下几类:3d
其中最简单的滤镜是进行逐像素操做。
滤镜设计师常常会调制一个叫作色表的图片: code
LUT 全称 LookUpTable,也称为颜色查找表,
它表明输入的像素数组跟输出的像素数组的映射关系。
好比一个像素的颜色值分别是 R1 G1 B1,
通过一次 LUT 操做:
cdn
LUT(R1) = R2
LUT(G1) = G2
LUT(B1) = B2
复制代码
这个像素就从一个颜色指定变成了另外一个颜色。
blog
因为组成像素的 RGB 颜色值范围始终在 0 ~ 255,
因此能够预先保存好全部映射关系,
输入原图以后按坐标匹配,可下降计算成本。
将 RGB 分别做为一个 XYZ 创建三维坐标系,
一个 3D LUT 就至关于将一个坐标系映射到
另外一个由 R1G1B1 构建的三维坐标系上:
第一件事比较好理解就是设定颜色默认值,
第二件事,二维数组有没有很耳熟,
没错,位图就是二维数组。
应用中使用的色表图,
实际上是设计师将滤镜效果应用到原生 RBG 坐标系,
三维坐标变换后由新的 RBG 数组生成的位图。
这个 LUT 文件生成出来了,怎么使用呢?
这时候有同窗就回答了,
前面说了,客户端有相关框架能够应用滤镜。
iOS 中与图像处理有关的框架:
CoreImage,Metal,OpenGL-ES,第三方框架 GPUImage 等,
它们均可以实现 LUT 映射。
因此,具体是怎么作的呢?
细心观察,
色表图每行每列各有 8 个小格,共64格。
咱们将 512 * 512 px 的色表图放大:
64 * 64 * 64
按照以前说法,一个 RGB 三维坐标系携带的数据量应该是:
256 * 256 * 256
应该是匹配不了的。
实际上是由于使用原坐标轴成本过高,
因此对每 4 个 RGB 进行了一次差值减小数据量。
对输入图片进行滤镜处理时,
先以颜色 (RGB) 的 B 值进行索引,
找到所属于的小格,
3DLC 是一款专门用来编辑 LUT 文件的强大工具。 -待续-