如何将原始二进制数据查看为具有给定宽度和高度的图像?


15

是否存在用于Linux的程序,可以显示原始二进制数据?

我的二进制文件中的每个字节都代表一个像素,所以如果存在类似这样的地方,那将非常有用。

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

它会显示像素。

我想知道gnuplot是否可以用于此...?


2
问题没有道理。要显示原始二进制数据,必须将其转换为人类可读的形式。通常,此格式为十六进制,可用于hd格式化。然后,您要求查看图像。如果它是图像,那么它将至少是一种图像格式(如bmp),它将具有标识格式,宽度,高度,色深的标头,并且还可能具有调色板附上。
psusi 2011年

@psusi虽然标题会更好,但如何显示原始像素数据,这个问题的目的很明确,对我来说完全有意义。(“我想让一个程序让我指定图像元数据”)从事后(或在编辑之后)对您来说是否更有意义?
内森·基德

@NathanKidd,嗯,是的。如果您知道它是使用特定格式的图像,但没有标题,而不仅仅是任意的二进制数据...就可以了。
psusi


Answers:


12

要查看“原始二进制数据”,我将使用hex dump命令hdhexdump

$ 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。<开始> .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

我不知道任何包含非结构化字节的图像格式-数据是8位RGB值吗?如果文件包含30000字节,是RGB 100x100像素还是RGB 50x200像素还是RGB 200x50像素还是其他?有调色板吗?您必须了解有关数据组织的知识!

要将其查看为图像,我将使用NetPBM实用程序ImageMagick将其转换为图像查看器可以理解的形式

如果以上无法完成任务,我将调查编写一个小的Perl脚本


我在哪里可以得到?我只是yum search hd在我的Fedora桌面上做的,却没有。
桑德拉(Sandra)

好的。我需要查看图形中的像素……
Sandra

2
该二进制文件可能称为hexdump。在SuSE上,它在util-linux包装中。
Turbo J

FWIW也在hexdumpArch中。
Sparhawk


10

convert从ImageMagick可以做到。

例如,一个8位2x3灰度:

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

然后:

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

命令说明:

  • -depth 8:每种颜色都有8位
  • -size 2x3+02x3图片。+0表示从文件中的偏移量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),则可以display使用display -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau,2016年

如果像素有10位或12位怎么办?我已经尝试过该-endian选项,但它似乎像一样工作-depth 16,图像非常暗

@sop不确定约1012。12可能适用于深度12?10我希望您需要进一步指定每个通道有多少位,因为10不能被4(RGBA)或3(RGB)整除。不确定如何执行此操作。
Ciro Santilli新疆改造中心法轮功六四事件

4

如果不想直接查看它,而是将其转换为实用程序可以做到这一点:

要从stdin读取,假设320 x 200像素,8位灰度,标头为0,以PNG格式保存到pic.png。

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

1
对于像我这样的新手来说:gray:-表示格式gray-标准输入。因此,当前命令挂起,等待标准输入。我已经在回答中进一步解释了此问题:superuser.com/a/978432/128124
Ciro Santilli新疆改造中心法轮功六四事件
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.