使用 ImageMagick 和 Rails 进行像素 RGB

发布于 2024-11-17 10:45:19 字数 424 浏览 4 评论 0原文

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

I'm currently uploading an image with PaperClip and ImageMagick. I would like to get the image's average color so I'm doing this (with a before_create hook):

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

This works but when I try to print the pixel colors out I get them like this:

red=36722, green=44474, blue=40920, opacity=0 

How can I get these RGB values into regular (0-255) RGB values. Do I just mod them? Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

苯莒 2024-11-24 10:45:19

如果 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

If ImageMagick is compiled with a quantum depth of 16 bits, and you need the 8 bit values,
you can use bitwise operation:

r_8bit = r_16bit & 255;
g_8bit = g_16bit & 255;
b_8bit = b_16bit & 255;

Bitwise operation are much more faster ;)

You can use also this way:

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

Now a little bit of Math:

x_16bit = x_8bit*256 + x_8bit = x_8bit<<8 | x_8bit
我是有多爱你 2024-11-24 10:45:19

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

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

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

You can easily get 8-bit encoded color using this approach:

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

You can get more details at https://rmagick.github.io/struct.html (to_color paragraph)

放赐 2024-11-24 10:45:19

您的 ImageMagick 编译为 16 位量子深度,而不是 8 位。请参阅这篇文章 在 RMagick 提示和中提示论坛了解更多信息。

Your ImageMagick is compiled for a quantum depth of 16 bits, versus 8 bits. See this article in the RMagick Hints & Tips Forum for more information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文