imagemagick将png 16位转换为raw

mil*_*luz 6 png imagemagick

我正在尝试将16位灰度PNG转换为原始文件.图像尺寸为640*480.

首先,确定:

$ identify image.png 
image.png PNG 640x480 640x480+0+0 16-bit PseudoClass 65536c 299KB 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)

我期待结果文件的大小为640*480*2字节.

尝试1:

$ convert image.png -depth 16 image.raw
Run Code Online (Sandbox Code Playgroud)

这给出了330805字节的文件大小.它的前16个字节看起来像:

0x00000000: 89504E47 0D0A1A0A 0000000D 49484452     .PNG........IHDR
Run Code Online (Sandbox Code Playgroud)

尝试2:

$ convert image.png -depth 16 image.rgb
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

Mar*_*ell 11

更新的答案

我回答你之后想到,有一种更简单的方法可以做你想要的,利用ImageMagick很少使用的stream工具来传输原始像素数据.

实际上,您可以使用此命令

stream -map r -storage-type short image.png image.raw
Run Code Online (Sandbox Code Playgroud)

它将读取红色通道(-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>
Run Code Online (Sandbox Code Playgroud)

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

您可以像这样剥离标题:

convert image.png -depth 16 pgm:- | tail -c 614400 > file.raw
Run Code Online (Sandbox Code Playgroud)

如果你要转换大量不同大小的文件并且不喜欢硬编码614400,并且正在使用bash,你可以让ImageMagick告诉你大小(高度*宽度*2字节/像素)并使用如下:

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


Cir*_*四事件 5

gray 可能是您想要的格式:

convert image.png -depth 16 image.gray
Run Code Online (Sandbox Code Playgroud)

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

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

在此处输入图片说明

.raw并不是真正的“仅像素”格式:它确实包含一些元数据:https : //en.wikipedia.org/wiki/Raw_image_format#File_contents