imagemagick转换png 16位为原始

标签 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。

有任何想法吗?

最佳答案

更新了答案

自从回答您以来,我想到有一种更简单的方法来执行您想要的操作,该方法利用了ImageMagick很少使用的stream工具来传输原始像素数据。

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

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

如果图像是灰度的,它将读取红色 channel (-map r),与绿色 channel 和蓝色 channel 相同,并将其作为无符号16位短裤(-storage-type short)写到输出文件image.raw中。

这比我的原始答案更干净-尽管应该给出相同的结果。

原始答案

如果编写RGB原始文件,则将获得3个 channel -R,G和B。尝试像这样编写PGM(便携式灰度图)...
convert image.png -depth 16 pgm:-
P5
640 480
65535
<binary data> < binary data>

PGM格式是here的详细信息,但足以说明头文件带有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

关于imagemagick转换png 16位为原始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29120768/

相关文章:

bash - 设置特定图像亮度

imagemagick - 如何使用 imagemagick 旋转文本?

php - 复合透明图像上的 Imagick 运动模糊

jupyter 中的 r 图形 - 无法启动 png() 设备

r - 如何使用 R 创建和保存 1x1 像素透明 png?

image - 使用ImageMagick重复或“平铺”图像

PHP如何在php中使用ImageMagick转换

delphi - 将 PNG 加载到 TImage

wordpress - Css 不透明度应用于 .png 的一部分

c++ - 使用 C++ (VS 2010) FAST 将 BMP 保存为 PNG