Làm cách nào để xem dữ liệu nhị phân thô dưới dạng hình ảnh với chiều rộng và chiều cao cho trước?


15

Có tồn tại một chương trình cho Linux có thể hiển thị dữ liệu nhị phân thô?

Mỗi byte trong các tệp nhị phân của tôi đại diện cho một pixel, vì vậy sẽ rất hữu ích nếu một cái gì đó như thế này tồn tại ở nơi tôi có thể nói

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

và nó sẽ hiển thị các pixel.

Tôi tự hỏi nếu gnuplot, có thể được sử dụng cho điều này ...?


2
Câu hỏi không có ý nghĩa. Để hiển thị dữ liệu nhị phân thô, nó phải được chuyển đổi thành dạng có thể đọc được. Thông thường hình thức này là thập lục phân, bạn có thể sử dụng hdđể định dạng. Sau đó, bạn yêu cầu để xem một hình ảnh. Nếu đó là một hình ảnh, thì nó sẽ ở định dạng hình ảnh (như bmp) ít nhất sẽ có một tiêu đề xác định định dạng, chiều rộng, chiều cao, độ sâu màu và cũng có thể có bảng màu đính kèm.
psusi

@psusi Mặc dù tiêu đề sẽ tốt hơn Cách hiển thị dữ liệu pixel thô , mục đích của câu hỏi này rất rõ ràng và hoàn toàn có ý nghĩa với tôi. ("Tôi muốn một chương trình cho phép tôi chỉ định dữ liệu meta hình ảnh") Nó có ý nghĩa hơn trong nhận thức muộn (hoặc có lẽ sau khi chỉnh sửa) với bạn không?
Nathan Kidd

@NathanKidd, ahh, vâng .. nếu bạn biết đó là một hình ảnh sử dụng một định dạng cụ thể nhưng không có tiêu đề, thay vì chỉ là dữ liệu nhị phân tùy ý ... có ya.
psusi


ffmpeg có thể với nó: stackoverflow.com/a/15037011/5447906
anton_rh

Câu trả lời:


12

Để xem "dữ liệu nhị phân thô", tôi sẽ sử dụng lệnh kết xuất hex hdhoặchexdump

$ 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. <Bắt đầu> .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

Tôi không biết bất kỳ định dạng hình ảnh nào bao gồm các byte không có cấu trúc - là các giá trị RGB 8 bit dữ liệu? Nếu tệp chứa 30000 byte thì đó là RGB cho 100x100 pixel hay RGB cho 50x200 pixel hay RGB cho 200x50 pixel hay cái gì khác? Có bảng màu không? Bạn phải biết một cái gì đó về tổ chức của dữ liệu!

Để xem nó dưới dạng hình ảnh, tôi sẽ sử dụng các tiện ích NetPBM hoặc có thể ImageMagick để chuyển đổi nó thành một hình thức được người xem hình ảnh hiểu

Nếu những điều trên không thể thực hiện được thì tôi sẽ điều tra viết một tập lệnh Perl nhỏ


Tôi có thể lấy cái này ở đâu? Tôi mới làm yum search hdtrên máy tính để bàn Fedora của tôi và nó không có nó.
Sandra

Được chứ. Tôi cần phải xem các pxiels như đồ họa ...
Sandra

2
Nhị phân có thể được gọi hexdump. Trên SuSE, nó nằm trong util-linuxgói.
Turbo J

FWIW nó cũng hexdumpở Arch.
Sparhawk


10

converttừ ImageMagick có thể làm điều đó.

Ví dụ: thang độ xám 2x3 8 bit:

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

Sau đó:

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

Lệnh giải thích:

  • -depth 8: mỗi màu có 8 bit
  • -size 2x3+0: 2x3hình ảnh. +0có nghĩa là bắt đầu ở offset 0 trong tệp. Nếu có các tiêu đề siêu dữ liệu, bạn có thể bỏ qua chúng với phần bù.
  • gray:f: tệp đầu vào là fvà định dạng gray, như được định nghĩa tại http://www.imagemagick.org/script/formats.php Ký hiệu kỳ lạ này được sử dụng vì ImageMagick thường xác định định dạng từ tiện ích mở rộng, nhưng ở đây không có tiện ích mở rộng .

Vấn đề bây giờ là làm thế nào để xem đầu ra. Một trực tiếp eog:

eog out.png

không tốt lắm vì hình ảnh quá nhỏ và nếu bạn phóng to nhiều thì eogsử dụng thuật toán hiển thị trộn lẫn các pixel, tốt hơn cho hầu hết các hình ảnh, nhưng không phải trong trường hợp của chúng tôi. Tôi tìm thấy hai khả năng:

  • gimp out.png. Trình chỉnh sửa hình ảnh phải hiển thị từng pixel.
  • convert out.png -scale 300x200 out2.png. -scalelà cần thiết thay vì -resize, theo mặc định -resizemixels pixel giống như nhiều eog.

Đầu ra:

nhập mô tả hình ảnh ở đây

Ví dụ RGB:

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

nhập mô tả hình ảnh ở đây

Đã thử nghiệm trên Ubuntu 16.04, ImageMagick 6.8.9.


1
Một ví dụ khác: nếu bạn có một tệp ở định dạng RGBA (giả sử /tmp/tex1.dat), bạn có thể xem hình ảnh được chuyển đổi trực tiếp với displayhình ảnh 128x256 pixel của Imagemagick vớidisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau

Nếu các pixel có 10 ot 12 bit thì sao? Tôi đã thử -endiantùy chọn nhưng có vẻ như nó hoạt động như -depth 16, hình ảnh rất tối
sop

@sop không chắc khoảng 10 12. 12 có thể hoạt động với độ sâu 12 không? 10 Tôi hy vọng bạn cần chỉ định thêm bao nhiêu bit cho mỗi kênh, vì 10 không chia hết cho 4 (RGBA) cũng như 3 (RGB). Không chắc làm việc này như thế nào.
Ciro Santilli 新疆 心 心 事件

4

Nếu không muốn xem trực tiếp mà chỉ chuyển đổi, tiện ích chuyển đổi có thể thực hiện việc này:

Để đọc từ stdin, giả sử 320 x 200 pixel, màu xám 8 bit, tiêu đề 0, lưu vào pic.png ở định dạng PNG.

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

1
Đối với những người mới như tôi: gray:-có nghĩa là định dạng gray-phương tiện từ stdin. Do đó, lệnh hiện tại bị treo chờ stdin. Tôi đã giải thích thêm về câu trả lời của mình: superuser.com/a/978432/128124
Ciro Santilli 心 心 事件
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.