วิธีดูข้อมูลไบนารีแบบดิบเป็นภาพที่มีความกว้างและความสูงที่กำหนด


15

มีโปรแกรมสำหรับ Linux ที่สามารถแสดงข้อมูลไบนารีแบบดิบหรือไม่?

แต่ละไบต์ในไฟล์ไบนารีของฉันแทนพิกเซลดังนั้นมันจะมีประโยชน์มากหากมีสิ่งนี้ที่ฉันสามารถพูดได้

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

และมันจะแสดงพิกเซล

ฉันสงสัยว่า gnuplot สามารถใช้กับสิ่งนี้ได้ไหม ...


2
คำถามไม่สมเหตุสมผล ในการแสดงข้อมูลไบนารีแบบดิบนั้นจะต้องถูกแปลงเป็นรูปแบบที่มนุษย์สามารถอ่านได้ โดยปกติฟอร์มนี้เป็นเลขฐานสิบหกซึ่งคุณสามารถใช้จัดhdรูปแบบได้ จากนั้นคุณขอดูภาพ ถ้าเป็นรูปภาพก็จะอยู่ในรูปแบบภาพ (เช่น bmp) อย่างน้อยที่สุดจะมีส่วนหัวที่ระบุรูปแบบความกว้างความสูงความลึกของสีและอาจมีจานสี แนบมาด้วย
psusi

@psusi ในขณะที่ชื่อจะดีกว่าวิธีการแสดงข้อมูลพิกเซลแบบดิบเจตนาของคำถามนี้ชัดเจนและฉันก็มีเหตุผลทั้งหมด ("ฉันต้องการให้โปรแกรมให้ฉันระบุข้อมูลเมตาของภาพ") มันทำให้รู้สึกถึงปัญหาย้อนหลัง (หรืออาจจะหลังจากการแก้ไข) กับคุณหรือไม่
นาธาน Kidd

@NathanKidd, อ่าาาาาาาาาา .. ถ้าคุณรู้ว่ามันเป็นภาพที่ใช้รูปแบบเฉพาะ แต่ไม่มีส่วนหัวแทนที่จะเป็นแค่ข้อมูลไบนารีโดยพลการ ...
psusi


ffmpeg สามารถทำได้: stackoverflow.com/a/15037011/5447906
anton_rh

คำตอบ:


12

หากต้องการดู "ข้อมูลไบนารีดิบ" ฉันจะใช้คำสั่ง hex dump hdหรือhexdump

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

ฉันไม่รู้รูปแบบภาพใด ๆ ที่ประกอบด้วยไบต์ที่ไม่มีโครงสร้าง - ค่า RGB 8 บิตของข้อมูลคืออะไร หากไฟล์มีขนาด 30000 ไบต์นั่นคือ RGB สำหรับ 100x100 พิกเซลหรือ RGB สำหรับ 50x200 พิกเซลหรือ RGB สำหรับ 200x50 พิกเซลหรืออย่างอื่น? มีจานสีหรือไม่? คุณต้องรู้อะไรเกี่ยวกับองค์กรของข้อมูล!

หากต้องการดูเป็นภาพฉันจะใช้โปรแกรมอรรถประโยชน์ NetPBMหรือImageMagickเพื่อแปลงเป็นรูปแบบที่โปรแกรมดูรูปภาพเข้าใจ

ถ้าข้างต้นไม่สามารถทำงานได้ฉันจะตรวจสอบการเขียนสคริปต์ Perlขนาดเล็ก


ฉันจะหาได้จากที่ไหน ฉันเพิ่งทำyum search hdบนเดสก์ท็อป Fedora ของฉันและมันไม่มี
Sandra

ตกลง. ฉันต้องการที่จะเห็น pxiels เป็นกราฟิก ...
แซนดร้า

2
hexdumpไบนารีอาจจะเรียกว่า ใน SuSE มันอยู่ในutil-linuxแพ็คเกจ
Turbo J

FWIW มันhexdumpอยู่ใน Arch ด้วย
Sparhawk


