2011-06-27 14 views
4

現在、PaperClipとImageMagickで画像をアップロードしています。私はこれをやっているので(before_createフック付き)画像の平均色を取得したいと思います:ImageMagickとRailsを使用したピクセルRGB

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は、8ビットに対して16ビットの量子深度のためにコンパイルされます。詳細については、RMagick Hints &ヒントフォーラムのthis articleを参照してください。

+0

これは間違いなく役立ちます。私は257(QuantumDepth 16/QuantumDepth 8)でRGB値を分けるだけで終わった。 – 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段落)で詳細を取得することができます

関連する問題