使用ImageMagick和Rails获取像素RGB值

4

我当前正在使用PaperClip和ImageMagick上传图像。我想获取图像的平均颜色,所以我在before_create钩子中执行以下操作:

def get_average_color           
    img =  Magick::Image.read(self.url).first
    pix = img.scale(1, 1)
    averageColor = pix.pixel_color(0,0)
end 

这个可以运行,但是当我尝试打印像素颜色时,我得到的结果是这样的:
red=36722, green=44474, blue=40920, opacity=0 

我该如何将这些RGB值转换成常规的(0-255)RGB值?我只需要对它们取模吗?提前感谢。

3个回答

3
如果ImageMagick是使用16位量子深度编译的,而您需要8位值,则可以使用按位操作:
r_8bit = r_16bit & 255;
g_8bit = g_16bit & 255;
b_8bit = b_16bit & 255;

位运算速度更快 ;)

你也可以这样做:

IMAGE_MAGICK_8BIT_MASK = 0b0000000011111111
r_8bit = (r_16bit & IMAGE_MAGICK_8BIT_MASK)
...

现在让我们简单地来看一下数学问题:
x_16bit = x_8bit*256 + x_8bit = x_8bit<<8 | x_8bit

2

您可以使用以下方法轻松获取8位编码的颜色:

averageColor = pix.pixel_color(0,0).to_color(Magick::AllCompliance, false, 8, true)

您可以在 https://rmagick.github.io/struct.html(to_color段落)获取更多详细信息。

1

您的ImageMagick编译为16位量子深度,而不是8位。有关更多信息,请参见RMagick提示和技巧论坛中的this article


这绝对有所帮助。最终我只是将RGB值除以257(QuantumDepth 16 / QuantumDepth 8)。 - dshipper
也许还可以看一下 quantize 方法 http://www.imagemagick.org/RMagick/doc/image3.html#quantize。 - Yardboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接