Прочитать изображение попиксельно в Ruby - PullRequest
11 голосов
/ 03 декабря 2010

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

Тип изображения: может быть BMP, JPG, GIF или PNG. Любой из них в порядке, и только один должен быть поддержан. Вывод цвета: RGB или Hex.

Я посмотрел пару библиотек (RMagick, Quick_Magick, Mini_Magick и т. Д.), И все они кажутся излишними. У Heroku также есть какие-то трудности с ImageMagick, и мои тесты не запускаются. Мое заявление в Синатре.

Есть предложения?

Ответы [ 3 ]

14 голосов
/ 03 декабря 2010

Я думаю Коренастый PNG должен сделать это за вас. Это чистый рубин, достаточно легкий, эффективный для памяти и обеспечивает доступ к пиксельным данным, а также к метаданным изображения.

14 голосов
/ 03 декабря 2010

Для этого вы можете использовать метод Rmagick each_pixel.each_pixel получает блок.Для каждого пикселя блоку передаются пиксель, номер столбца и номер строки пикселя.Он перебирает пиксели слева направо и сверху вниз.

Так что-то вроде:

pixels = []

img.each_pixel do |pixel, c, r|
    pixels.push(pixel)
end
# pixels now contains each individual pixel of img
0 голосов
/ 03 декабря 2010

Если вы открываете файл только для отображения байтов, и вам не нужно манипулировать им как изображением, то это простой процесс открытия файла, как и любого другого, чтения числа байтов по X и последующей итерации по ним. , Что-то вроде:

File.open('path/to/image.file', 'rb') do |fi|
  byte_block = fi.read(1024)
  byte_block.each_byte do |b|
    puts b.asc
  end 
end

Это будет просто выводить байты в виде десятичной дроби. Вы захотите взглянуть на байтовые значения и создать значения RGB для определения цветов, поэтому, возможно, использование each_slice(3) и чтение с кратностью 3 байта помогут.

Различные форматы изображений содержат различные блоки заголовка и конца, используемые для хранения информации об изображении, формате данных и информации EXIF ​​для устройства захвата, в зависимости от типа. Вероятно, что-то с несжатыми файлами было бы хорошо, если вы собираетесь читать файл и выводить байты напрямую, например, несжатый TIFF. Как только вы решили, что вы можете перейти в файл, чтобы пропустить заголовки, если хотите, или просто прочитать их тоже, чтобы увидеть или узнать, что в них. Страница Форматы графических файлов из Википедии - хорошая отправная точка для получения дополнительной информации о различных доступных форматах.

Если вы хотите видеть только данные изображения, то поможет одна из библиотек высокого уровня, поскольку у них есть интерфейсы для захвата определенных частей изображения. Но на самом деле доступ к байтам не сложен, и при этом он не прыгает.

Если вы хотите узнать больше о блоке EXIF, который используется для описания множества форматов Jpeg и TIFF различных поставщиков ExifTool может быть полезен. Он написан на Perl, поэтому вы можете посмотреть, как работает код. Документы прекрасно показывают блоки заголовка и поля, и вы можете читать / записывать значения с помощью приложения.

Я в процессе тестирования нового маршрутизатора, поэтому у меня не было возможности протестировать этот код, но он должен быть близко. Я проверю это немного и обновлю ответ, если это не сработало.

...