Published on

批量将 HEIC 转换成 JPEG

Authors
  • avatar
    作者
    老麦

起因

头很痛,自从身边的朋友知道我会搞网站、耍电脑后,动不动就给我打个电话来请教各种各样的问题。我心想其实我也只是略知一二而已,只不过平时喜欢折腾罢了。

这次朋友又向我请教关于批量将 HEIC 格式的照片转换成常用的 JPEG 格式,原本我想直接跟他说我没接触过,不太懂这样子的。但是因为我前阵子将在用的 REDMI K50 拍照保存格式换成了 HEIC,所以我也想借此机会来研究一下。跟朋友说我先上网查一下相关资料再回复他,结果就有了这篇记录。

介绍

HEIC(High Efficiency Image Format)或者 HEIF(High Efficiency Image File Format)是一种现代的图像文件格式,被广泛用于存储照片和图像。这种格式在现代手机中变得流行的原因有以下几个优势:

  1. 更高的压缩效率:相比传统的 JPEG 格式,HEIC/HEIF 可以以更小的文件大小存储相同质量的图像。它使用先进的压缩算法,如 HEVC(High Efficiency Video Coding),以更高的压缩比实现更小的文件尺寸。这对于手机摄影来说非常重要,因为它能够节省存储空间,让您能够存储更多的照片。
  2. 支持更多颜色深度和高动态范围(HDR):HEIC/HEIF 格式支持16位色深,相比 JPEG 的8位色深,能够提供更精细和更准确的颜色表示。此外,它还支持 HDR 图像,使得在处理具有高对比度的场景时能够保留更多的细节和动态范围。
  3. 多图层支持:HEIC/HEIF 格式还支持多图层,可以在同一个文件中存储多个图像版本、缩略图、深度图、视频等附加信息。这使得 HEIC/HEIF 能够更好地支持图像编辑、动态效果和附加元数据的存储。
  4. 更好的图像质量:由于 HEIC/HEIF 使用先进的压缩算法,它能够在较小的文件尺寸下维持较高的图像质量。相比 JPEG,在同样文件大小下,HEIC/HEIF 格式通常能够提供更清晰、更准确、更少失真的图像。

需要注意的是,虽然 HEIC/HEIF 格式有很多优势,但它也存在一些限制。例如,不是所有设备和操作系统都原生支持这种格式,可能需要进行转换或使用特定的软件才能查看和处理 HEIC/HEIF 文件。因此,在与其他人共享照片时,可能需要将其转换为更广泛支持的格式,如 JPEG。

HEIC 和 JPEG 的占用空间对比

截屏2023-08-05 13.43.40.png

其中 IMG_20230801_232901.jpg 转换后得到的文件,对比之下可以看到,JPEG 格式占用的空间是 7 M,HEIC 格式只占用 2 M 不到,正所谓有对比就有伤害,希望新的格式可以尽快普及开,这样子间接也缓解一下大家手机上的空间容量焦虑。

ImageMagick

官网: https://imagemagick.org

ImageMagick 是一个免费的开源软件套件,用于编辑和处理数字图像。它可用于创建、编辑、合成或转换位图图像,并支持多种文件格式,包括 JPEG、PNG、GIF、TIFF 和 PDF。

该软件的详细使用指令可自行查阅官方文档:ImageMagick – Command-line Tools: Magick

Windows

官网直接下载安装;

下载地址: https://imagemagick.org/script/download.php#windows

选择第一项下载即可,建议选择 16 位的,这样就会支持高动态范围成像。

通过 winget 命令来安装;

winget install --id ImageMagick.ImageMagick

我现在在 Windows 上已经习惯了使用 winget 这个工具来管理电脑上的软件,实在是太好用了,有 Homebrew 那味了。

创建批量转换脚本;

新建一个以 .bat 后缀结尾的文件,如:heic.bat,复制以下内容到新建文件里。

@echo off
setlocal enabledelayedexpansion

for %%F in (*.HEIC *.heic) do (
    magick "%%F" -quality 100%% "%%~nF.jpg"
)

endlocal

