即时创建调色板图像以重新映射后面:每次都不会重置调色板

问题描述 投票:0回答:2

我正在使用 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)

我有两个问题:

你知道为什么我有关于“没有这样的文件或目录”的错误吗?

有没有办法在不动态生成调色板文件的情况下进行重新映射?

非常感谢。

image-processing imagemagick-convert
2个回答
0
投票

我不知道也不使用 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)

0
投票

非常感谢您的回答。

为了在 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)

而且我一直有错误的枚举类型问题

你知道我该如何解决这个问题吗?

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.