imagemagick将png 16位转换为raw

时间:2015-03-18 11:25:11

标签: imagemagick png

我正在尝试将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.

我在Ubuntu 14.04上运行imagemagick版本6.7.7-10。

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

更新了答案

我回答你之后发现,有一种更简单的方法可以做你想做的事情,利用ImageMagick很少使用的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(Portable Greymap),就像这样......

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

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

您可以像这样剥去标题:

MAX VALUE

如果要转换大量不同大小的文件并且不喜欢硬编码convert image.png -depth 16 pgm:- | tail -c 614400 > file.raw ,并且正在使用614400,则可以让ImageMagick告诉您大小(高度*宽度* 2字节) / pixel)并使用如下:

bash

答案 1 :(得分:4)

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实际上不仅仅是像素&#34;格式:它确实包含一些元数据:https://en.wikipedia.org/wiki/Raw_image_format#File_contents