以后哪个文件夹里的图片需要进行转换就可以复制脚本文件到该文件夹里,然后双击打开即可。

macOS

使用 Homebrew 安装;

brew install imagemagick

个人安装时附带安装了很多个依赖,其中包括官网提及的 ghostscript,详情可查阅官方说明。

个人在 Homebrew 上安装时附带安装了以下依赖:

==> Fetching dependencies for imagemagick: freetype, fontconfig, jbig2dec, jpeg-turbo, libidn, openjpeg, ghostscript, highway, openexr, libde265, pcre2, glib, shared-mime-info, x265, libheif, liblqr, jasper, libomp, libraw, m4 and libtool

其他安装方法;

可查阅:https://imagemagick.org/script/download.php#macosx

Linux

直接下载二进制版本;

这里建议直接下载官方提供的便携版本,在用户目录下新建一个文件夹用来保存该二进制文件,如:

# 返回用户目录
cd

# 新建一个 ImageMagick 目录并进入该目录
mkdir ImageMagick && cd ImageMageick

# 下载二进制版本
wget https://imagemagick.org/archive/binaries/magick

国外服务器,最好使用魔法,要不然下载速度会很慢。也可以访问官方提供的镜像进行下载,镜像列表: https://imagemagick.org/script/mirror.php

下载完成后我们就可以使用绝对路径来打开了,如:

~/imagemagick/magick --version

Version: ImageMagick 7.1.1-15 Q16-HDRI x86_64 98eceff6a:20230729 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5)
Delegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (7.5)

请注意,如果 ~/imagemagick/magick 是一个可执行文件,还需要确保其具有执行权限。可以使用 chmod 命令赋予该文件执行权限:

chmod +x ~/imagemagick/magick

这时我们可以在终端里使用 export 命令将二进制程序添加到 $PATH 变量中,如:

export PATH="$PATH:~/imagemagick"

但这只是临时设置,关闭终端后就会失效。因此我们可以直接在终端的配置文件里添加该行,这样我们每次启动终端时都会进行加载,以 bash 为例,在终端上运行以下命令:

echo 'export PATH="$PATH:~/imagemagick"' >> ~/.bashrc
source ~/.bashrc

这将在 ~/.bashrc 文件的末尾添加该导出命令,并使用 source 命令使其立即生效。这样我们就可以直接使用 magick 这个命令进行操作了。

magick --version

在 Debian 系的 Linux 上使用 apt 来安装(不建议);

我在最新的 Debian12 上使用 apt 来安装时发现只能安装 ImageMagick@6 这个版本,不可以直接安装最新的 ImageMagick@7 版本。

apt install imagemagick

ImageMagick@6 这个版本的命令为 convert,最新版的才是 magick

convert --version

Version: ImageMagick 6.9.11-60 Q16 x86_64 2021-01-25 https://imagemagick.org
Copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP(4.5)
Delegates (built-in): bzlib djvu fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png tiff webp wmf x xml zlib

在 macOS 和 Linux 上批量转换

在 Windows 上我们选择了创建一个脚本来进行批量转换,在 macOS 和 Linux 上我们直接绑定一个快捷指令即可。

alias magickheic='shopt -s nocaseglob; for f in *.HEIC *.heic; do magick "$f" -quality 100% "${f%.*}.jpg"; done; shopt -u nocaseglob'

这里使用了 shopt -s nocaseglob 来开启不区分大小写的文件名匹配,并在循环内部将文件的扩展名更改为 .jpg。最后使用 shopt -u nocaseglob 来关闭不区分大小写的匹配。

运行这个新指令时,它应该能够成功处理目录中的所有 .HEIC.heic 文件,无论其大小写形式是否一致。

最后

其实就我个人而言,需要使用到批量转换的场景真的不多。平时我都不喜欢拍照的人,偶尔用手机拍个照片真的要转换格式我之前都是选择使用微信等传送工具进行格式转换,虽然明知道这样子效率很低,但就我个人的使用场景来说,这已经足够我应付使用了。

这次碰巧朋友问起,我也研究一下,间接提高一下自己的知识储备。

最后的最后,依然还是这一句,折腾得快乐,快乐地折腾。