2012-09-29 11 views
5

Ich benutze rmagick, um mit jedem einzelnen Pixel einer Bitmap umzugehen. Ich muss die Werte der Farben in der Tiefe von 8 (256 Farben) erhalten, aber leider, wenn ich Pixel verwende [Farbe] (Pixel. Rot zum Beispiel), bekomme ich sie in Tiefe 16. Es geschieht sogar nach i verwendetes image.quantize (256). Hierrmagick pixel color value

ist der Code:

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 

Was soll ich nur Werte von 0..255 zu bekommen?

+0

Bereits hier diskutiert: http://stackoverflow.com/questions/6499161/pixel-rgb-with-imagemagick-and-rails – gnuf

Antwort

2

Sie sind in einer 'Quantentiefe' von 16 Bits gespeichert. Sie können die Bibliothek neu erstellen, um dies zu ändern. Oder Sie können einfach jeden Wert durch 257 teilen.

Es gibt eine Funktion namens MagickExportImagePixels, die Sie die 8-Bit-Pixeldaten erhalten können, die Sie möchten. Immer wenn Sie eine Transformation usw. für ein Bild durchführen, wird es wieder in 16-Bit-Pixel konvertiert.

+0

Warum nicht von 256? – Nakilon

+0

Weil 256 * 255 = 65280. 257 * 255 = 65535, daher geben Sie den vollen Bereich beim Konvertieren von 16 Bit zu 8 Bit – Bert

+0

Sie haben über Bodenbelag vergessen. Ihr * 257 * 255 = 65535 * beweist, dass nur eine von 65536 Farben in 255 konvertiert werden würde - alles andere wäre 254. Die korrekte Umwandlung in Ein-Byte-Daten ist eine Rechtsverschiebung um 8 Bits, dh eine Division durch 256. – Nakilon