Я пытаюсь выяснить, как загрузить изображение 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 изображения в некотором логическом порядке (начните сверху слева и работайте справа, или начните сверху слева и двигайтесь вниз и т. д.)