Як переглянути необроблені двійкові дані як зображення із заданою шириною та висотою?


15

Чи існує програма для Linux, яка може відображати необроблені бінарні дані?

Кожен байт у моїх бінарних файлах являє собою піксель, тому було б дуже корисно, якби щось подібне існує там, де я міг би сказати

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

і він відображав би пікселі.

Цікаво, чи можна використовувати gnuplot для цього ...?


2
Питання не має сенсу. Щоб відобразити необроблені бінарні дані, вони повинні бути перетворені у форму, читану людиною. Зазвичай ця форма є шістнадцятковою, яку ви можете використовувати hdдля форматування. Потім ви попросите переглянути зображення. Якщо це зображення, то воно буде у форматі зображення (наприклад, bmp), який, як мінімум, матиме заголовок, який визначає формат, ширину, висоту, глибину кольору, а може також мати кольорову палітру додається.
psusi

@psusi Хоча назва буде кращою Як відображати необроблені дані пікселів , ціль цього питання зрозуміла і для мене цілком має сенс. ("Я хочу, щоб програма дозволила мені вказати метадані зображення") Чи має більше сенсу заднім числом (або, можливо, після редагування) і вам?
Nathan Kidd

@NathanKidd, ах, так .. якщо ви знаєте, що це зображення у певному форматі, але не має заголовка, а не просто довільних двійкових даних ...
psusi


FFmpeg може йому: stackoverflow.com/a/15037011/5447906
anton_rh

Відповіді:


12

Щоб побачити "необроблені двійкові дані", я б скористався командою шістнадцятковий дамп 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. <begin> .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). Не знаєте, як це зробити.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

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

Читати з stdin, передбачаючи 320 x 200 пікселів, 8 біт сірого кольору, заголовок 0, збереження до pic.png у форматі PNG.

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

1
Для новичок, як я: gray:-означає формат grayі -засоби від stdin. Таким чином, поточна команда висить в очікуванні stdin. Я пояснив це далі у своїй відповіді: superuser.com/a/978432/128124
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.