更好的写脚本方式

毕业季和同学去拍了一些照片,后面共享回来的照片,格式是 HEIC 格式的,在电脑上可以直接打开,但是 iCloud 相册里面上传照片只支持 jpg 格式,哪怕这些照片就是用 iPhone 拍的,也不能直接上传,没有办法,只能够手动转一次照片格式。 网上也有很多 HEIC 转 JPG 格式的工具网站,但是都只能够一张张上传,然后一张张下载,这对于需要处理较大量照片的情况显然并不是一个好的解决方案。于是自然打算写个脚本,进行转换。

当然现在有了 ChatGPT,写脚本都不用亲历亲为了,直接把问题抛给它,我们只需要做代码的搬运工。

看起来很不错,复制到本地,替换一下路径一跑,发现脚本并不能正常运行,原因是使用的 Pillow 库其实不支持 HEIC 格式的图片。继续把问题交给它,它又给我推了一个 pyheif 库来处理,然而这个库需要 MSVC 相关工具链来编译安装,在我的电脑安装总是失败,后面尝试了几个它推荐的依赖库,都安装不了,寄!被 Python 的跨平台安装构建的低移植性狠狠教训,而为了写个脚本专门去配个环境或者容器又太夸张了。

于是使用最近在学的 F#来代替,继续把问题交给 ChatGPT,来回复制粘贴代码运行尝试几次后,顺利完成任务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#r "nuget:Magick.NET-Q16-AnyCPU"

open System.IO
open ImageMagick

let convertHEICtoJPG (inputPath: string) (outputPath: string) =
    let image = new MagickImage(inputPath)
    image.Format <- MagickFormat.Jpg
    image.Write(outputPath)

// 获取当前目录下的所有 HEIC 文件
let heicFiles = Directory.GetFiles(@"/path/to/you", "*.heic")

// 遍历每个 HEIC 文件,并进行转换
for heicFile in heicFiles do
    let jpgFile = Path.ChangeExtension(heicFile, ".jpg")
    convertHEICtoJPG heicFile jpgFile
    printfn "转换完成:%s -> %s" heicFile jpgFile

对比于 Python,使用 F#来写脚本其实也足够简单和方便,可以单个 fsx 文件来写,也可以直接把写好的代码复制到 fsi 交互命令行里逐段代码执行,方便得很。尤其是对于有外部依赖库的脚本代码,使用 F# 或者 C# 的脚本,这样一行代码引用依赖库,可比在命令行中全局安装一个依赖好用得多。(起码不会有安装失败的问题)