问题标签 [srgb]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
colors - 与 HSL 的线性RGB 转换
有谁知道从 linearRGB 颜色(不是 sRGB 颜色)中获取 HSL 的方法?我见过很多 sRGB<->HSL 转换,但没有看到 linearRGB<->HSL。不确定这是否是基本相同的转换,但我会很感激有人对此有任何见解。
线性 RGB 与线性化 sRGB 不同(取 [0,255] 并使其变为 [0,1])。从/到 sRGB 的线性 RGB 转换位于http://en.wikipedia.org/wiki/SRGB。在 VBA 中,这将被表示(采用线性化 sRGB 值 [0,1]):
我尝试将线性 RGB 值发送到标准 RGB_to_HSL 例程并从 HSL_to_RGB 退出,但它不起作用。可能是因为当前的 HSL<->RGB 算法考虑了伽马校正,而线性 RGB 没有经过伽马校正 - 我不确切知道。我几乎没有看到可以做到这一点的参考资料,除了两个:
- http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9上的参考资料 (编号为第 10 项)。
- 开源项目 Grafx2 @ http://code.google.com/p/grafx2/issues/detail?id=63#c22 的参考,其中贡献者声明他已经完成了线性 RGB <-> HSL 转换并提供.diff 文件中他的评论的附件中的一些 C 代码(我无法真正阅读:()
我的意图是:
- 从 sRGB(例如
FF99FF
(R=255, G=153, B=255
))发送到线性 RGB (R=1.0, G=0.318546778125092, B=1.0
)- 使用上面的代码(例如,G=153 将在线性 RGB 中从 获得
sRGB_to_linearRGB(153 / 255)
)
- 使用上面的代码(例如,G=153 将在线性 RGB 中从 获得
- 到 HSL
- 将饱和度修改/调制 350%
- 从 HSL->Linear RGB->sRGB 发回,结果为
FF19FF
(R=255, G=25, B=255
)。
使用来自 .NET 的可用函数,例如.getHue
来自 a 的System.Drawing.Color
函数在任何 HSL 值的 100% 调制以上的任何 sRGB 空间中都不起作用,因此需要发送线性 RGB 而不是 sRGB。
c++ - 如何有效地将 sRGB 转换为 CIELAb 和 CIELab 转换为 sRGB?
我不明白如何将 sRGB 转换为 CIELab 并向后转换。请帮帮我。在 с++ 代码中是可取的
colors - 使用 EXIFTool 创建 sRGB 图像?
我想问一个关于 sRGB、ICC 配置文件和 exiftool 的问题。
我发现您可以使用 exiftool 将 sRGB 配置文件嵌入到图像中。这是否意味着我可以在 Paint.NET 中创建图片并使用 exiftool 在其中嵌入 sRGB ICC 配置文件......并且输出文件将是 sRGB?例如,跨 MAC 和 PC 进行色彩管理?
我买不起 Photoshop,而且对 Gimp 也不是很着迷,所以我认为 exiftool 将个人资料放入图片中可能是一种快速解决方法。
我不知道这是否可行(因为 Paint.NET 没有 sRGB 的选项),但我希望有人可以验证它与在 Photoshop 中以 sRGB 保存图像(并嵌入配置文件)具有相同的效果。
colors - sRGB->CIEXYZ->discard 亮度的结果是否可以转换回 sRGB?
我正在为我的小马探测器写阴影去除。在我将 PNG 图像从 sRGB 转换为 CIE XYZ后,我按照说明删除了亮度:
当我尝试将图像转换回 sRGB 进行显示时,我得到的 RGB 值超出了sRGB 色域(我得到的值大于 255)。这是正常的,还是我应该继续寻找错误?注意:在不修改的情况下转换为 XYZ 并返回不会产生故障。
插图(左上:原始,左下:红色和蓝色色调的字节值包装):
为了完整性:右上:颜色比率,右下:转换为 HSV 并均衡值。
opengl - 色彩空间、伽玛和图像增强
色彩空间。好了,大家都知道RGB了:在[0.0,1.0]范围内归一化的三个值,分别代表颜色分量Red Green Blue的强度;这种强度是线性的,不是吗?
伽玛。据我所知,伽玛是将RGB颜色分量映射到另一个值的函数。谷歌搜索,我看到了线性函数和非线性函数......线性函数似乎可以缩放 RGB 分量,所以它似乎可以调整图像亮度;非线性函数似乎可以“解压缩”较暗/较亮的组件。
现在,我开始实现一个图像查看器,它将不同的图像格式显示为纹理。我想修改这些图像的伽玛,所以我应该建立一个片段着色器并在纹理四边形上运行。很好,但我如何确定正确的伽马校正?
OpenGL 使用线性 RGB 颜色空间,使用浮点组件。实际上,我可以从这些值开始计算伽马校正值(具有特殊的浮点精度),因此它们在钳位伽马校正值后显示。
首先,我将确定伽马斜坡。我怎么能确定呢?(分析或使用查找表)
然后,我开始研究 OpenGL 扩展 EXT_framebuffer_sRGB,这似乎与扩展EXT_texture_sRGB非常相关。
EXT_texture_sRGB 引入了一种新的纹理格式,用于将文本值线性化到 RGB 线性空间中。(脚注1)通过这种方式,我知道sRGB色彩空间并将其用作线性RGB色彩空间。
相反,EXT_framebuffer_sRGB 扩展允许我将线性 RGB 值编码到 sRGB 帧缓冲区,而不用担心它。
...
等等,所有这些信息是为了什么?如果我可以使用 sRGB 帧缓冲区并加载 sRGB 纹理,则无需 sRGB 转换即可处理该纹理……我为什么要更正伽玛?
也许即使在 sRGB 缓冲区上,我也可以同样校正伽玛?或者我最好不要?以及亮度和对比度:它们应该在伽马校正之前还是之后应用?
信息量很大,我现在很困惑。希望你们中的某个人能更多地向我解释所有这些概念!谢谢你。
...
还有一个问题。如果设备伽玛不同于“标准”2.2,我如何“累积”不同的伽玛校正?我不知道是否清楚:如果图像 RGB 值已经针对伽马值为 2.2 的显示器进行了校正,但显示器的伽马值为 2.8,我该如何校正伽马?
(1) 这里有一些摘录来强调我的意思:
sRGB 色彩空间基于昏暗办公室中预期的典型(非线性)显示器特性。它已被国际电工委员会 (IEC) 标准化为 IEC 61966-2-1。sRGB 颜色空间大致对应于 2.2 伽马校正。
此扩展是否提供任何类型的 sRGB 帧缓冲区格式或保证使用 sRGB 纹理渲染的图像在输出到支持 sRGB 颜色空间的设备时“看起来不错”?
directx - (DirectX9) 混合后的 sRGB 转换
我最近看到了这篇博客文章又一篇关于伽马校正的文章,它教会了我D3DPMISCCAPS_POSTBLENDSRGBCONVERT功能标志的可用性。
这应该允许在 DirectX9 上混合后进行正确的 sRGB 转换。
我不明白如何处理它?我可以查询我的设备 Direct3D 9Ex 设备以获取此功能,但如果支持,我该如何启用它?我可以在混合转换前和混合后选择吗?如果是,如何?
谢谢你的帮助!
android - 伽玛曲线实验——将 2.2 转换为 1.8 的反面?
摩托罗拉 Photon 因展示其他人所谓的“黑色迷恋”而臭名昭著——在查看图片时,图像暗部的大部分细节都被压平为黑色。到目前为止,几乎每个人都将其归咎于 Pentile 显示器。然而,当我第一次看到这种效果时,我想到了一个不同的想法......“哇,这看起来和为 Windows 编码的图片在 Linux 和 Macintosh 上使用 1.8 的 gamma 时看起来一样(糟糕)的方式而不是 Windows 的 2.2" 标准。我的理论是,在某个地方,摩托罗拉使用一个旧库构建了 Photon 的 Android,当时摩托罗拉是 iPhone 之前的 Apple 合作伙伴(或者可能抓住了假设 1.8 gamma 而不是 2.2 的旧开源代码)。
为什么我这么肯定?几天前,我使用旧的 Epic 4G(三星 Galaxy S)和新的 Photon 对同一网页进行了屏幕截图。出乎意料的是,Epic 的屏幕截图 .png 看起来很正常,但 Photon 的屏幕截图 .png 在我的 PC 上查看时与在 Photon 屏幕上查看时的外观完全相同。看到它的那一刻,我想起了我之前关于可能存在 gamma-mapping 1.8-vs-2.2 错误的想法,并决定尝试编写一个演示应用程序向摩托罗拉展示并说服他们这是一个可以修复的真正错误。
我想做的一个实验是拍摄一张在明亮和黑暗区域都具有高动态范围和细节的 JPEG 图像,并将其重新编码为非标准伽马,该伽马基本上是 1.8 和 2.2 之间差异的两倍。这个想法是,如果我故意将它错误编码到相反的极端(2.6?),然后躺在元数据中并说它是 2.2,在光子上查看时它看起来很正常(因为相同的错误将 2.2 压低到 1.8将 2.6 压低到适当的 2.2)。
所以,两个问题:
如果将 2.2 伽马图像解码为 1.8,则与您得到的错误相反,伽马值是多少?2.6?
是否有任何简单的方法(免费的 Photoshop/gimp 插件、JPEG 编码库等)故意将源图像错误编码为该非标准伽玛?
css - 使用 sRGB 照片和显示器 RGB 组合开发网站的颜色配置文件策略
概述
我正在寻找关于在 comps 上标准化颜色配置文件的建议/解决方案,以便 HTML/CSS 渐变/混合的颜色与在 comp 中实现的效果相匹配。我经常使用sRGB 颜色配置文件获取 PSD,因此当我选择颜色来重新创建渐变/图标/或背景时,HEX 颜色和生成的 CSS/HTML 渐变与 comp 中提供的原始 sRGB 渐变不匹配。通常,我只是丢弃了监视器 RGB颜色配置文件的嵌入颜色配置文件,该配置文件可以更好地将 PSD 颜色与最终结果 CSS 颜色相匹配。这是一个显示颜色配置文件之间差异的示例。
细节
所以这是一个困境:设计人员希望标准化 PSD 以使用嵌入的 sRGB 颜色配置文件,因为导出的图像(JPEG / PNG)保留该 sRGB 颜色配置文件以在浏览器中加载时正确显示。因此,我无法在 CSS 中重新创建的照片/纹理/事物将导出为具有更好 sRGB 配置文件的 JPEG/PNG(这是一个可以理解的要求)。
作为前端开发人员,我经常使用 CSS 和 HTML(无图像)重新创建在 comp 中显示的元素,这需要我在 PSD 中的内容和网站上呈现的内容之间正确匹配 HEX 颜色。因此,我更愿意使用Monitor RGB 颜色配置文件进行标准化,以便每个人都使用更接近浏览器中实际呈现的内容。
只是好奇其他人如何解决这个问题?在某些情况下,我混合使用 CSS 和 PNG 来实现效果(尤其是需要动态更改的效果(大小/色调/阴影......),因此使用 sRGB 导出图像并使用 CSS 渐变/阴影覆盖它最终是 sRGB / Monitor RBG 的混合体,因此与 comp 略有不同。
答案格式
希望我已经正确地问了这个问题 - 合适的答案只会让您了解如何处理问题 - 或者(更好)如果有 SCSS sRGB() 函数或其他算法将 RGB / HEX 颜色转换为 sRGB 然后我会把它扔进一个SASS mixin。
c++ - 在具有多重采样的 QGLFramebufferObject 中使用 sRGB 颜色
出于性能原因,我将 2D 和 3D 渲染分开。对于每种类型,我有两个 QGLFramebufferObjects,因为 QGLFramebuffer 不支持将多重采样GL_TEXTURE_2D
作为目标,因此一旦在多重采样缓冲区中完成绘图,它就会被传送到解析像素值的“正常”QGLFramebufferObject 中。一旦对一种/两种渲染类型完成此操作,缓冲区将用作着色器的纹理输入,将 2D“层”混合到 3D 层上。
我应该提到我被锁定在使用 QGLFramebufferObjects 而不是纯 OpenGL 对象,因为我使用 QPainter 进行所有 2D 工作,而 QPainter 只能绘制到 Qt 类型上。
这个过程效果很好,除了抗锯齿太暗,它几乎看起来像一个黑暗的轮廓:
在做了一些研究之后,我发现这归结为使用线性色彩空间而不是 sRGB(这里和这里)。所以我启用GL_FRAMEBUFFER_SRGB
了我的 FBO blitting,将我所有 FBO 的纹理目标内部类型设置为GL_SRGB8_ALPHA8
,并在我的着色器中进行混合计算之前执行 sRGB->Linear(并在最终输出之前再次返回)。
但它不起作用;它要么看起来太亮、太暗,要么看起来完全一样。每当整个画面太暗/太亮时,我知道这是因为我错过了色彩空间转换。但是当它看起来完全一样时 - 发生了什么事!?
我真的可以请人解释启用GL_FRAMEBUFFER_SRGB
状态的操作顺序,如果 blitting 会影响色彩空间,以及哪些 FBO 需要在 sRGB 中才能使抗锯齿看起来正确。还是我完全错了,导致这些多重采样伪影的完全是其他原因吗?