2012-09-29 13 views
5

Używam programu rmagick do obsługi każdego pojedynczego piksela bitmapy. Muszę uzyskać wartości kolorów w głębokości 8 (256 kolorów), ale niestety, gdy używam piksela. [Kolor] (na przykład piksel czerwony), dostaję je do głębokości 16. Dzieje się to nawet po used image.quantize (256).Wartość koloru piksela rmagick

Oto kod:

require 'RMagick' 
include Magick 

image = ImageList.new("image.bmp") 
image3 = image.quantize(number_colors = 256) 
puts image3.number_colors 

image2 = Image.new(image.columns, image.rows) 

(0..image.columns).each do |x| 
    (0..image.rows).each do |y| 
     pixel = image3.pixel_color(x, y) 

    print pixel.red 
    print ", " 
    print pixel.green 
    print ", " 
    print pixel.blue 
    print "\n" 

    image2.pixel_color(x, y, pixel) 
    end 
end 

Co powinienem dostać tylko wartości 0..255?

+0

Już omówiono tutaj: http://stackoverflow.com/questions/6499161/pixel-rgb-with-imagemagick-and-rails – gnuf

Odpowiedz

2

Są one przechowywane na "16-bitowej głębokości". Możesz odbudować bibliotekę, aby to zmienić. Możesz też po prostu podzielić każdą wartość przez 257.

Istnieje funkcja o nazwie MagickExportImagePixels, która może dostarczyć Ci 8-bitowych danych pikseli, które chcesz. Za każdym razem, gdy wykonasz przekształcenie itp. Na obrazie, zostanie on przekonwertowany z powrotem na 16-bitowe piksele.

+0

Dlaczego nie przez 256? – Nakilon

+0

Ponieważ 256 * 255 = 65280. 257 * 255 = 65535, co daje pełny zakres konwersji 16 bitów na 8 bitów – Bert

+0

Zapomniałeś o podłodze. Twój * 257 * 255 = 65535 * udowodni, że tylko jeden z 65536 kolorów zostanie przekonwertowany na 255 - wszystkie niższe będą 254. Prawidłowe przekształcenie na dane jednobajtowe to przesunięcie w prawo o 8 bitów, tj. Dzielenie przez 256. – Nakilon

Powiązane problemy