2011-06-27 31 views
4

我目前正在用PaperClip和ImageMagick上传图像。我想获得的图像的平均颜色,所以我这样做(用before_create钩):像素RGB与ImageMagick和Rails

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

回答

1

您的ImageMagick是针对16位量子深度编译的,而不是8位。请参阅this article的RMagick提示&提示论坛以获取更多信息。

+0

这绝对有帮助。我最终将RGB值除以257(QuantumDepth 16/QuantumDepth 8)。 – dshipper

+0

也许你也可以看一下量化方法http://www.imagemagick.org/RMagick/doc/image3.html#quantize。 – Yardboy

+0

我试过,它似乎没有工作出于某种原因。 – dshipper

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 
1

您可以使用这种方法很容易得到的8位编码的颜色:

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

您可以在https://rmagick.github.io/struct.html(to_color段)得到更多的细节