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

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

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

我的二进制文件中的每个字节代表一个像素,因此如果存在这样的内容,我将非常有用

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

它就会显示像素。

我想知道 gnuplot 是否可以用于这个……?

答案1

convert来自 ImageMagick

例如,8 位 2x3 灰度:

printf '\x00\xFF\x88\xFF\x00\xFF' > in.bin

然后:

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

命令解释:

  • -depth 8:每种颜色有 8 位
  • -size 2x3+02x3image.+0表示从文件中的偏移量 0 开始。如果有元数据标头,则可以使用偏移量跳过它们。
  • gray:in.bin:输入文件为in.bin,格式为gray,定义在http://www.imagemagick.org/script/formats.php使用这种奇怪的符号是因为 ImageMagick 通常根据扩展名来确定格式,但这里没有扩展名。

如何查看类似本例的微小输出

现在的问题是如何准确查看如此微小的 3x2 输出。直接eog

eog out.png

不是很好,因为图像太小,如果放大,eog会使用连续混合像素的显示算法,这对于大多数图片来说比较好,但对于这么小的图像则不然。

一个很好的可能性是运行:

convert out.png -scale 300x out2.png

或者直接一次性执行:

convert -depth 8 -size 3x2+0 gray:in.bin -scale 300x out.png

-scale是需要的,而不是-resize,因为它-resize像默认情况下一样连续混合像素颜色eog

输出:

在此处输入图片描述

另一个选择是在 Gimp 中查看它:

gimp out.png

如果您将图像放大到足够大,Gimp 等图像编辑器必须单独显示每个像素。

RGB 示例

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

或者使用以下方式-scale使其更易于查看:

convert -depth 8 -size 3x1+0 rgb:in.bin -scale 300x out.png

在此处输入图片描述

有关的:

在 Ubuntu 16.04、ImageMagick 6.8.9 上测试。

答案2

要查看“原始二进制数据”,我将使用十六进制转储命令hexdump†。我将使用该-C选项,以便能够更轻松地查看 ASCII 文本,例如JFIFPNG以防数据不是原始数据而是更结构化的形式。

$ hexdump -C 示例.img
00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 |......JFIF.....H|
00000010 00 48 00 00 ff db 00 43 00 06 04 05 06 05 04 06 |.H.....C........|
00000020 06 05 06 07 07 06 08 0a 10 0a 0a 09 09 0a 14 0e |................|
00000030 0f 0c 10 17 14 18 18 17 14 16 16 1a 1d 25 1f 1a |.............%..|
00000040 1b 23 1c 16 16 20 2c 20 23 26 27 29 2a 29 19 1f |.#... , #&')*)..|
00000050 2d 30 2d 28 30 25 28 29 28 ff db 00 43 01 07 07 |-0-(0%()(...C...|
00000060 07 0a 08 0a 13 0a 0a 13 28 1a 16 1a 28 28 28 28 |........(...((((|
00000070 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 |(((((((((((((|
*
00000090 28 28 28 28 28 28 28 28 28 28 28 28 28 28 ff c0 |((((((((((((..|
000000a0 00 11 08 00 80 00 64 03 01 22 00 02 11 01 03 11 |......d..”......|
000000b0 01 ff c4 00 1d 00 00 01 04 03 01 01 00 00 00 00 |................|

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

要将其视为图像,我将使用NetPBM 实用程序或者可能图像魔术师将其转换为图像查看器可以理解的形式

如果上述方法不起作用,我会研究写一个小的Perl 脚本


脚注:

† 在某些较旧的 Unix 系统上,此命令可能可用hdod没有hexdump可用命令。请参阅unix.stackexchange.com.od是 POSIX 并且od -Ax -tx1z filename可在一些流行的 Linux 发行版中运行。

答案3

好的,gnuplot 可以做到。

http://gnuplot.sourceforge.net/demo_4.4/image.html

答案4

原始二进制数据可以轻松转换为二进制pgm格式通过添加标题:

echo "P5
200 100
255
"$(cat dat001.bin) > dat001.pgm

相关内容