iOS 金属。为什么简单地改变 colorPixelFormat 就会产生更明亮的图像?

2024-03-24

在 iOS 上的 Metal 中,默认的 colorPixelFormat 是bgra8Unorm。当我将格式更改为rgba16Float所有图像都变亮。为什么?

一个例子:

Artwork

MTKView有格式bgra8Unorm。 纹理映射四边形。创建的纹理SRGB=false.

MTKView有格式rgba16Float。 纹理映射四边形。创建的纹理SRGB=false.

Why is 一切更亮与rgba16Float。我的理解是SRGB=false暗示无伽玛校正在导入艺术品时完成。假设艺术品具有no gamma应用。

这里发生了什么?


如果您的作品有伽玛(根据您上传的第一张图像),如果您想在线性空间中使用它,则必须将其转换为线性伽玛。

这里发生的情况是,您在线性工作区中显示图像的伽马编码值,而不使用颜色管理或转换来转换这些值values.

但是:阅读您的一些评论,纹理不是图像而是 .svg 吗?您是否将颜色值转换为线性空间?

事情是这样的:RGB 值是毫无意义的数字,除非您定义这些 RGB 值与给定空间的关系。

例如,sRGB 中的 #00FF00 与 Adob​​e98 中的 #00FF00 是不同的颜色。在你的情况下,你是线性的,但是什么初选呢?还在使用 sRGB 原色吗? P3 初选?我没有看到真正的色调变化,所以我假设您在第二个示例中使用 sRGB 原色和线性传输曲线。

也就是说,顶部中间孩子的绿色衬衫的 RGB 值为 #8DB54F,标准化为 0-1,即 0.553 0.710 0.310 。这些数字通过他们自己不知道它们是否是伽马编码的。

sRGB、Y 和光之间的关系:

出于讨论的目的,我们将假设 SIMPLE sRGB gamma 为 1/2.2,而不是分段版本。L* 也一样

在 sRGB 中,#8DB54F 在具有 sRGB 伽马曲线的 sRGB 显示器上显示时,亮度 (Y) 为 39

这可以通过以下方式找到

(0.553^2.2)*0.2126 + (0.710^2.2)*0.7152 + (0.310^2.2)*0.0722

or 0.057 + 0.33 + 0.0061 = 0.39 and 0.39 * 100 = 39 (Y)

但是,如果颜色管理被告知值是线性的,则伽玛校正将被丢弃,并且(或多或少):

0.553*0.2126 + 0.710*0.7152 + 0.310*0.0722

or 0.1175 + 0.5078 + 0.0223 = 0.65 and 0.65 * 100 = 65 (Y)

(假设使用相同的系数。)

亮度 (Y) 是线性的,就像光一样。但人类感知并非如此,sRGB 值也并非如此。

Y 是 CIEXYZ 的线性亮度,虽然它是根据眼睛对不同波长的响应进行光谱加权的,但它在亮度​​方面并不均匀。在 0-100 的范围内,18.4 被认为是中间值。

L* 是 CIELAB 的感知亮度 (L* a* b*),它是(的简化曲线):

L* = Y^0.42在 0-100 的范围内,L* 50 是“感知的中间”值。因此,当解释并显示为 sRGB 时,Y 39 处的绿色衬衫为 L* 69,而 Y 65 约为 L* 84(这些数字基于数学,以下是我的 MacBook 上的颜色选择器的值):

sRGB 是伽马编码信号,这样做是为了充分利用每通道 8 位的有限位深度。有效伽马曲线与人类感知相似,因此使用更多位来定义较暗区域,因为人类感知对黑暗区域中的亮度变化更敏感。如上所述,它是一条简化曲线:

sRGB_Video = Linear_Video^0.455 (需要注意的是,MONITOR 添加了大约 1.1 的指数)

因此,如果 0% 是黑色,100% 是白色,那么中间灰色,大多数人会说在 0% 和 100% 之间的点是:

Y 18.4%. = L* 50% = sRGB 46.7%

也就是说,sRGB 十六进制值 #777777 将显示 18.4 Y 的亮度,相当于 50 L* 的感知亮度。中灰色。

但是等等,还有更多

所以发生了什么,你是telling MTKView您正在向其发送引用的图像数据linear价值观。但你是actually发送它sRGB由于应用了伽玛校正,值变得更轻。然后,色彩管理会获取它认为是线性的值,并将它们转换为输出显示所需的值。

色彩管理需要知道什么是价值观mean,它们与什么色彩空间相关。当你设置SRGB=false那么你告诉它你正在向它发送线性值,而不是伽马编码值。

但是您显然将伽马编码值发送到线性空间,而不将值转换/解码为线性。除非你隐式地这样做,否则线性化不会发生。

SOLUTION

线性化图像数据或设置标志SRGB=true

如果您还有其他问题,请告诉我。而且,您可能还希望看到波因顿伽马常见问题解答 https://poynton.ca/GammaFAQ.html或者也可以通过颜色常见问题解答来进行澄清。

