简短版:HEIC 图像需要具有偶数尺寸。在 Homebrew 安装的以前版本的 ImageMagick 中,libheif 1.7.0 使用 kludge 将图像尺寸四舍五入到偶数值,以允许转换具有奇数尺寸的图像。
现在,libheif 1.8.0 已经抛弃了这种混乱,并在这种情况下生成图像,尽管它们是有效的 HEIC 文件,但 macOS 似乎无法打开。
虽然 Apple 解决了解决此问题所需要做的一切,但在此期间可以做些什么来允许以允许 macOS 打开它们的方式对这些图像进行干净转换?
更长的版本:自 2020 年 7 月左右以来,我一直在使用 ImageMagick 将成堆的高分辨率 JPEG 图像转换为 HEIC 格式——以节省文件空间和数据传输时间,同时保持质量——自 2020 年 7 月左右开始和关闭。我使用的是 macOS Catalina 10.5.6 (19G2021) 和 ImageMagick 已通过 Homebrew 安装和更新。
过去一个月,在转换一个装满图像的小目录时发生了一些奇怪的事情:看似任意图像会转换为 HEIC,但我无法在“预览”应用程序甚至 macOS 中的 Pixelmator 中打开它们。也没有生成预览图标。更奇怪的是,如果我把 HEIC 图像转换回 JPEG,转换就成功了。所以 HEIC 在某种程度上是有效的,但不是 macOS 的原生 API 可以处理的方式。
根据对ImageMagick repo 上的问题报告的评论,结果证明libheif(在 ImageMagick 中处理 HEIC 内容的库)最近升级到 1.8.0,并且新版本处理奇数尺寸图像的转换与版本不同libheif 1.7.0 及更早版本。对于具有奇数尺寸的图像,它会创建使用clap
(清洁光圈)裁剪变换的 HEIC 图像,而 macOS 显然不知道如何处理它。检查我一堆无法打开的图像,它们都至少有一个尺寸(宽度或高度)为奇数。
因此,虽然这显然是 macOS 以及它如何本机处理 HEIC 文件的问题,但我现在可以做些什么来恢复批量转换可以在 macOS 中查看的图像?降级到 libheif 1.7.0 似乎很混乱,而且有点倒退。
如果您想自己测试,请在 Wikimedia 上使用此测试图像尝试此命令,该测试图像具有 3111 宽 x 3333 高;只需test.jpeg
为此重命名图像:
convert test.jpg test.heic
或者尝试使用 libheif 实用程序执行相同操作,heif-enc
如下所示:
heif-enc test.jpg -o test.heic
在这两种情况下,macOS“预览”应用程序和其他应用程序都无法打开生成的test.heic
文件。但它显然可以使用 ImageMagick 从命令行转换回这样的 JPEG:
convert test.heic test.jpg
让 ImageMagick 在转换过程中将奇数维度“四舍五入”到下一个偶数值。
不能依赖 Apple 更新/修补 macOS 的 API 来处理这些
clap
图像,所以我现在的解决方案是使用 ImageMagick 本身将奇数维度“四舍五入”到下一个偶数像素维度,然后将该图像转换为HEIC。解决方案来自这个 StackOverflow 答案,它使用 ImageMagick 的
-extent
选项和嵌套调用来检查图像大小,-format
如下所示:嵌套
convert
调用将根据 Wikimedia 上的测试图像输出如下内容,该测试图像具有 3111 宽度 x 3333 高度:是的,它在宽度和高度上增加了一个像素,但出于许多目的,这可以忽略不计。这是一种有效的解决方法,尤其是对于高分辨率图像。
这是我现在用来处理这些批量转换的完整 Bash 脚本:
libheif 1.9.0 现在有一个新的内置选项,可以将奇数尺寸缩小一个像素,以使图像尺寸成为偶数。
根据对 libheif 问题线程的评论,libheif 1.9.0 版现在有一个
-E
/--even-size
选项来解决这个问题。在将我的本地 Homebrew 安装的 libheif 更新到版本后,我能够对此进行测试。
-E
当我在没有选项的情况下运行这个基本命令时:我看到了这个有用的警告:
生成的图像就像以前一样;在 macOS 中有效但无法打开。
-E
但是,如果我使用这样的选项运行相同的命令:在
destination.heic
macOS 中有效且可打开!知道我可以调整我自己的 Bash 脚本——使用 ImageMagick——
heif-inc
直接像这样使用:只需注意该
-E
选项将图像缩小一个像素以使尺寸均匀,而使用该-extent
/-format
组合的 ImageMagick 命令会添加一个额外的像素以使尺寸均匀。对某些人来说可能意义不大,但只是在选择使用哪种方法时要记住的一些事情。