Как преобразовать список байтов, сгенерированных из PNG, в значения RGB каждого пикселя? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь выяснить, как загрузить изображение PNG и создать матрицу, содержащую значения RGB каждого пикселя. В настоящее время я использую следующий метод для загрузки файла и получения различных значений RGB:

  def to_pixels
    File.open(@file, 'r') do |file|
      byte_block = file.read
      byte_block.each_byte do |byte|
        @pixels << byte
      end
    end
  end

Насколько я понимаю, каждый пиксель содержит 3 байта, представляющих значения R, G и B. Сначала я попытался взять выходной массив @pixels и сгруппировать его в подгруппы из 3 элементов, предполагая, что порядок пикселей и значение RGB каждого пикселя были сохранены в моем выводе. E.g.:

@pixels = @pixels.each_slice(3).to_a

Длина созданного мной массива была почти такой же длины, что и общее количество пикселей в моем исходном изображении, поэтому я воодушевлен. Тем не менее, я использовал ChunkyPNG, чтобы взять свой пиксельный массив RGB и распечатать обратно на изображение, и это выглядит как случайный цветовой шум. Могут ли некоторые байты, вводимые в @pixels, представлять метаданные? Или, может быть, выводимые байты не будут упорядочены как R, G, затем значения B отдельных изображений, но, возможно, все байты R, затем все байты G, а затем все байты B, например?

Я хотел бы выяснить, как преобразовать байтовый массив в массив массивов, группирующих значения RGB изображения в некотором логическом порядке (начните сверху слева и работайте справа, или начните сверху слева и двигайтесь вниз и т. д.)

1 Ответ

0 голосов
/ 08 сентября 2018

Драгоценный камень chunky_png может сделать это. https://github.com/wvanbergen/chunky_png

Что-то вроде:

img = ChunkyPNG::Image.from_file(@file)
img.pixels.each do |pixel|
 puts ChunkyPNG::Color.to_hex(pixel) # would spit out a hex string like "#b8e1f6ff"
end

Существует ряд других методов, если вам нужны другие форматы: to_grayscale, to_grayscale_alpha_bytes, to_grayscale_bytes, to_hex, to_hsb, to_hsl, to_hsv, to_s, to_truecolor_alpha_bytes * to_truecolor_by_by7

...