【问题标题】:Imagemagick unexpected end of file sporadicallyImagemagick偶尔意外结束文件
【发布时间】:2025-11-21 18:00:02
【问题描述】:

我正在尝试在脚本中使用 Imagemagick 来研究文件熵可视化。

我有以下 bash 脚本:

convert -size 2896x2896 mono:$1 -crop 100x100+0+0 -scale 300x300 data-mono-$1.png
convert -size 1024x1024 -depth 8 gray:$1 -scale 300x300 data-gray-$1.png

我并不完全精通 imagemagick,因为我在网上找到了这个脚本,它在某些文件上对我有用。

我的问题是它大约 70% 的时间都有效。

我会将我的 /var/log/syslog 文件作为原始数据输入(文件的副本),有时它有效,有时则无效。我猜这与文件的长度以及我输入的大小(可能是深度)有关。

当它根本不起作用时我得到的确切错误是:

convert-im6.q16: unexpected end-of-file `exampleData.raw': No such file or directory @ error/gray.c/ReadGRAYImage/237.
convert-im6.q16: no images defined `data-gray-exampleData.raw.png' @ error/convert.c/ConvertImageCommand/3258.

有时单声道行,有时两者都行,但灰行很少见。

【问题讨论】:

  • 检查 /tmp 目录中是否有足够的空间。删除所有大文件,尤其是名称中与 ImageMagick 相关的文件。
  • /tmp 中似乎没有问题。很空旷。
  • 每个文件是否不一致?
  • 你的IM版本和平台是什么?您的输入和输出是什么类型的文件?检查这些文件格式的相关代表的版本,并在可能的情况下进行更新以及更新 IM。
  • Ubuntu 20.04,ImageMagick 6.9.10-23 Q16

标签: bash imagemagick imagemagick-convert entropy


【解决方案1】:

我看到你可以做两件事来减轻痛苦:

  • 引用您的 shell 变量以避免文件名带有空格的问题
  • 计算您的预期文件大小

所以,首先是引用。如果$1中的文件名是"sample data",则如下命令:

convert -size 2896x2896 mono:$1 data-mono-$1.png

会变成:

convert -size 2896x2896 mono:sample data data-mono-sample data.png

这将使 ImageMagick 查找一个名为 "sample" 的单声道文件,但它不会找到它和一个名为 data 的命令参数,它也不知道,因此会导致错误.简而言之,您应该始终对 shell 变量进行双引号。所以尝试使用:

convert -size 2896x2896 "mono:$1" -crop 100x100+0+0 -scale 300x300 "data-mono-$1.png"
convert -size 1024x1024 -depth 8 "gray:$1" -scale 300x300 "data-gray-$1.png"

关于第二个攻击计划,您提到的错误意味着文件中的数据不足,而 ImageMagick 所期望的。因此,您可以预先计算预期大小并与实际大小进行比较,或者不运行 ImageMagick 或将文件放在一侧进行检查。因此,在更简单的第二种情况下,如果您的图像是 1024px 宽 x 1024px 高和 8 位/像素灰度,您可以这样做:

# width and height
W=1024
H=1024
# expected and actual size, in bytes
exp=$((W*H))
act=$(wc -c < "$1")

if [ $exp -ne $act ] ; then
   report error and save offending file
else
   convert -size ${W}x${H} -depth 8 "gray:$1" -scale 300x300 "data-gray-$1.png"
fi

对于单声道文件,您需要四舍五入到最接近的整数字节数:

# width and height
W=2896
H=2896
# expected and actual size, in bytes
exp=$(( (W*H+7)/8 ))
act=$(wc -c < "$1")

if [ $exp -ne $act ] ; then
   report error and save offending file
else
   convert -size ${W}x${H} "mono:$1" -crop 100x100+0+0 -scale 300x300 "data-mono-$1.png"
fi

【讨论】:

  • 感谢您的回答。我认为我的一些困惑源于这样一个事实,即无论文件大小如何,单声道转换都可以工作。而灰色似乎大部分时间都失败了(它以前工作过,但我无法复制最近成功了)。就好像文件的大小与这些命令无关。我仍然没有解决这个问题,因为上面的代码将导致$exp$act 仅在极少数情况下相同。我不确定它们是否应该是相同的。
【解决方案2】:

如果原始输入文件(MONOGRAYformat)与输入大小不匹配(例如 -size 1024x1024),则会出现此问题。例如,GRAY 格式的输入文件应该有 1024x1024=1048576 字节,假设深度为 8 位。

如果您不想使用整个文件来可视化熵,可以使用head -c 1048576 bigfile &gt; f.gray 修剪文件。另一种选择是将文件传递给标准输入,这不会触发意外的文件结束错误。您可以通过将文件名替换为-(例如cat bigfile | convert -size 1024x1024 -depth 8 gray:-)来实现此目的。

【讨论】: