Come visualizzare i dati binari non elaborati come un'immagine con larghezza e altezza indicate?


15

Esiste un programma per Linux in grado di visualizzare dati binari non elaborati?

Ogni byte nei miei file binari rappresenta un pixel, quindi sarebbe molto utile se esistesse qualcosa di simile dove potrei dire

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

e visualizzerebbe i pixel.

Mi chiedo se gnuplot, può essere usato per questo ...?


2
La domanda non ha senso. Per visualizzare dati binari non elaborati, è necessario convertirli in un modulo leggibile. Di solito questo modulo è esadecimale, che puoi usare hdper formattare. Quindi chiedi di vedere un'immagine. Se è un'immagine, sarà in un formato di immagine (come bmp) che avrà almeno un'intestazione che identifica il formato, la larghezza, l'altezza, la profondità del colore e forse anche una tavolozza dei colori allegato.
psusi

@psusi Mentre il titolo sarebbe migliore Come visualizzare i dati pixel non elaborati , l'intento di questa domanda è chiaro e ha perfettamente senso per me. ("Voglio che un programma mi permetta di specificare i metadati dell'immagine") Ha più senso col senno di poi (o forse dopo la modifica) anche per te?
Nathan Kidd,

@NathanKidd, ahh, sì .. se sai che è un'immagine che utilizza un formato specifico ma non ha intestazione, piuttosto che essere solo dati binari arbitrari ... capito.
psusi,


Risposte:


12

Per vedere i "dati binari grezzi", userei il comando hex dump hdohexdump

$ 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 61 | bb. <begin> .aaaaa |
00000030 61 0a 61 61 61 61 61 61 61 61 0a 61 61 61 61 61 61 | a.aaaaaaa.aaaaaa |
00000040 61 61 0a | aa. |
00000043

Non conosco alcun formato di immagine costituito da byte non strutturati: i valori RGB a 8 bit dei dati sono? Se il file contiene 30000 byte è RGB per 100x100 pixel o RGB per 50x200 pixel o RGB per 200x50 pixel o qualcos'altro? C'è una tavolozza? Devi sapere qualcosa sull'organizzazione dei dati!

Per visualizzarlo come immagine, utilizzare le utility NetPBM o forse ImageMagick per convertirlo in un modulo compreso da un visualizzatore di immagini

Se quanto sopra non è in grado di svolgere il lavoro, indagherei scrivendo un piccolo script Perl


Dove posso trovarlo? L'ho appena fatto yum search hdsul mio desktop Fedora e non ce l'aveva.
Sandra,

Va bene. Devo vedere i pixel come grafici ...
Sandra,

2
Il binario potrebbe essere chiamato hexdump. Su SuSE è nel util-linuxpacchetto.
Turbo J

FWIW è anche hexdumpnell'Arch.
Sparhawk,


10

convertda ImageMagick può farlo.

Ad esempio, una scala di grigi 2x3 a 8 bit:

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

Poi:

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

Spiegazione del comando:

  • -depth 8: ogni colore ha 8 bit
  • -size 2x3+0: 2x3immagine. +0significa partire dall'offset 0 nel file. Se ci sono intestazioni di metadati, puoi saltarle con l'offset.
  • gray:f: il file di input è fe il formato è gray, come definito in http://www.imagemagick.org/script/formats.php Questa strana notazione viene utilizzata perché ImageMagick di solito determina il formato dall'estensione, ma qui non c'è estensione .

Il problema ora è come visualizzare l'output. Un diretto eog:

eog out.png

non è molto buono perché l'immagine è troppo piccola e se ingrandisci molto eogusa un algoritmo di visualizzazione che mescola i pixel, il che è meglio per la maggior parte delle immagini, ma non nel nostro caso. Ho trovato due possibilità:

  • gimp out.png. Gli editor di immagini devono mostrare ogni singolo pixel.
  • convert out.png -scale 300x200 out2.png. -scaleè invece necessario -resize, poiché -resizemescola i pixel in modo simile eoga quello predefinito.

Produzione:

inserisci qui la descrizione dell'immagine

Esempio RGB:

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

inserisci qui la descrizione dell'immagine

Testato su Ubuntu 16.04, ImageMagick 6.8.9.


1
Un altro esempio: se hai un file in formato RGBA (diciamo /tmp/tex1.dat), puoi visualizzare l'immagine convertita direttamente con Imagemagick displaycome immagine di 128x256 pixel condisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau,

Cosa succede se i pixel hanno 10 ot 12 bit? Ho provato l' -endianopzione ma sembra che funzioni come -depth 16l'immagine, l'immagine è molto scura
sop

@sop non sono sicuro circa 10 12. 12 potrebbe funzionare con profondità 12? 10 Mi aspetto che sia necessario specificare ulteriormente quanti bit per canale, poiché 10 non è divisibile per 4 (RGBA) né 3 (RGB). Non sono sicuro di come si faccia.
Ciro Santilli 16 改造 中心 法轮功 六四 事件

4

Se non si desidera visualizzarlo direttamente ma piuttosto convertirlo, l' utilità di conversione può eseguire questa operazione:

Per leggere da stdin, assumendo 320 x 200 pixel, grigio a 8 bit, intestazione di 0, salvando in pic.png in formato PNG.

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

1
Per i principianti come me: gray:-significa formato graye -significa da stdin. Quindi il comando corrente si blocca in attesa di stdin. L'ho spiegato ulteriormente sulla mia risposta: superuser.com/a/978432/128124
Ciro Santilli 26 改造 中心 法轮功 六四 事件
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.