2012-09-29 14 views
5

Sto usando rmagick per occuparmi di ottenere ogni singolo pixel di una bitmap. Ho bisogno di ottenere i valori dei colori in profondità di 8 (256 colori), ma sfortunatamente quando uso il pixel. [Colore] (ad esempio il pixel rosso), li sto acquisendo a profondità 16. Sta accadendo anche dopo usato image.quantize (256).valore colore pixel rmagick

Ecco il codice:

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 

Cosa devo per ottenere solo i valori di 0..255?

+0

Già discusso qui: http://stackoverflow.com/questions/6499161/pixel-rgb-with-imagemagick-and-rails – gnuf

risposta

2

Sono memorizzati in una 'profondità quantica' di 16 bit. Puoi ricostruire la libreria per cambiarla. Oppure puoi semplicemente dividere ogni valore per 257.

C'è una funzione chiamata MagickExportImagePixels che può ottenere i dati dei pixel a 8 bit che desideri. Ogni volta che esegui una trasformazione, ecc. Su un'immagine, questa viene convertita in pixel a 16 bit.

+0

Perché non per 256? – Nakilon

+0

Perché 256 * 255 = 65280. 257 * 255 = 65535, quindi fornire l'intervallo completo durante la conversione da 16 bit a 8 bit – Bert

+0

Hai dimenticato la pavimentazione. Il tuo * 257 * 255 = 65535 * dimostra che solo uno dei 65536 colori verrebbe convertito in 255 - tutto inferiore sarebbe 254. La conversione corretta in dati a un byte è a destra con 8 bit, ovvero la divisione per 256. – Nakilon