Wie kann ich Binärdaten als Bild mit einer bestimmten Breite und Höhe anzeigen?

15

Gibt es ein Programm für Linux, das binäre Rohdaten anzeigen kann?

Jedes Byte in meinen Binärdateien stellt ein Pixel dar, daher wäre es sehr nützlich, wenn es so etwas gibt, wo ich sagen könnte

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

und es würde die Pixel anzeigen.

Ich frage mich, ob Gnuplot dafür verwendet werden kann ...?

Sandra
quelle
2
Frage macht keinen Sinn. Um binäre Rohdaten anzuzeigen, müssen diese in eine für Menschen lesbare Form konvertiert werden. Normalerweise ist dieses Formular hexadezimal und kann hdzum Formatieren verwendet werden. Dann fragst du nach einem Bild. Wenn es sich um ein Bild handelt, wird es in einem Bildformat (wie bmp) vorliegen, das mindestens eine Kopfzeile enthält, die das Format, die Breite, die Höhe, die Farbtiefe und möglicherweise auch eine Farbpalette angibt befestigt.
Psusi
@psusi Während der Titel besser wäre Wie man rohe Pixeldaten anzeigt , ist die Absicht dieser Frage klar und macht für mich total Sinn. ("Ich möchte ein Programm, mit dem ich die Bild-Metadaten spezifizieren kann") Ist es im Nachhinein (oder vielleicht nach der Bearbeitung) für Sie auch sinnvoller?
Nathan Kidd
@ NathanKidd, ahh, ja ... wenn Sie wissen, dass es sich um ein Bild handelt, das ein bestimmtes Format verwendet, aber keinen Header hat, anstatt nur willkürliche Binärdaten zu sein ... ja.
Psusi
ffmpeg kann dazu: stackoverflow.com/a/15037011/5447906
anton_rh

Antworten:

12

Um die "rohen Binärdaten" zu sehen, würde ich den Hex-Dump-Befehl hdoder verwendenhexdump

$ hd -C a.txt
00000000 61 0a 61 61 0a 61 61 61 0a 61 61 61 0a 61 61 | a.aa.aa.aaaa.aa |
00000010 61 61 61 0a 62 62 62 0a 62 62 62 62 0a 62 62 62 | aaa.bbb.bbb.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 | a.aaaaaaa.aaaaa |
00000040 61 61 0a | aa. |
00000043

Ich kenne kein Bildformat, das aus unstrukturierten Bytes besteht - sind die Daten 8-Bit-RGB-Werte? Wenn die Datei 30000 Bytes enthält, ist das RGB für 100x100 Pixel oder RGB für 50x200 Pixel oder RGB für 200x50 Pixel oder etwas anderes? Gibt es eine Palette? Sie müssen etwas über die Organisation der Daten wissen!

Um es als Bild anzuzeigen, würde ich die NetPBM-Dienstprogramme oder vielleicht ImageMagick verwenden , um es in eine Form zu konvertieren, die von einem Bildbetrachter verstanden wird

Wenn das oben Genannte nicht funktioniert, würde ich untersuchen, wie man ein kleines Perl-Skript schreibt

RedGrittyBrick
quelle
Wo kann ich das bekommen? Ich habe es gerade yum search hdauf meinem Fedora-Desktop gemacht und es hatte es nicht.
Sandra
Okay. Ich muss die pxiels als Grafik sehen ...
Sandra
2
Die Binärdatei könnte aufgerufen werden hexdump. Auf SuSE ist es im util-linuxPaket.
Turbo J
FWIW ist es auch hexdumpin Arch.
Sparhawk
10

convertvon ImageMagick kann es tun.

ZB ein 8-Bit-2x3-Graustufenbild:

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

Dann:

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

Befehlserklärung:

  • -depth 8: Jede Farbe hat 8 Bits
  • -size 2x3+0: 2x3image. +0bedeutet beginnend mit Offset 0 in der Datei. Wenn Metadaten-Header vorhanden sind, können Sie diese mit dem Versatz überspringen.
  • gray:f: Die Eingabedatei ist fund das Format ist graywie unter http://www.imagemagick.org/script/formats.php definiert. Diese seltsame Notation wird verwendet, weil ImageMagick normalerweise das Format anhand der Erweiterung bestimmt, aber hier gibt es keine Erweiterung .

Das Problem ist nun, wie die Ausgabe angezeigt wird. Eine direkte eog:

eog out.png

ist nicht sehr gut, weil das Bild zu klein ist, und wenn Sie viel zoomen, eogwird ein Anzeigealgorithmus verwendet, der Pixel mischt, was für die meisten Bilder besser ist, in unserem Fall jedoch nicht. Ich habe zwei Möglichkeiten gefunden:

  • gimp out.png. Bildbearbeiter müssen jedes einzelne Pixel anzeigen.
  • convert out.png -scale 300x200 out2.png. -scalewird stattdessen benötigt -resize, da -resizePixel ähnlich wie eogstandardmäßig hochgemischt werden.

Ausgabe:

Bildbeschreibung hier eingeben

RGB Beispiel:

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

Bildbeschreibung hier eingeben

Getestet unter Ubuntu 16.04, ImageMagick 6.8.9.

Ciro Santilli ist ein Schauspieler
quelle
1
Ein weiteres Beispiel: Wenn Sie eine Datei im RGBA-Format (etwa /tmp/tex1.dat) haben, können Sie das konvertierte Bild mit Imagemagick's direkt displayals 128x256 Pixel-Bild mitdisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau
Was ist, wenn die Pixel 10 oder 12 Bits haben? Ich habe die -endianOption ausprobiert, aber es scheint, als würde sie funktionieren -depth 16, das Bild ist sehr dunkel
sop
@sop nicht sicher über 10 12. 12 könnte mit Tiefe 12 arbeiten? 10 Ich gehe davon aus, dass Sie die Anzahl der Bits pro Kanal weiter spezifizieren müssen, da 10 weder durch 4 (RGBA) noch durch 3 (RGB) teilbar ist. Ich bin mir nicht sicher, wie ich das machen soll.
Ciro Santilli
4

Wenn Sie es nicht direkt anzeigen, sondern konvertieren möchten, können Sie dies mit dem Dienstprogramm convert tun:

Zum Lesen von stdin, vorausgesetzt 320 x 200 Pixel, 8-Bit-Grau, Header von 0, Speichern in pic.png im PNG-Format.

convert -depth 8 -size 320x200+0 gray:- pic.png
Devilholk
quelle
1
Für Neulinge wie mich: gray:-bedeutet Format grayund -bedeutet von stdin. Somit hängt der aktuelle Befehl und wartet auf stdin. Ich habe es auf meiner Antwort weiter erklärt: superuser.com/a/978432/128124
Ciro Santilli 新疆 at 法轮功 六四 事件