我正在使用 Rmagick(使用 ImageMagick 的 Ruby on Rails gem)。 我正在构建一个工具来使用一些特定的调色板重新映射图像。
作为输入,我有:
图像(.png 或 .jpg) 一组颜色十六进制代码。
即时创建调色板时出现错误。
我已经构建了这个脚本来创建带有颜色十六进制代码的调色板,以便在重新映射期间使用它:
colorpallet = MiniMagick::Image.new("palette_tmp.png")
colors.each do |color_item|
color = MiniMagick::Image.new("color_tmp.png")
color.run_command('convert', '-size', '1x1', "xc:#{color_item}", color.path)
colorpallet.run_command('convert', '+append', colorpallet.path, color.path, colorpallet.path)
end
当我运行我的脚本时,我得到这个错误:
magick convert +append palette_tmp.png color_tmp.png palette_tmp.png 失败,状态:1 和错误: 转换:无法打开图像“palette_tmp.png”:没有这样的文件或目录@error/blob.c/OpenBlob/3569.
然而,palette_tmp.png 存在...
然后,我像这样使用重映射运算符:
remap_sketch.run_command('convert', url, '-dither', 'FloydSteinberg', '-remap', colorpallet.path, remap_sketch.path)
我有两个问题:
你知道为什么我有关于“没有这样的文件或目录”的错误吗?
有没有办法在不动态生成调色板文件的情况下进行重新映射?
非常感谢。
我不知道也不使用 Ruby,但我确实使用 ImageMagick。我认为您想使用
-remap
映射到一组特定的颜色但不生成图像,或者可能不写入磁盘来定义调色板。
希望你能从命令行适应 Ruby。命令行可以接受文本形式的调色板,所以我想您可以在 Ruby 中创建该文本形式。假设您想映射到 3 种颜色,纯红色、纯石灰(绿色)和纯蓝色。你会做你的调色板:
magick xc:red xc:lime xc:blue +append palette.png
然后您将图像映射到该调色板:
magick input.jpg -remap palette.png
然而,它也适用于文本,所以你可以像这样制作你的调色板:
magick xc:red xc:lime xc:blue -depth 8 palette.txt
看起来像这样:
# ImageMagick pixel enumeration: 3,1,0,255,srgb
0,0: (255,0,0) #FF0000 red
1,0: (0,255,0) #00FF00 lime
2,0: (0,0,255) #0000FF blue
你可以同样使用它:
magick input.png -remap palette.txt result.png
但是,说到重点,您不需要使用实际的文本文件,您可以在
stdin
上即时生成它,ImageMagick 将使用它而不需要它是磁盘上的文件:
echo "# ImageMagick pixel enumeration...." | magick input.jpg -remap - result.jpg
您还可以将文件简化为:
# ImageMagick pixel enumeration: 3,1,0,255,srgb
0,0: (255,0,0)
1,0: (0,255,0)
2,0: (0,0,255)
非常感谢您的回答。
为了在 Rails 上使用 Image Magick,我安装了 gem:“Rmagick” 文档
我有以下步骤:
我创建一个 remaped_image :
remap_image = Magick::Image.new(256, 64)
我创建一个图像列表:
ilist = Magick::ImageList.new
然后,对于调色板中我想要的每种颜色,我都会:
colors.each do |color_item|
ilist.new_image(1, 1) { |options| options.background_color = "#{color_item}" }
end
然后,我使用文档中的 remap() 方法:
ilist.remap(remap_image, dither=RiemersmaDitherMethod)
我得到这个错误:
未初始化的常量 SketchesController::RiemersmaDitherMethod
我尝试了很多不同的方式,例如:
ilist.remap(remap_image, dither)
ilist.remap(remap_image, RiemersmaDitherMethod)
ilist.remap(remap_image, "RiemersmaDitherMethod")
ilist.remap(remap_image, dither=1)
ilist.remap(remap_image, 1)
而且我一直有错误的枚举类型问题
你知道我该如何解决这个问题吗?
谢谢!