imagemagick将png 16位转换为原始

imagemagick将png 16位转换为原始,imagemagick,png,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 这将提供33085字节的文件大小。它的前16个字节如下所示: 0x0

我正在尝试将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
这将提供33085字节的文件大小。它的前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


有什么想法吗?

更新答案

在回答您的问题后,我突然想到,有一种更简单的方法可以做您想做的事情,它利用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(可移植灰度图)

convert image.png -depth 16 pgm:-
P5
640 480
65535
<binary data> < binary data>
如果您正在转换大量不同大小的文件,并且不喜欢硬编码的
614400
,并且正在使用
bash
,您可以使用ImageMagick来告诉您大小(高度*宽度*2字节/像素),并像这样使用:

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

灰色
可能是您想要的格式:

convert image.png -depth 16 image.gray
此命令以2字节的形式存储每个像素,在文件中不存储任何其他内容

在这里,我提供了一个简单的合成示例:


.raw
并不是真正的“仅像素”格式:它确实包含一些元数据:

所以第二个选项有什么问题,我觉得它是正确的。@MarkSetchell,我想要一个单通道,16位。第二次尝试输出3个通道(RGB)16位。请给我们一个样本图像,以便更容易复制。您好,我使用的是Kubuntu 16.4,a获取此错误: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()(64位)需要ImageMagick-7.0.2-9.x8664libz.so.1()(64位)需要ImageMa