跳到主要内容
PulsarKit

把整个文件夹的iPhone HEIC照片批量转成JPG

把一整个文件夹的iPhone照片转成JPG听起来很简单,直到其中几张转回来时方向不对,而且看不出任何原因。

作者:PulsarKit · ·

左边是同一个文件夹里的八张HEIC缩略图,其中两张横躺着,上下有黑边;右边是转成JPG的同样八张照片,全都是正的

为什么有的照片转出来是横的,有的不是

HEIC文件可以在两个不同的地方记录照片哪边朝上,而这两处并不总是一致。新款iPhone直接把旋转属性写进文件的容器,所以正确的解码器不用另做任何处理,交出的照片就是正的。旧款手机(比如iPhone 7)不在容器里写任何东西,只在较老的EXIF Orientation标签里记录旋转。只读容器的解码器会得到一张横躺的画面,而只读EXIF标签的解码器,可能把一张本来就是正的新照片再转一次。

所以,从一部旧手机和一部新手机同步过来的一百张照片,经过转换器之后,可能有的正、有的横,看起来毫无规律。转换器是在用同一条规则处理并不遵循同一条规则的文件。正确的转换,也就是HEIC转JPG的做法,是先检查容器,只有容器里没有信息时才退而使用EXIF标签,然后把校正直接写进像素,这样后续任何环节都不会再把文件转第三次。

哪些信息应该跟着照片走,哪些由你决定

转换出的JPG可以带上原HEIC里同样的拍摄日期、相机型号、镜头和曝光参数,并按相机本来的写法重新写成一个标准的EXIF块。GPS坐标和其余这些数据是分开的开关;已经是JPG的照片,之后也可以用去除照片EXIF信息把坐标删掉。这一点很重要,因为大多数人在把一批照片发到公开的地方之前,想要的正是保留日期、去掉位置。原文件里嵌入的缩略图无论如何都值得丢掉。它显示的是照片原始的、未经校正的朝向,把一张过时的预览带进转换后的文件,等于让同样的旋转混乱从侧门溜回来。

扩展名是.heic,内容却不完全是HEIC

有些相机和聊天应用把AV1压缩的视频帧或图像存进容器,结果仍按惯例用.heic扩展名命名。靠读取文件本身的字节来判断格式,而不是相信文件名,就能识别出这种情况。这样的文件会被识别为AVIF,用正确的编码格式解码,而不是失败或生成一张损坏的图片。容器和这两种格式都对不上的文件,比如被误改了名字的视频片段,与其一声不吭地变成一堆乱码,不如给出明确提示后拒绝。

实况照片转换后得到的是静态画面

实况照片的.heic文件只是这一对文件里静态的那一半。动态部分在旁边一个单独的.mov文件里,大多数转换器根本不会碰它。单独转换.heic文件,得到的是作为容器主图像保存的静态画面:一张完整分辨率的真正照片,而不是从缩略图里取出的低分辨率占位图。如果动态部分也很重要,那个.mov文件就需要单独处理,因为转换.heic文件并不会把它一起带上。

一次处理整个相册

对一个有五十或一百张照片的文件夹来说,关键在于一个坏文件不应该拦住其余的文件。损坏的HEIC、改了名的视频,或者容器不寻常的照片,都应该带着明确的原因被跳过,而不是让整批处理半途中止。在这里,质量设置没有人们想的那么重要。满分100时取90左右,看起来和原HEIC几乎一样,文件大小的差别也比多数人能察觉到的小,所以整个文件夹都可以放心沿用这个默认值,不必一张张去调。截图和图形是例外:这些应该用HEIC转PNG,它保留每一个像素,而不是重新压缩。

直接在手机上转换,以及两个要避开的错误

转换不需要电脑。在iPhone的Safari里打开HEIC转JPG,从相册里选择照片,处理就在手机的浏览器里运行:解码器是一个大约1 MB的文件,只下载一次并缓存起来,除此之外没有任何东西经过网络。Safari经常把HEIC的文件类型报告为空,所以选择器也会按.heic、.heif和.hif扩展名来识别。一批最多50张照片,每张最多100 MB,总共最多500 MB;进度条按已完成的文件计数,失败的文件会被跳过并附上说明,不会取消其余的文件。多张照片打包成一个ZIP返回,单张照片则是普通的.jpg。有两个错误值得了解。第一个是想在转换之前去掉位置信息:HEIC文件里的元数据和容器交织在一起,所以要先转换(如果照片要发到公开的地方,就关掉GPS开关),之后如果还有别的信息要去掉,再对JPG运行去除照片EXIF信息。第二个是因为PNG听起来格式更好就选它。PNG是无损的,所以一张2 MB的HEIC经常会变成20 MB的PNG,只有照片还要继续编辑时才划算;用于分享、邮件和上传表单时,默认质量90的JPG看起来一样,大小只有大约十分之一。

本文用到的工具

继续阅读