10

convertจาก ImageMagickสามารถทำได้

เช่น 8-bit 2x3 โทนสีเทา:

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

แล้ว:

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

คำอธิบายคำสั่ง:

  • -depth 8: แต่ละสีมี 8 บิต
  • -size 2x3+0: 2x3รูปภาพ +0หมายถึงเริ่มต้นที่ offset 0 ในไฟล์ หากมีส่วนหัวเมทาดาทาคุณสามารถข้ามส่วนเหล่านั้นได้ด้วยออฟเซ็ต
  • gray:f: ไฟล์อินพุตคือfและรูปแบบคือgrayตามที่กำหนดไว้ที่http://www.imagemagick.org/script/formats.phpสัญกรณ์แปลก ๆ นี้ใช้เนื่องจาก ImageMagick มักจะกำหนดรูปแบบจากส่วนขยาย แต่ที่นี่ไม่มีส่วนขยาย .

ปัญหาตอนนี้คือวิธีดูผลลัพธ์ โดยตรงeog:

eog out.png

ไม่ดีมากเพราะภาพมีขนาดเล็กเกินไปและหากคุณซูมเข้ามาก ๆeogจะใช้อัลกอริทึมการแสดงผลที่ผสมพิกเซลขึ้นมาซึ่งจะดีกว่าสำหรับรูปภาพส่วนใหญ่ แต่ไม่ใช่ในกรณีของเรา ฉันพบความเป็นไปได้สองประการ:

  • gimp out.png. โปรแกรมแก้ไขรูปภาพจะต้องแสดงทุกพิกเซล
  • convert out.png -scale 300x200 out2.png. -scaleเป็นสิ่งจำเป็นแทน-resizeเนื่องจากค่าเริ่มต้น-resizeผสมพิกเซลได้มากeogตามค่าเริ่มต้น

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง RGB:

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

ป้อนคำอธิบายรูปภาพที่นี่

ทดสอบบน Ubuntu 16.04, ImageMagick 6.8.9


1
อีกตัวอย่างหนึ่ง: หากคุณมีไฟล์ในรูปแบบ RGBA (พูด/tmp/tex1.dat) คุณสามารถดูภาพที่แปลงแล้วได้โดยตรงด้วย Imagemagick ซึ่งdisplayเป็นรูปภาพขนาด 128x256 พิกเซลพร้อมdisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau

เกิดอะไรขึ้นถ้าพิกเซลมี 10 ot 12 บิต? ฉันได้ลองใช้-endianตัวเลือกแล้ว แต่ดูเหมือนว่ามันจะทำงานได้เหมือน-depth 16กันภาพมืดมาก
สบ

@sop ไม่แน่ใจเกี่ยวกับ 10 12. 12 อาจทำงานกับความลึก 12 ได้หรือไม่ 10 ฉันคาดว่าคุณจะต้องระบุจำนวนบิตต่อช่องเพิ่มเติมเนื่องจาก 10 ไม่สามารถหารด้วย 4 (RGBA) หรือ 3 (RGB) ไม่แน่ใจว่าจะทำอย่างไร
Ciro Santilli 新疆改造中心法轮功六四事件

4

หากไม่ต้องการดูโดยตรง แต่ต้องการแปลงเป็นยูทิลิตีConvertสามารถทำได้:

หากต้องการอ่านจาก stdin สมมติว่า 320 x 200 พิกเซลสีเทา 8 บิตส่วนหัวเป็น 0 บันทึกไปยัง pic.png ในรูปแบบ PNG

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

1
สำหรับ newbs อย่างฉัน: gray:-หมายถึงรูปแบบgrayและค่า-เฉลี่ยจาก stdin ดังนั้นคำสั่งปัจจุบันจะหยุดรอ stdin ฉันได้อธิบายเพิ่มเติมเกี่ยวกับคำตอบของฉันแล้ว: superuser.com/a/978432/128124
Ciro Santilli 事件改造中心中心法轮功六四事件
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.