AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1587740
Accepted
Giacomo1968
Giacomo1968
Asked: 2020-09-23 17:03:53 +0800 CST2020-09-23 17:03:53 +0800 CST 2020-09-23 17:03:53 +0800 CST

如何使用 libheif 1.8.0 将具有奇数尺寸的图像转换为 ImageMagick 7 中的 HEIC 图像?

  • 772

简短版: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 conversion
  • 1 1 个回答
  • 437 Views

1 个回答

  • Voted
  1. Best Answer
    Giacomo1968
    2020-09-23T17:16:32+08:002020-09-23T17:16:32+08:00

    让 ImageMagick 在转换过程中将奇数维度“四舍五入”到下一个偶数值。

    不能依赖 Apple 更新/修补 macOS 的 API 来处理这些clap图像,所以我现在的解决方案是使用 ImageMagick 本身将奇数维度“四舍五入”到下一个偶数像素维度,然后将该图像转换为HEIC。

    解决方案来自这个 StackOverflow 答案,它使用 ImageMagick 的-extent选项和嵌套调用来检查图像大小,-format如下所示:

    convert source.jpg -background white -extent  $(convert source.jpg -format '%[fx:2*int((w+1)/2)]x%[fx:2*int((h+1)/2)]!' info:) destination.heic
    

    嵌套convert调用将根据 Wikimedia 上的测试图像输出如下内容,该测试图像具有 3111 宽度 x 3333 高度:

    3112x3334!
    

    是的,它在宽度和高度上增加了一个像素,但出于许多目的,这可以忽略不计。这是一种有效的解决方法,尤其是对于高分辨率图像。

    这是我现在用来处理这些批量转换的完整 Bash 脚本:

    find -E 'Desktop/Pics' -type f -iregex '.*\.(JPG|JPEG|PNG|TIF|TIFF)$' |\
      while read FULL_IMAGE_PATH
      do
        PATH_SANS_EXTENSION="${FULL_IMAGE_PATH%.*}"
        convert "${FULL_IMAGE_PATH}" -background white -extent  $(convert "${FULL_IMAGE_PATH}" -format '%[fx:2*int((w+1)/2)]x%[fx:2*int((h+1)/2)]!' info:) "${PATH_SANS_EXTENSION}".heic
        exiftool -overwrite_original_in_place -tagsFromFile "${FULL_IMAGE_PATH}" "${PATH_SANS_EXTENSION}".heic
      done
    

    libheif 1.9.0 现在有一个新的内置选项,可以将奇数尺寸缩小一个像素,以使图像尺寸成为偶数。

    根据对 libheif 问题线程的评论,libheif 1.9.0 版现在有一个-E/--even-size选项来解决这个问题。

    在将我的本地 Homebrew 安装的 libheif 更新到版本后,我能够对此进行测试。-E当我在没有选项的情况下运行这个基本命令时:

    heif-enc source.jpeg -o destination.heic
    

    我看到了这个有用的警告:

    警告: macOS 上的许多程序无法显示具有奇数宽度或高度的 HEIF 图像(测试到 Catalina 10.15.6)。在 macOS 修复或我们有解决方法之前,建议使用选项 -E 使图像大小为偶数。

    生成的图像就像以前一样;在 macOS 中有效但无法打开。

    -E但是,如果我使用这样的选项运行相同的命令:

    heif-enc -E source.jpeg -o destination.heic
    

    在destination.heicmacOS 中有效且可打开!

    知道我可以调整我自己的 Bash 脚本——使用 ImageMagick——heif-inc直接像这样使用:

    find -E 'Desktop/Pics' -type f -iregex '.*\.(JPG|JPEG|PNG|TIF|TIFF)$' |\
      while read FULL_IMAGE_PATH
      do
        PATH_SANS_EXTENSION="${FULL_IMAGE_PATH%.*}"
        heif-enc -E "${FULL_IMAGE_PATH}" -o "${PATH_SANS_EXTENSION}".heic
        exiftool -overwrite_original_in_place -tagsFromFile "${FULL_IMAGE_PATH}" "${PATH_SANS_EXTENSION}".heic
      done
    

    只需注意该-E选项将图像缩小一个像素以使尺寸均匀,而使用该-extent/-format组合的 ImageMagick 命令会添加一个额外的像素以使尺寸均匀。对某些人来说可能意义不大,但只是在选择使用哪种方法时要记住的一些事情。

    • 2

相关问题

  • 将图像嵌入或合成到大图像的角落,GraphicsMagic 或 ImageMagick

  • 为什么专为文件管理设计的实用程序会不按字母顺序工作?

  • 如何批量处理图片进行垂直拆分和重组?

  • 无法将 TTL 转 USB 转换器连接到手机

  • 将 xargs 与 pdftk 一起使用

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve