ImageMagick:猜测原始图像高度

ImageMagick: guess raw image height

我正在使用 ImageMagick 的 convert 实用程序将原始图像字节转换为可用的图像格式,例如 PNG。我的原始文件是代码生成的,所以没有任何headers,只是纯像素。

为了转换我的图像,我正在使用命令:

$ convert -depth 1 -size 576x391 -identify gray:image.raw image.png
gray:image.raw=>image.raw GRAY 576x391 576x391+0+0 1-bit Gray 28152B 0.010u 0:00.009

宽度是固定的,我很熟悉。但是我每次都必须根据文件大小来评估图像的高度,这很烦人。

没有指定高度或者如果指定了错误的高度,实用程序会出现:

$ convert -depth 1 -size 576 -identify gray:image.raw image.png
convert-im6.q16: must specify image size `image.raw' @ error/gray.c/ReadGRAYImage/143.
convert-im6.q16: no images defined `image.png' @ error/convert.c/ConvertImageCommand/3258.
$ convert -depth 1 -size 576x390 -identify gray:iphone.raw iphone.png
convert-im6.q16: unexpected end-of-file `image.raw': No such file or directory @ error/gray.c/ReadGRAYImage/237.
convert-im6.q16: no images defined `image.png' @ error/convert.c/ConvertImageCommand/3258.

所以我想知道有没有办法根据file/blob尺寸自动检测图像高度?

您必须知道 -depth 和 width 才能计算 ImageMagick 原始格式的高度。如果深度为 1,则您的图像是二进制的 (b/w)。所以高度 = 8 * 文件大小(在 B 中)/(宽度)。 28152*8/391 = 576

几个想法...

您可能不知道 NetPBM 格式,但它非常简单,您可以更改创建原始图像的软件,使其直接生成 PBM 格式图像OpenCVPhotoshopGIMPfeh[= 可读和可用当然是 51=]、eogImageMagick。它不需要任何库或软件中的额外依赖项,您需要做的就是在前面放置一个文本 PBM header,因此您的文件如下所示:

P4
576 391
... YOUR EXISTING BINARY DATA ...

不要忘记在 P4391 之后添加换行符(即换行符)。

您可以自己尝试,像这样将 header 添加到您的一个文件中,然后使用 GIMP 或其他工具查看它:

printf "P4\n576 391\n"    >  image.pbm
cat image.raw             >> image.pbm

如果您更喜欢 one-liner,只需像这样使用 bash command grouping - 相当于上面的两行:

{ printf "P4\n576 391\n"; cat image.raw; } > image.pbm

注意所有的空格和 semi-colons 和我的一模一样!


另一个想法,只是在 Fred 的回答上加点肉,可能是下面的 one-liner,它使用 bash arithmetic context and a bash command substitution,你可以这样做:

convert -depth 1 -size "576x$(($(stat -c "%s" image.raw)*8/576))" gray:image.raw image.png

请注意,如果您使用的是 macOSstat 会略有不同,因此您可能更喜欢效率稍低但更便携的版本:

convert -depth 1 -size "576x$(($(wc -c < image.raw)*8/576))" gray:image.raw image.png