我正在尝试将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。
有什么想法吗?
答案 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