iOS图片颜色空间深究

图片在项目的开发中使用频率很高,但是绝大部分都是作为普通的展示或者偶尔需要裁剪,并不需要对图片做什么特别的处理,最近做了一个项目对于图片的需求功能比较多,踩了很多坑的同时也对图片的使用有了更深的理解,整理下来以便日后回顾。

一 图片的RGB通道与色深

我们都知道图片由一个个点组成,一个点称为一个位图(bitmap 栅格图),以RGB颜色空间为例,一个位图可能由单通道、三个(Red Green Blue)或者四个通道(Red Green Blue 外加一个Alpha通道)组成,一个通道可能有8bit或者16bit,如果一个Red通道有8Bit,那么取值范围就是0-255,一共可以有256个数值。

以我们最常见的32位RGBA图片来说,每个点(bitmap)包含四个通道:Red通道、Green通道、Blue通道和Alpha通道,每个通道由8bit组成,取值范围为0-255,共有256个值,所以可以组成256256256个颜色显示,也就是高达1677万多色,这已经足够满足我们绝大多数的应用场景了了。其自带的alpha通道在使用的过程中会分别乘以RGB每个通道的值,作为最终显示的数值,使得RGBA图片的使用更加灵活。

另外两个常用的术语,bpp,bpc:
bpp:(bits-per-pixel)一般指像素深度。 像素深度是指存储每个像素所用的位数,像素深度决定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。
bpc:(bits-per-channel)位深度,指每个通道占多少位,比如8bpc,指的就是个通道可能有8bit,那么取值范围就是0-255,一共可以有256个数值,如果是16bpc就是指每个通道有16位。
32位RGBA格式图片的每个像素点有4个通道,每个通道有8位,所以就是4*8=32bpp,8bpc

同理还有其他格式的:(该截图为是IOS端集成的Quzrtz 2D引擎官方文档截图,Quzrtz 2D 是对定制的2D向量和图像呈现提供支持的本地绘制引擎,旨在说明bpp与bpc的使用)
在这里插入图片描述

二 颜色空间与图片格式

常见的颜色空间有RGB\CMY\HSV\HSL\Lab\YUV等颜色空间,在IOS开发中绝大多数都是使用的RGB颜色空间,如果有需要对图片做特殊处理,比如调整图片的色相或者明度等,会用到HSL等空间,其他大部分场景我们都是在跟RGB空间打交道,

先说一点图片的基本知识,图片格式大多为png,jpeg,bmp,tiff等等,jpeg和png在我们使用的比较多,简单记录一下jpeg和png这两中格式的处理。

jpeg/jpg使用我们所谓的有损压缩格式,简单的说就是经过公式计算,图片由RGB色彩空间转换到YUV色彩空间,然后对YUV分量分别采样,因为人眼对亮度变换的敏感度比色彩变换的敏感度高,所以采样权重更倾向与Y分量,Y分量采样4次,U,V分量各采样一次,这个时候已经开始出现精度损失,然后经过分块、余弦变换、量化等过程,最终编码为图片,其中余弦变换和量化的过程是丢失精度的根源,简单来说就是类似声音过滤一样去掉人耳听不见的超声波和次声波,图片在处理的时候会去掉人眼感知不到的高频率、细微的颜色变化,以此来降低图片大小,但是人眼并不看不出来区别,所以称为有损压缩,好处是大幅降低图片大小,所以很多时候用在web端以提高网页加载速度及响应式反馈,图片质量也并不会有什么损失。不过同样也是因为jpeg可压缩,,jpeg并不是适合作为展示高清晰度图片的载体。

Png格式的压缩原理是基于预测编码和差分编码的,所以不会损失图片质量和精度,所以经常用在对于图片精度和质量有需求的领域。更重要的是Png提供256个透明层次,从而消除锯齿,而且提供alpha通道,使得可以支持图像的透明度,如果源文件里有空白区域,导出的图片相应位置就是空白,什么都没有,而jpeg的透明区域自动转变成白色导出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,命名空间是一种将全局作用域划分为不同部分的机制,用于避免命名冲突和组织代码。在iOS开发中,常见的命名空间有以下几种: 1. 全局命名空间:C++中所有未显式放置于其他命名空间的代码都位于全局命名空间中。在iOS开发中,全局命名空间主要用于定义全局常量、枚举类型和函数等。 2. 标准库命名空间:C++标准库中的类、函数和类型定义通常位于std命名空间中。在iOS开发中,如果你使用了C++标准库的功能,你需要在代码中使用std::前缀来访问这些定义。 3. 自定义命名空间:为了更好地组织代码并避免命名冲突,你可以创建自己的命名空间。例如,在iOS开发中你可以创建一个自定义的命名空间来包含你的应用程序的所有类和函数。 下面是一个简单的示例,展示了如何使用自定义命名空间来组织代码: ```cpp // 在头文件中定义命名空间 namespace MyApp { // 在命名空间中定义类 class MyClass { public: void doSomething(); }; } // 在源文件中实现命名空间中的函数 namespace MyApp { void MyClass::doSomething() { // 实现代码 } } // 在其他文件中使用命名空间中的类和函数 int main() { MyApp::MyClass obj; obj.doSomething(); return 0; } ``` 在上面的示例中,我们创建了一个名为MyApp的命名空间,并在其中定义了一个名为MyClass的类和一个名为doSomething的成员函数。在其他文件中,我们可以使用`MyApp::`前缀来访问这些定义。 需要注意的是,在Objective-C和Swift中,通常会使用模块化的方式来组织代码,而不是直接使用C++的命名空间。因此,在iOS开发中,你可能会更多地使用Objective-C的命名规范和Swift的模块化机制来组织代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值