Jak wyświetlić surowe dane binarne jako obraz o podanej szerokości i wysokości?

15

Czy istnieje program dla systemu Linux, który może wyświetlać surowe dane binarne?

Każdy bajt w moich plikach binarnych reprezentuje piksel, więc byłoby bardzo przydatne, gdyby coś takiego istniało tam, gdzie mógłbym powiedzieć

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

i wyświetlałoby piksele.

Zastanawiam się, czy można do tego użyć gnuplot ...?

Sandra
źródło
2
Pytanie nie ma sensu. Aby wyświetlić surowe dane binarne, należy je przekonwertować na postać czytelną dla człowieka. Zwykle ten formularz jest szesnastkowy, którego można użyć hddo sformatowania. Następnie poprosisz o obejrzenie obrazu. Jeśli jest to obraz, to będzie on w formacie obrazu (takim jak bmp), który przynajmniej będzie miał nagłówek, który identyfikuje format, szerokość, wysokość, głębię kolorów, a może także mieć paletę kolorów przywiązany.
psusi
@psusi Chociaż tytuł byłby lepszy Jak wyświetlać surowe dane w pikselach , intencja tego pytania jest jasna i całkowicie dla mnie sensowna. („Chcę, aby program pozwolił mi określić metadane obrazu”) Czy ma to więcej sensu z perspektywy czasu (a może po edycji) również dla Ciebie?
Nathan Kidd,
@NathanKidd, ahh, tak .. jeśli wiesz, że jest to obraz w określonym formacie, ale nie ma nagłówka, a nie tylko zwykłe dane binarne ... masz.
psusi
1
askubuntu.com/questions/147554/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
ffmpeg może to zrobić: stackoverflow.com/a/15037011/5447906
anton_rh

Odpowiedzi:

12

Aby zobaczyć „surowe dane binarne”, użyłbym polecenia zrzutu szesnastkowego hdlubhexdump

$ 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

Nie znam żadnego formatu obrazu składającego się z nieustrukturyzowanych bajtów - czy dane mają 8-bitowe wartości RGB? Jeśli plik zawiera 30000 bajtów, czy to RGB dla 100 x 100 pikseli, RGB dla 50 x 200 pikseli lub RGB dla 200 x 50 pikseli, czy coś innego? Czy jest paleta? Musisz wiedzieć coś o organizacji danych!

Aby wyświetlić go jako obraz, użyłbym narzędzi NetPBM, a może ImageMagick, aby przekonwertować go do postaci zrozumiałej dla przeglądarki zdjęć

Jeśli powyższe nie może wykonać zadania, zbadam napisanie małego skryptu Perla

RedGrittyBrick
źródło
Gdzie mogę to zdobyć? Zrobiłem to yum search hdna pulpicie Fedory i nie miałem go.
Sandra,
W porządku. Muszę zobaczyć piksele jako grafikę ...
Sandra,
2
Może być wywołany plik binarny hexdump. Na SuSE jest w util-linuxpakiecie.
Turbo J
FWIW jest także hexdumpw Arch.
Sparhawk
10

convertz ImageMagick może to zrobić.

Np. 8-bitowa skala szarości 2x3:

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

Następnie:

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

Wyjaśnienie polecenia:

  • -depth 8: każdy kolor ma 8 bitów
  • -size 2x3+0: 2x3obraz. +0oznacza rozpoczęcie od przesunięcia 0 w pliku. Jeśli są nagłówki metadanych, możesz je pominąć z przesunięciem.
  • gray:f: plik wejściowy ma fformat grayzgodny z definicją podaną na stronie http://www.imagemagick.org/script/formats.php Ta dziwna notacja jest używana, ponieważ ImageMagick zwykle określa format na podstawie rozszerzenia, ale tutaj nie ma rozszerzenia .

Problem polega teraz na tym, jak wyświetlić dane wyjściowe. Bezpośredni eog:

eog out.png

nie jest zbyt dobry, ponieważ obraz jest zbyt mały, a jeśli powiększasz dużo, eogużywa algorytmu wyświetlania, który miesza piksele, co jest lepsze dla większości zdjęć, ale nie w naszym przypadku. Znalazłem dwie możliwości:

  • gimp out.png. Edytory obrazów muszą pokazywać każdy pojedynczy piksel.
  • convert out.png -scale 300x200 out2.png. -scalejest potrzebne zamiast -resize, ponieważ -resizedomyślnie miksuje piksele w górę eog.

Wynik:

wprowadź opis zdjęcia tutaj

Przykład RGB:

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

wprowadź opis zdjęcia tutaj

Testowany na Ubuntu 16.04, ImageMagick 6.8.9.

Ciro Santilli
źródło
1
Kolejny przykład: jeśli masz plik w formacie RGBA (powiedzmy /tmp/tex1.dat), możesz zobaczyć przekonwertowany obraz bezpośrednio za pomocą Imagemagick displayjako obraz 128x256 pikseli za pomocądisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau
Co jeśli piksele mają 10 lub 12 bitów? Wypróbowałem tę -endianopcję, ale wygląda na to, że działa jak -depth 16, obraz jest bardzo ciemny
sop
@sop nie jestem pewien co do 10 12. 12 może działać z głębokością 12? 10 Oczekuję, że będziesz musiał sprecyzować, ile bitów na kanał, ponieważ 10 nie jest podzielne przez 4 (RGBA) ani 3 (RGB). Nie jestem pewien, jak to zrobić.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Jeśli nie chcesz go oglądać bezpośrednio, ale raczej przekonwertować, narzędzie do konwersji może to zrobić:

Do odczytu ze standardowego, zakładając 320 x 200 pikseli, 8-bitowy szary, nagłówek 0, zapisywanie do pic.png w formacie PNG.

convert -depth 8 -size 320x200+0 gray:- pic.png
diabełek
źródło
1
Dla newbs takich jak ja: gray:-oznacza format grayi -oznacza ze standardowego. Tak więc bieżące polecenie zawiesza się, czekając na standardowe wejście. Wyjaśniłem to dalej na mojej odpowiedzi: superuser.com/a/978432/128124
Ciro Santilli 26 改造 中心 法轮功 六四 事件