Comment afficher les données binaires brutes comme une image avec une largeur et une hauteur données?


15

Existe-t-il un programme pour Linux qui peut afficher des données binaires brutes?

Chaque octet dans mes fichiers binaires représente un pixel, il serait donc très utile que quelque chose comme ça existe où je pourrais dire

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

et il afficherait les pixels.

Je me demande si gnuplot, peut être utilisé pour ça ...?


2
La question n'a pas de sens. Pour afficher des données binaires brutes, elles doivent être converties en une forme lisible par l'homme. Habituellement, ce formulaire est hexadécimal, que vous pouvez utiliser hdpour formater. Ensuite, vous demandez à voir une image. S'il s'agit d'une image, elle sera dans un format d'image (comme bmp) qui aura au moins un en-tête qui identifie le format, la largeur, la hauteur, la profondeur de couleur et peut-être aussi une palette de couleurs attaché.
psusi

@psusi Alors que le titre serait mieux Comment afficher les données de pixels bruts , l'intention de cette question est claire et me semble totalement logique. ("Je veux qu'un programme me permette de spécifier les métadonnées de l'image") Est-ce que cela a plus de sens avec le recul (ou peut-être après l'édition) pour vous aussi?
Nathan Kidd du

@NathanKidd, ahh, oui .. si vous savez que c'est une image utilisant un format spécifique mais sans en-tête, plutôt que d'être simplement des données binaires arbitraires ...
psusi


Réponses:


12

Pour voir les "données binaires brutes", j'utiliserais la commande de vidage hexadécimal hdouhexdump

$ 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

Je ne connais aucun format d'image composé d'octets non structurés - les données sont-elles des valeurs RVB 8 bits? Si le fichier contient 30000 octets, est-ce que RVB pour 100x100 pixels ou RVB pour 50x200 pixels ou RVB pour 200x50 pixels ou autre chose? Y a-t-il une palette? Vous devez savoir quelque chose sur l'organisation des données!

Pour le voir comme une image, j'utiliserais les utilitaires NetPBM ou peut-être ImageMagick pour le convertir en une forme comprise par une visionneuse d'images

Si ce qui précède ne peut pas faire le travail, j'envisagerais d'écrire un petit script Perl


Où puis-je obtenir cela? Je viens de le faire yum search hdsur mon bureau Fedora, et il ne l'avait pas.
Sandra

D'accord. J'ai besoin de voir les pxiels comme des graphiques ...
Sandra

2
Le binaire pourrait être appelé hexdump. Sur SuSE, il est dans le util-linuxpackage.
Turbo J

FWIW c'est aussi hexdumpdans Arch.
Sparhawk


10

convertd'ImageMagick peut le faire.

Par exemple, une échelle de gris 2x3 8 bits:

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

Alors:

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

Explication de la commande:

  • -depth 8: chaque couleur a 8 bits
  • -size 2x3+0: 2x3image. +0signifie commencer à l'offset 0 dans le fichier. S'il existe des en-têtes de métadonnées, vous pouvez les ignorer avec le décalage.
  • gray:f: le fichier d'entrée est f, et le format est gray, comme défini sur http://www.imagemagick.org/script/formats.php Cette notation bizarre est utilisée car ImageMagick détermine généralement le format à partir de l'extension, mais ici il n'y a pas d'extension .

Le problème est maintenant de savoir comment afficher la sortie. Un direct eog:

eog out.png

n'est pas très bon car l'image est trop petite, et si vous zoomez beaucoup eogutilise un algorithme d'affichage qui mélange les pixels, ce qui est mieux pour la plupart des images, mais pas dans notre cas. J'ai trouvé deux possibilités:

  • gimp out.png. Les éditeurs d'images doivent afficher chaque pixel.
  • convert out.png -scale 300x200 out2.png. -scaleest nécessaire à la place de -resize, car les -resizepixels sont mélangés comme eogpar défaut.

Production:

entrez la description de l'image ici

Exemple RVB:

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

entrez la description de l'image ici

Testé sur Ubuntu 16.04, ImageMagick 6.8.9.


1
Un autre exemple: si vous avez un fichier au format RGBA (disons /tmp/tex1.dat), vous pouvez visualiser l'image convertie directement avec Imagemagick en displaytant qu'image 128x256 pixels avecdisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau

Et si les pixels ont 10 ou 12 bits? J'ai essayé l' -endianoption mais il semble que cela fonctionne comme le -depth 16, l'image est très sombre
sop

@sop pas sûr de 10 12. 12 pourrait fonctionner avec la profondeur 12? 10 Je m'attends à ce que vous deviez spécifier davantage le nombre de bits par canal, car 10 n'est pas divisible par 4 (RGBA) ni 3 (RGB). Je ne sais pas comment faire ça.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

Si vous ne souhaitez pas le visualiser directement, mais plutôt le convertir, l' utilitaire de conversion peut le faire:

Pour lire à partir de stdin, en supposant 320 x 200 pixels, 8 bits gris, en-tête de 0, enregistrement au format pic.png au format PNG.

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

1
Pour les newbs comme moi: gray:-signifie format grayet -signifie de stdin. Ainsi, la commande actuelle se bloque en attendant stdin. Je l'ai expliqué plus en détail dans ma réponse: superuser.com/a/978432/128124
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.