【问题标题】:Converting colors (not images) with ImageMagick使用 ImageMagick 转换颜色(不是图像)
【发布时间】:2017-10-30 19:07:10
【问题描述】:

更具体地说,我想在 Ruby 平台(可能使用 ICC 配置文件)上准确地将 CMYK 值(可能来自ISO Coated v2 空间)转换为 RGB 值(可能来自sRGB 空间)。

ImageMagick 似乎是一个不错的起点,但我也听说 LittleCMS 可能已被移植/包装以与 Ruby 一起使用。

再一次,我希望转换单色,而不是图像文件。有什么想法吗?

【问题讨论】:

  • @msanford 我想我做到了,但找不到任何使用示例。你知道它的任何教程/API吗?
  • 否,但您可以查看测试以了解它是如何实现的 github.com/halostatue/color/blob/master/test/test_cmyk.rb
  • 好的,只是深入挖掘。您似乎无法使用任何类型的托管色彩空间转换 CMYK。唯一可用的函数是@cmyk.to_rgb,它不接受任何参数。

标签: ruby-on-rails ruby colors imagemagick color-profile


【解决方案1】:

在 ImageMagick 中,您可以执行以下操作:

convert xc:"cmyk(0,255,255,0)" -colorspace sRGB -format "%[pixel:u.p{0,0}]\n" info:
red

convert xc:"cmyk(0,255,255,0)" -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc -profile /Users/fred/images/profiles/sRGB.icc -format "%[pixel:u.p{0,0}]\n" info:
srgb(93%,11%,14%)

【讨论】:

  • 这看起来很有希望,但我在终端中不断收到以下错误:convert: 'sRGB' @ error/convert.c/ConvertImageCommand/3251。文档 (imagemagick.org/script/convert.php) 建议 convert 用于图像翻译,而不是颜色翻译。有什么想法吗?
  • 您的 ImageMagick 版本和平台是什么?可能存在语法差异。如果在非常旧版本的 IM 上尝试用 RGB 替换 -colorspace sRGB。哪个命令给了你那个错误。确保在第二个命令中将您自己的路径放入您的配置文件,而不是我的路径。此命令将颜色转换为 1 像素图像,然后转换颜色空间并读取像素颜色值,而不保存创建的 1 像素图像
  • 我在 macOS Sierra 10.12 上使用当前版本的 ImageMagick,我通过 Homebrew 安装了 —little-cms 尽管 lcms 由于某种原因没有显示为代表 ...
  • 什么版本的 ImageMagick。试试convert -version。如果这不起作用,那么您的安装有问题。也许您需要使用 ImageMagick 的 Homebrew 安装 lcms2。我在 Mac OSX Sierra 上安装 ImageMagick(通过 MacPorts 代表代表和 IM 源,显示 lcms(用于 lcms2)。此外,如果您在 IM 7 上,则将 convert 替换为 magick。注意:@987654322 有一个颜色转换器@,但它不使用配置文件。
  • @sambecker 抱歉,我不知道 Rails/Ruby。但在最坏的情况下,您可能能够通过某种子进程调用(类似于 PHP exec 或从 Python 到 ImageMagick 的子进程调用)来调用命令行 ImageMagick。另请参阅rmagick.rubyforge.org 上的 RMagick@
【解决方案2】:

有什么可以调整的格式以确保更重要 srgb 中的数字(X%,X%,X%)

可能由于 IM 版本不同。 IM 7.0.7.8 显示 srgb(93.0648%,11.1254%,14.1741%)。 IM 6.9.9.20 显示整数。我尝试将 -precision 4 添加到 IM 6 命令行,但仍然得到整数。为了获得更高的精度,必须解析 txt: 输出格式。

例如不解析:

convert xc:"cmyk(0,255,255,0)" -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc -profile /Users/fred/images/profiles/sRGB.icc txt:
# ImageMagick pixel enumeration: 1,1,65535,srgb
0,0: (60990,7291,9289)  #EE3E1C7B2449  srgb(93%,11%,14%)

所以需要解析括号中的16位值(针对IM Q16),即(60990,7291,9289)

vals=`convert xc:"cmyk(0,255,255,0)" \
-profile /Users/fred/images/profiles/USWebCoatedSWOP.icc \
-profile /Users/fred/images/profiles/sRGB.icc txt: |\
tail -n +2 | sed -n 's/^.*[(]\(.*\)[)][ ]*\#.*$/\1/p'`
red=`echo $vals | cut -d, -f1`
green=`echo $vals | cut -d, -f2`
blue=`echo $vals | cut -d, -f3`
red=`convert -precision 4 xc: -format "%[fx:100*$red/quantumrange]" info:`
green=`convert -precision 4 xc: -format "%[fx:100*$green/quantumrange]" info:`
blue=`convert -precision 4 xc: -format "%[fx:100*$blue/quantumrange]" info:`
color="srgb($red%,$green%,$blue%)"
echo "$color"
srgb(93.06%,11.13%,14.17%)

根据您想要的有效位数调整 -precision。

注意:在 IM 7 中,-precision 确实有效。

magick xc:"cmyk(0,255,255,0)" -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc -profile /Users/fred/images/profiles/sRGB.icc -format "%[pixel:u.p{0,0}]\n" info:
srgb(93.0648%,11.1254%,14.1741%)

magick -precision 4 xc:"cmyk(0,255,255,0)" -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc -profile /Users/fred/images/profiles/sRGB.icc -format "%[pixel:u.p{0,0}]\n" info:
srgb(93.06%,11.13%,14.17%)

magick -precision 2 xc:"cmyk(0,255,255,0)" -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc -profile /Users/fred/images/profiles/sRGB.icc -format "%[pixel:u.p{0,0}]\n" info:
srgb(93%,11%,14%)

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 2012-10-27
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多