imagemagick 将 png 16 位转换为原始格式

imagemagick convert png 16 bit to raw

我正在尝试将 16 位灰度 PNG 转换为原始文件。图片大小为640*480.

首先,确定:

$ identify image.png 
image.png PNG 640x480 640x480+0+0 16-bit PseudoClass 65536c 299KB 0.000u 0:00.000

我希望结果文件的大小为 640*480*2 字节。

尝试 1:

$ convert image.png -depth 16 image.raw

这给出了 330805 字节的文件大小。它的前 16 个字节如下所示:

0x00000000: 89504E47 0D0A1A0A 0000000D 49484452     .PNG........IHDR

尝试 2:

$ convert image.png -depth 16 image.rgb

这给出了 1843200 字节的文件大小,即 640*480*2*3。

我 运行 imagemagick 版本 6.7.7-10 Ubuntu 14.04.

有什么想法吗?

更新答案

在回答您之后我想到,有一种更简单的方法可以做您想做的事情,它利用 ImageMagick 的 little-used stream 工具来流式传输原始像素数据。

实际上,你可以使用这个命令

stream -map r -storage-type short image.png image.raw

这将读取红色通道 (-map r),如果您的图像是灰度,它与绿色和蓝色通道相同,并将其写为无符号 16 位短裤 (-storage-type short) 到输出文件 image.raw

这比我原来的答案更清晰 - 虽然应该给出相同的结果。

原答案

如果您编写 RGB 原始文件,您将获得 3 个通道 - R、G 和 B。尝试像这样编写 PGM(便携式灰度图)...

convert image.png -depth 16 pgm:-
P5
640 480
65535
<binary data> < binary data>

PGM 格式详细 here,但只要说有 header 和 P 后跟描述实际子类型的数字,然后是宽度和高度以及然后是描述像素强度范围的 MAX VALUE。在您的情况下,MAX VALUE 是 65535 而不是 255,因为您的数据是 16 位的。

您可以像这样剥离 header:

convert image.png -depth 16 pgm:- | tail -c 614400 > file.raw

如果您正在转换大量不同大小的文件并且不喜欢 hard-coded 614400,并且正在使用 bash,您可以让 ImageMagick 告诉您大小(高度 * width * 2 bytes/pixel) 并像这样使用它:

bytes=$(identify -format "%[fx:h*w*2]" image.png)
convert image.png -depth 16 pgm:- | tail -c $bytes > file.raw

gray 可能是您想要的格式:

convert image.png -depth 16 image.gray

此命令将每个像素存储在 2 个字节中,文件中没有其他内容。

这里我提供一个最小的合成例子:https://superuser.com/questions/294270/how-to-view-raw-binary-data-as-an-image-with-given-width-and-height/978432#978432

.raw 并不是真正的 "pixel only" 格式:它确实包含一些元数据:https://en.wikipedia.org/wiki/Raw_image_format#File_contents