带有ImageMagick和Rails的像素RGB

我目前正在使用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值。 我只是修改它们吗? 提前致谢。

您的ImageMagick编译为16位的量子深度,而不是8位。 有关详细信息,请参阅RMagick提示和技巧论坛中的这篇文章 。

如果使用16位的量子深度编译ImageMagick,并且您需要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 

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

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

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