ImageMagick将16位PNG转换为RAW

11
我正在尝试将一张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字节。
$ 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。
有什么想法吗?

那第二个选项有什么问题吗?在我看来,它看起来是正确的。 - Mark Setchell
1
@MarkSetchell,我想要一个单通道,16位的。第二次尝试输出3个通道(RGB)16位。 - miluz
请提供一张样本图片,以便更容易地复制。 - Ciro Santilli OurBigBook.com
2个回答

19

更新的答案

在回答您之后,我想到了一种更简单的方法来实现您想要的功能,利用ImageMagick很少使用的stream工具,流式传输原始像素数据。

实际上,您可以使用以下命令:

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

这段文字是关于it技术的内容,它将读取红色通道(-map r),如果您的图像是灰度图像,则与绿色和蓝色通道相同,并将其以无符号16位shorts(-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格式的详细信息可以在这里找到,但简单来说,它包括一个带有P和一个数字的头部描述实际子类型,然后是宽度和高度,最后是MAX VALUE,描述像素强度的范围。在您的情况下,MAX VALUE为65535,而不是255,因为您的数据是16位的。
您可以像这样剥离标题:
convert image.png -depth 16 pgm:- | tail -c 614400 > file.raw

如果您需要转换多个不同大小的文件,而且不喜欢硬编码的 614400,并且使用的是 bash,您可以让 ImageMagick 告诉您文件大小(高度 * 宽度 * 2 字节/像素),并像这样使用:

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

嗨,我正在使用Kubuntu 16.4,并且遇到了以下错误:root@luis:/home/luis/Descargas# rpm -Uvh ImageMagick-7.0.2-9.x86_64.rpm rpm:但是假设您知道自己在做什么... 错误:依赖项未满足: ImageMagick-libs = 7.0.2-9需要ImageMagick-7.0.2-9.x86 (....) libpthread.so.0()(64bit)需要ImageMagick-7.0.2-9.x86_64 libz.so.1()(64bit)需要ImageMagick-7.0.2-9.x86_64 - Fernando Pie

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接