Как получить шестнадцатеричное значение из каждого пикселя в RMagick или Chunky_PNG?

Я пытаюсь прочитать значение каждого пикселя в шестнадцатеричном виде (нотация HTML), используя RMagick или же Chunky_PNG например #5DBCD2, На данный момент у меня есть ниже, какой вид делает то, что я хочу, но я не смог найти правильный способ на самом деле прочитать шестнадцатеричное значение. Я бы предпочел использовать Chunky_PNG хотя, спасибо!

require 'chunky_png'

img = ChunkyPNG::Image.from_file("image.png")

height = img.dimension.height
width  = img.dimension.width

height.times do |i|
  width.times do |j|
    p [ChunkyPNG::Color.r(img[j,i]), ChunkyPNG::Color.g(img[j,i]), ChunkyPNG::Color.b(img[j,i])]
  end
end

ИЛИ ЖЕ

require 'RMagick'
include Magick

image = ImageList.new("image.png")
(0..image.columns).each do |x|
  (0..image.rows).each do |y|
    pixel = image.pixel_color(x, y)
    p [pixel.red, pixel.green, pixel.blue]
  end
end

2 ответа

Решение

Немного хакерского решения, но оно должно сработать.

require 'chunky_png'

img = ChunkyPNG::Image.from_file("image.png")

height = img.dimension.height
width  = img.dimension.width

height.times do |i|
  width.times do |j|
    arr = [ChunkyPNG::Color.r(img[j,i]), ChunkyPNG::Color.g(img[j,i]), ChunkyPNG::Color.b(img[j,i])]
    p "\##{arr.map {|x| x.to_s(16).rjust(2, '0')}.join.upcase}"
  end
end

Скажем, например, что вы хотите значение [204, 102, 0] (что означает #cc6600Вы можете использовать следующий код.

"\##{[204, 102, 0].map {|x| x.to_s(16).rjust(2, '0')}.join.upcase}"
=> "#CC6600"

Чтобы сломать это .to_s(16) преобразует целое число в шестнадцатеричный формат и .rjust(2, '0') добавляет "0", если строка не соответствует длине 2 символов.

Надеюсь это поможет.

При использовании RMagick вы можете использовать метод to_s для каждого цвета пикселя, чтобы найти соответствующее шестнадцатеричное значение. Это не совсем просто, но этот блог объясняет, как это сделать:

http://blog.kellishaver.com/image-color-analysis-with-rmagick/

Другие вопросы по тегам