r - R pdf() 设备使用 colormodel = "cmyk" 将颜色转换为不那么闪亮
问题描述
我需要在 CMYK 颜色空间中生成 PDF 中的图表。但是,当我这样做时,我闪亮的绿色在 CMYK PDF 中看起来很不闪亮:
pdf(file = paste0("tmp-shiny-green-cmyk.pdf"), width = 4, height = 4, colormodel = "cmyk")
plot(1, 1, pch = 16, cex = 5, col = "#00ff66")
dev.off()
下面是 PDF 如何在 Adobe Acrobat Reader 中显示的屏幕截图。颜色的光泽度要低得多(“#00A88E”):
?pdf
帮助页面说:
CMYK 颜色空间中的“cmyk”输出。使用从 sRGB 到 CMYK 的最简单的转换(https://en.wikipedia.org/wiki/CMYK_color_model#Mapping_RGB_to_CMYK)。
但似乎并非如此。
我想可能是因为RGB 颜色空间大于 CMYK,所以我的闪亮颜色超出了范围。但是,当我尝试将我的 RGB 转换为 CMY 时,它似乎在范围内:
require(colorscience)
RGB2CMY(t(col2rgb("#00ff66")))
# C M Y
# red 1 0 0.6
那么,问题出在哪里?pdf()
它是R中设备的错误吗?或者颜色系统还有其他问题吗?这可能是由于 Adobe RGB 和 sRGB 之间的差异造成的混乱吗?(虽然我不知道为什么这应该适用于colormodel = "cmyk"
)。
PS:这家伙好像也有类似的经历,这里没有答案。
解决方案
条款
RGB是一种加色模型,用于显示器和移动设备。
CMYK(印刷)、YCM或CMY(胶片)是减色模型。
颜色空间是颜色模型的子集,颜色空间为“原色”和传输曲线或伽玛等提供特定规范。
sRGB和Adobe RGB以及Display P3是三种不同 RGB 颜色空间的示例。
色域是给定色彩空间的大小(体积)。
原色是指色彩空间中使用的特定颜色。没有一组三种或四种真实颜色可以混合以创建一个涵盖所有人类视觉的色域。覆盖整个人类色域的色彩空间需要使用无法创建且仅作为数学构造存在的想象颜色。
闪亮通常是指具有镜面高光的东西。在目前的问题中,所问的似乎更多的是“亮度”或“明暗”的感知质量。
回答
CMYK 模型色彩空间的色域不仅大小不同,而且相对于 RGB 模型色彩空间的形状也不同。
sRGB 或 Adobe RGB 等色彩空间比红色、绿色和蓝色 RGB 原色中的大多数 CMYK 空间大。但正如您在下面的色度图中所见,GRACoL CMYK 空间在青色中大于 sRGB。
所以现在问问自己,当完整的 sRGB 绿色转换为通用 CMYK 空间时会发生什么?然后,当 CMYK 转换回 sRGB 以在显示器上查看时会发生什么?
#00ff66
由于示例 CMYK 空间中不存在完整的绿色,因此需要对其进行裁剪或从 sRGB 映射到 CMYK 中的绿色。颜色模型和颜色空间之间有许多不同的映射方法,每种方法都有不同的用途和折衷方案。
一旦转换为 CMYK,无论使用什么映射,在 sRGB 上显示时都需要再次转换/映射。应该很容易看出这种转换是如何产生累积错误和意外结果的。
映射
有了上述背景,我注意到问题的文档引用中的以下行:
...使用从 sRGB 到 CMYK 的最简单的转换...
嗯,这是不祥之兆。这似乎意味着没有真正的映射,颜色可能只是被剪裁了,或者可能有一些映射,但它似乎不是特别感性的。
PDF 文档中色彩空间的选择也很重要,因为 CMYK 色彩空间之间的差异很大,因为它们通常是每个配置文件输出设备的 LUT。
虽然 R 确实有一些色彩空间实用程序,但浏览文档我没有看到任何类型的色彩管理引擎专门用于空间之间的映射或使用 ICC 配置文件。但这基本上是需要的——如果 PDF() 函数没有可用的感知或色度映射,那么下一个选择是首先使用一些映射实用程序转换为 CMYK,然后将其作为 CMYK 发送到 PDF。
推荐阅读
- android - 如何在 Android 的单个页面中获取多个 YouTube PlayListItem
- javascript - 手动关闭浏览器后,EventListener 是否仍处于开启状态?(木偶师)
- c# - 等效于 ENTITY FRAMEWORK / LINQ 表达式中的 TSQL“IN(subSelect)”
- vb.net - TextBox 上的 VB.NET 密钥捕获以运行不同的 SUB
- tensorflow - 如何检查 K 折验证中的训练准确度
- r - 在 R 中解析日期时间的“m/%d/%Y %H:%M”形式
- java - 缺少 Java try-catch 构造的预期输出部分
- postgresql - 使用 Doctrine 从 Symfony 5 调用 PostgreSQL 存储过程和函数
- django - 获取模型对象的 id,它是另一个模型对象 django 的 FK
- python - 使用pytorch的CNN模型