iOS图片系列一 图片的基本属性

news2024/11/26 16:48:47

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

一 图片的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端支持的显示格式

二 颜色空间与图片格式

常见的颜色空间有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的透明区域自动转变成白色导出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++面经:初始化全局变量和未初始化全局变量有什么区别

全局变量初始化而且初始值不为0,那么这样的全局变量是放在内存的.data段的,如果全局变量初始值为0或者未初始化,那么这样的全局变量是放在.bss段的。 考点: 考察C/C语言内存模型,.data,.bss段存放的内容。 …

Windows shell环境: 从git bash切换到msys2

文章目录 1. 目的2. msys2 环境 (Environment)3. 升级 MSYS2: 使用 pacman 滚动式升级整个系统4. 在 Windows Terminal 中增加显示 MSYS25. 使用 zsh6. VSCode 中的配置增加 MSYS2 终端配置 git 路径 7. 安装 C/C 依赖库安装 ag查询 bison 和 flex 的安装目录 8. References 1.…

ES6模块化规范

在没有ES6模块化规范前,有像AMD、CMD这样的浏览器模块化规范,还有像CommonJS这样的服务端模块化规范。 2015年,JS终于推出了官方的模块化规范,为了统一各种规范,我们简称ES6 模块化。 ES6目前作为JS的内置模块化系统&a…

Spring的创建和使用,存储和读取Bean总结

目录 Spring项目创建和使用流程 1.创建一个 Spring 项目 2.存储 Bean 3.读取 Bean ApplicationContext和BeanFactory的区别 通过注解存储 Bean对象 五大类注解的关系 Java程序标准分层 方法注解Bean 注入Bean对象的三种方式 1.属性注入 2.Setter注入 3.构造方法注入…

【Java数据结构】Map和Set

Map和Set 搜索树概念操作 - 查找操作 - 插入操作 - 删除cur没有左树(cur.left null)cur没有右树(cur.right null)cur既有左树也有右树(最困难的情况)替罪羊删除法 操作代码性能分析和 java 类集的关系 搜…

程序员困局:去大城市进大厂却买不了房,回老家又没有高薪工作…

对于在外打拼的程序员来说,难的是进大厂,而不是买不起房。 进大厂的程序员,能不能买得起房? 进大厂的程序员的薪资,还是相当可观的。以阿里P6为例,年薪50万,到手40万左右,刨去10万…

【C++学习】C++11——新特性 | 右值引用 | 完美转发

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! C11——新特性 | 右值引用 | 完美转发 👀列表初始化🦴 std::initializer_list…

收藏!网络行业主流的六大技术认证全科普

大家好,我是老杨。你的年终总结做完了没?还没做完,点击“年终总结”,拿个模板,快速完成。 很多人在年末都会有列一个新年愿望清单,写写来年想要完成的事情。 不少网工在这两年的就业环境之下,…

Nginx-部署2个vue项目(多个项目)-二级域名设置代理

前言 最近在实际开发过程中,需要在服务器部署2个项目。需要nginx二级域名。 开始时候在网上查了一圈,各有说法,不是很全,很头大。这里把自己成功的二级域名代理记录一下。 网上有很多文章说要该router.js文件,要该vu…

自动备份交换机的配置到远程服务器

环境 交换机配置修改后及时备份相关配置,每次配置变化后需要在1分钟后自动进行保存,并且将配置上传至FTP服务器;每隔30分钟,交换机自动把配置上传到FTP服务器 配置命令: [huawei]set save-configuration delay 1 //…

单片机外围电路:电阻之上下拉电阻

1.基础概念 上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。 2.基础应用 上下拉电阻在数字电路中使用,为了好理解一点,可把上下拉电阻大致分为两种…

货币简史:从物物交换到数字货币

货币简史 1. 物物交换阶段2. 一般等价物阶段3. 信用货币阶段4. 电子货币阶段5. 数字货币阶段 金钱是什么时候产生的呢,这取决于你如何定义金钱。 费利克斯马丁(FelixMartin)名为《金钱:未授权的传记》(Money:An Unauthorized Biography)书中…

19c rac环境修改pubic, vip,scan ip步骤

19c rac环境第一次修改public、vip和scan ip,和11g还是稍有不同。首先说明下环境 具体步骤如下 1、修改public地址,关闭实例后使用root用户操作 [rootdb1 ~]# ./oifcfg getif bond0 172.20.30.0 global public bond2 100.100.100.0 global clust…

【JVM】JVM堆内存(heap)详解

文章目录 前言一、堆内存划分二、为什么移除永久代?三、分代概念四、为什么分代?五、为什么survivor分为两块相等大小的幸存空间?六、JVM堆内存常用参数七、垃圾回收算法(GC,Garbage Collection)八、垃圾收…

java 反射及代理模式初步学习

java 反射及代理模式初步学习 0. 什么是反射? Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法&#xf…

小程序组件

swiper swiper 和 swiper-item 结合使用,, swiper有默认高度 300rpx 属性: autoplay : 自动播放circular : 循环播放indicator-dots : 显示指示点indicator-active-color : 轮播选中的颜色 &…

SpringBoot整合钉钉消息推送(四十四)

从头开始,并不意味着失败,相反,正是拥抱成功的第一步,即使还会继续失败 上一章简单介绍了 SpringBoot 发送邮件(四十三), 如果没有看过,请观看上一章 钉钉消息推送, 官方文档: https://open.dingtalk.com/document/gr…

3.结构化的数学思想

前言 今天在复习概率论的公理化过程中,我发现它的公理其实也是人为定义的,为什么我会这么想呢?这是因为我曾听过严伯均在为什么诺贝尔奖没有数学讲曾说过数学是一门无法证伪的学科,甚至不能算是科学,而诺贝尔设置这个…

超详细的Linux环境下使用git上传代码教程(gitee版)

git是一个版本控制器,我们使用它上传我们以前写过的代码给他进行托管,更为方便以后找到,同时也方便我们找到我们每次更改了什么。 创建仓库 创建完成后界面: 接下来复制我们创建的仓库的地址: 使用 git 命令行 安装…

BGP路由策略,IPV6

下一跳不变 从EBGP来的路由,传给|BGP S居时,下一跳不变 解决方案: 水平分割 ∷:AS内防环 从|BGP来的路由,不会传给IBGP邻居 1全互联 2路由反射器 3联盟 BGP选路原则: 当BGP 由表存在多条相同路由,会产生多个转发路径,BGP 会根据这些路由的属性,选择一条最优…