Как просмотреть необработанные двоичные данные в виде изображения с заданной шириной и высотой?


15

Существует ли программа для Linux, которая может отображать необработанные двоичные данные?

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

program_name --input=dat001.bin --width=200 --height=100

и он будет отображать пиксели.

Интересно, можно ли использовать gnuplot для этого ...?


2
Вопрос не имеет смысла. Чтобы отобразить необработанные двоичные данные, они должны быть преобразованы в удобочитаемую форму. Обычно эта форма является шестнадцатеричной, которую вы можете использовать hdдля форматирования. Затем вы просите увидеть изображение. Если это изображение, то оно будет в формате изображения (например, bmp), которое будет иметь как минимум заголовок, который определяет формат, ширину, высоту, глубину цвета и, возможно, также имеет цветовую палитру. прилагается.
psusi

@psusi Хотя название было бы лучше Как отображать необработанные пиксельные данные , цель этого вопроса ясна, и для меня это имеет смысл. («Я хочу, чтобы программа позволяла мне указывать метаданные изображения») Имеет ли это смысл для вас задним числом (или, возможно, после редактирования)?
Натан Кидд

@NathanKidd, ааа, да ... если вы знаете, что это изображение, использующее определенный формат, но не имеет заголовка, а не просто произвольные двоичные данные ... понятно.
Псуси


ffmpeg может к этому: stackoverflow.com/a/15037011/5447906
anton_rh

Ответы:


12

Чтобы увидеть «сырые двоичные данные», я бы использовал команду hex dump hdилиhexdump

$ hd -C a.txt
00000000 61 0a 61 61 0a 61 61 61 0a 61 61 61 61 0a 61 61 | a.aa.aaa.aaaa.aa |
00000010 61 61 61 0a 62 62 62 0a 62 62 62 62 0a 62 62 62 | aaa.bbb.bbbb.bbb |
00000020 62 62 0a 3c 62 65 67 69 6e 3e 0a 61 61 61 61 61 | bb. <Начало> .aaaaa |
00000030 61 0a 61 61 61 61 61 61 61 0a 61 61 61 61 61 61 | a.aaaaaaa.aaaaaa |
00000040 61 61 0a | aa. |
00000043

Я не знаю ни одного формата изображения, состоящего из неструктурированных байтов. Являются ли данные 8-битными значениями RGB? Если файл содержит 30000 байтов, это RGB для 100x100 пикселей или RGB для 50x200 пикселей или RGB для 200x50 пикселей или что-то еще? Есть ли палитра? Вы должны знать кое-что об организации данных!

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

Если вышеупомянутое не может сделать работу, я исследовал бы написание маленького сценария Perl


Где я могу получить это? Я только что сделал yum search hdна своем рабочем столе Fedora, и он не имел его.
Сандра

Ладно. Мне нужно увидеть пиксели в виде графика ...
Сандра

2
Двоичный файл может быть вызван hexdump. На SuSE это в util-linuxпакете.
Турбо J

FWIW это также hexdumpв Arch.
Sparhawk


10

convertиз ImageMagick может сделать это.

Например, 8-битная 2x3 шкала серого:

printf '\x00\xFF\x88\xFF\x00\xFF' > f

Потом:

convert -depth 8 -size 3x2+0 gray:f out.png

Объяснение команды:

  • -depth 8: каждый цвет имеет 8 бит
  • -size 2x3+0: 2x3изображение. +0означает начало со смещения 0 в файле. Если есть заголовки метаданных, вы можете пропустить их со смещением.
  • gray:f: входной файл f, и формат gray, как определено на http://www.imagemagick.org/script/formats.php Эта странная нотация используется, потому что ImageMagick обычно определяет формат из расширения, но здесь нет расширения ,

Теперь проблема в том, как просмотреть вывод. Прямой eog:

eog out.png

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

  • gimp out.png, Редакторы изображений должны показывать каждый пиксель.
  • convert out.png -scale 300x200 out2.png, -scaleвместо того -resize, чтобы -resizeсмешивать пиксели, как eogпо умолчанию.

Выход:

введите описание изображения здесь

Пример RGB:

printf '\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF' > f
convert -depth 8 -size 3x1+0 rgb:f out.png

введите описание изображения здесь

Протестировано на Ubuntu 16.04, ImageMagick 6.8.9.


1
Другой пример: если у вас есть файл в формате RGBA (скажем /tmp/tex1.dat), вы можете просматривать преобразованное изображение непосредственно с Imagemagick displayкак изображение размером 128x256 пикселей сdisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau

Что если пиксели имеют размер 10-12 бит? Я попробовал -endianвариант, но кажется, что он работает как -depth 16, изображение очень темное
соп

@sop не уверен насчет 10 12. 12 может работать с глубиной 12? 10 Я ожидаю, что вам нужно будет дополнительно указать, сколько бит на канал, так как 10 не делится ни на 4 (RGBA), ни на 3 (RGB). Не уверен, как это сделать.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

4

Если вы не хотите просматривать его напрямую, а конвертировать, утилита конвертирования может сделать это:

Для чтения из стандартного ввода, предполагая 320 x 200 пикселей, 8 бит серого, заголовок 0, сохраняя в pic.png в формате PNG.

convert -depth 8 -size 320x200+0 gray:- pic.png

1
Для новичков, как я: gray:-означает формат grayи -означает из stdin. Таким образом текущая команда зависает в ожидании стандартного ввода. Я объяснил это далее в своем ответе: superuser.com/a/978432/128124
Чиро Сантилли 事件 '中心 法轮功 六四 事件
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.