另外,对于你的灰色:线性值 0.216 相当于 sRGB (0-1) 值 0.500

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 金属。为什么简单地改变 colorPixelFormat 就会产生更明亮的图像? 的相关文章

  • iOS Safari 通过单击按钮触发扫描信用卡

    您好 我目前正在创建一个测试应用程序 当用户单击文本字段名称或卡号时 扫描信用卡功能对我有用 我的问题是 我希望当用户单击 button1 时发生同样的情况 这应该打开相机来扫描卡并填充现有的文本字段 即名称 卡号和到期日期 额外的好处是
  • ios 如何存储用户输入的详细信息并取回?

    How to Store用户输入的详细信息和Get it Back在ios中 我有以下关注TextFields UserName Email Re enter Email id Phone State Address Localityand
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • Apple 允许后台任务运行多长时间?

    我必须将一系列图像文件上传到数据库 因此 我偶然发现苹果后台执行指南 https developer apple com library ios documentation iPhone Conceptual iPhoneOSProgram
  • 通过 Apple 批量购买计划分发自定义 B2B iOS 应用程序?

    我们的要求是为组织内超过 1000 名用户分发 iOS 应用程序 我的问题 我们可以做吗使用 iOS Developer Provisioning Profile 分发 iPA 因为我们有 99 美元的 Apple 帐户 而不是企业帐户 并
  • 在 PDFView 表单字段中配置键盘设置

    我正在开发一个应用程序 它从服务器加载 PDF 文件并在 PDFView 中显示这些 PDF 文件 这些文件包含用户要在其中键入内容的表单字段 这很好用 PDF 文件将用于教育环境 其中拼写应not可以自动更正并且预测文本应该not能得到的
  • iOS HealthKit 今天的步数始终为 0(但尾随天数没问题)

    在我们的应用程序中 我们查询 HealthKit 以获取过去 7 天的步数 每天汇总 以午夜为基准 所以范围是 D 6 午夜到明天午夜 因为我们想要今天的步骤到现在为止 它有效 我们总是能够获取过去 6 天的数据 除了今天的数据始终为 0
  • 如何使用 SwiftUI 创建自定义滑块?

    我可以使用 SwiftUI 创建滑块 但无法更改滑块的样式 如下图所示 问题 我无法在 SwiftUI 中找到任何选项来更改滑块样式 注意 我想仅使用 SwiftUI 创建它 我已经在 Swift 中使用 创建了这个滑块 https git
  • 当聚焦非 UILabel titleView 时,VoiceOver 会读取辅助功能标签两次

    我在使用 VoiceOver 时遇到了一个奇怪的问题 Goals Set a UIStackView含有多个UILabel就如我的navigationItem titleView 将堆栈视图标记为辅助功能元素并设置其accessibilit
  • Python for ios解释器[重复]

    这个问题在这里已经有答案了 可能的重复 iOS 上的 Python 或 Ruby 解释器 https stackoverflow com questions 4772591 python or ruby interpreter on ios
  • iOS 应用程序启动速度非常慢并且在 ImageLoaderMachO::loadCodeSignature 中停止

    我正在为 iOS 8 3 开发一个基于 Swift 的应用程序 我观察到该应用程序启动非常非常慢 并且似乎在应用程序加载过程中停滞不前 应用程序速度变慢before我的任何代码都会被执行 事实上 只有一个线程处于活动状态 仅使用了 60k
  • 在 iOS Swift 2 中实现“阅读更多”按钮以展开 UITextView 的最简单方法?

    我希望实现一个 阅读更多 按钮 该按钮将扩展 UITextView 以便有人可以根据需要阅读整个文本 我还没有找到一种简单的方法来实现这一目标 我尝试 玩弄 容器的高度 但它没有给我想要的结果 我真的很感激任何想法 我会推荐你 ilyapu
  • 由于iOS6中恢复了谷歌地图,MKMapView会在iOS6中自动使用谷歌地图吗?

    由于苹果已经在iOS6中恢复了谷歌地图 如果我使用MKMapView在我的 iPhone 应用程序中 它会自动使用谷歌地图吗 如果您想在应用程序中使用 Google 地图 则应使用适用于 iOS 的 Google 地图 SDK https
  • 有没有办法在 iOS 上获取相机流的亮度级别?

    我正在使用 iPhone iPad 摄像头获取视频流并在视频流上进行识别 但随着光照的变化 它会对鲁棒性产生负面影响 我已经在不同的光线下测试了不同的设置 并且可以让它工作 但尝试在运行时调整设置是我所需要的 我可以对每一帧进行简单的亮度检
  • 有没有办法在iOS模拟器上使用苹果的Touch ID(指纹扫描仪)?

    我正在开发一个需要 Touch ID 身份验证的应用程序 那么有什么方法可以在模拟器中使用 Touch ID 指纹扫描仪 另外 请分享一些使用 LocalAuthentication 框架的示例代码 XCODE 7 beta支持在iPhon
  • 如何在 SwiftUI 中将变量从一个视图传递到另一个视图

    我正在尝试将一个变量从一个视图传递到 SwiftUI 中的另一个视图 我有一个重置按钮 我想在另一个视图中将变量设置为零 我尝试在视图一中创建一个新结构并在视图2中访问该变量 View 1 State var count MyNumber
  • 如何在UiView中添加UIImagePickerController

    如何在TabBarApplication中的UiView中添加UIImagePickerController 无论您是否在选项卡中 此代码都会进入您视图的 ViewController 类 当您需要时创建一个选择器 UIImagePicke
  • 将UIWebView显示的PDF保存到本地

    我有一个UIViewController与UIWebView显示一个 pdf 文件 具体取决于之前单击的行UITableView 现在我想添加一个按钮 供用户在本地保存此 pdf 文件以供离线使用 然后还有第二个UITableView它应该
  • 渐变方向从左到右

    我完全被这个问题难住了 它应该如此简单 以至于让我发疯 我正在使用这个苹果反射教程 苹果反射示例 http developer apple com library ios samplecode Reflection Listings MyV
  • 使用自动布局时 UIScrollview 的中心内容

    我在项目中使用自动布局 并且有一个滚动视图 其中有一个居中的按钮 我已经让滚动视图滚动 但不占据整个屏幕 我尝试按照此处的教程进行操作 https developer apple com library ios technotes tn21

随机推荐