Bagaimana cara melihat data biner mentah sebagai gambar dengan lebar dan tinggi yang diberikan?

15

Apakah ada program untuk Linux yang dapat menampilkan data biner mentah?

Setiap byte dalam file biner saya mewakili piksel, jadi akan sangat berguna jika sesuatu seperti ini ada di tempat yang bisa saya katakan

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

dan itu akan menampilkan piksel.

Saya ingin tahu apakah gnuplot, dapat digunakan untuk ini ...?

Sandra
sumber
2
Pertanyaan tidak masuk akal. Untuk menampilkan data biner mentah, itu harus dikonversi ke bentuk yang dapat dibaca manusia. Biasanya formulir ini heksadesimal, yang dapat Anda gunakan hduntuk memformat. Kemudian Anda meminta untuk melihat gambar. Jika itu adalah gambar, maka itu akan berada dalam format gambar (seperti bmp) yang paling tidak, memiliki header yang mengidentifikasi format, lebar, tinggi, kedalaman warna, dan mungkin juga memiliki palet warna terlampir.
psusi
@psusi Sementara judul akan lebih baik Bagaimana menampilkan data piksel mentah , maksud dari pertanyaan ini jelas, dan benar-benar masuk akal bagi saya. ("Saya ingin program mengizinkan saya menentukan data meta data") Apakah Anda lebih masuk akal jika melihat ke belakang (atau mungkin setelah mengedit) kepada Anda juga?
Nathan Kidd
@NathanKidd, ahh, ya .. jika Anda tahu itu adalah gambar menggunakan format tertentu tetapi tidak memiliki header, daripada hanya data biner yang sewenang-wenang ... dapatkan ya.
psusi
1
askubuntu.com/questions/147554/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
ffmpeg dapat untuk itu: stackoverflow.com/a/15037011/5447906
anton_rh

Jawaban:

12

Untuk melihat "data biner mentah", saya akan menggunakan perintah hex dump hdatauhexdump

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

Saya tidak tahu format gambar apa pun yang terdiri dari byte yang tidak terstruktur - apakah nilai data 8-bit RGB? Jika file berisi 30000 byte apakah itu RGB untuk 100x100 piksel atau RGB untuk 50x200 piksel atau RGB untuk 200x50 piksel atau yang lainnya? Apakah ada palet? Anda harus tahu sesuatu tentang pengorganisasian data!

Untuk melihatnya sebagai gambar, saya akan menggunakan utilitas NetPBM atau mungkin ImageMagick untuk mengubahnya menjadi bentuk yang dimengerti oleh penampil gambar.

Jika di atas tidak bisa melakukan pekerjaan saya akan menyelidiki menulis skrip Perl kecil

RedGrittyBrick
sumber
Di mana saya bisa mendapatkan ini? Saya baru saja melakukannya yum search hddi desktop Fedora saya, dan tidak memilikinya.
Sandra
Baik. Saya perlu melihat pxiels sebagai grafik ...
Sandra
2
Biner mungkin dipanggil hexdump. Pada SuSE itu ada dalam util-linuxpaket.
Turbo J
FWIW juga ada hexdumpdi Arch.
Sparhawk
10

convertdari ImageMagick bisa melakukannya.

Misalnya, skala abu-abu 2x3 8-bit:

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

Kemudian:

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

Penjelasan perintah:

  • -depth 8: setiap warna memiliki 8 bit
  • -size 2x3+0: 2x3gambar. +0berarti mulai dari offset 0 dalam file. Jika ada header metadata, Anda dapat melewati mereka dengan offset.
  • gray:f: file input f, dan formatnya gray, seperti yang didefinisikan di http://www.imagemagick.org/script/formats.php Notasi aneh ini digunakan karena ImageMagick biasanya menentukan format dari ekstensi, tetapi di sini tidak ada ekstensi .

Masalahnya sekarang adalah bagaimana cara melihat output. A direct eog:

eog out.png

tidak terlalu baik karena gambarnya terlalu kecil, dan jika Anda memperbesar banyak eogmenggunakan algoritma tampilan yang mencampur piksel, yang lebih baik untuk sebagian besar gambar, tetapi tidak dalam kasus kami. Saya menemukan dua kemungkinan:

  • gimp out.png. Editor gambar harus menunjukkan setiap piksel.
  • convert out.png -scale 300x200 out2.png. -scalediperlukan alih-alih -resize, karena -resizemencampur piksel jauh seperti eogsecara default.

Keluaran:

masukkan deskripsi gambar di sini

Contoh RGB:

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

masukkan deskripsi gambar di sini

Diuji pada Ubuntu 16.04, ImageMagick 6.8.9.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
1
Contoh lain: jika Anda memiliki file dalam format RGBA (katakanlah /tmp/tex1.dat), Anda dapat melihat gambar yang dikonversi secara langsung dengan Imagemagick's displaysebagai 128x256 piksel gambar dengandisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau
Bagaimana jika pikselnya memiliki 10 atau 12 bit? Saya telah mencoba -endianopsi tetapi tampaknya berfungsi -depth 16, gambarnya sangat gelap
sop
@sop tidak yakin tentang 10 12. 12 mungkin bekerja dengan kedalaman 12? 10 Saya berharap Anda perlu menentukan lebih lanjut berapa banyak bit per saluran, karena 10 tidak dapat dibagi oleh 4 (RGBA) atau 3 (RGB). Tidak yakin bagaimana melakukan ini.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Jika tidak ingin melihatnya secara langsung, tetapi lebih baik konversikan utilitas konversi dapat melakukan ini:

Untuk membaca dari stdin, dengan asumsi 320 x 200 piksel, abu-abu 8 bit, tajuk 0, simpan ke pic.png dalam format PNG.

convert -depth 8 -size 320x200+0 gray:- pic.png
devilholk
sumber
1
Untuk pemula seperti saya: gray:-berarti format graydan -sarana dari stdin. Dengan demikian perintah saat ini hang menunggu stdin. Saya sudah menjelaskan lebih lanjut tentang jawaban saya: superuser.com/a/978432/128124
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件