# HEIC 转 JPG 转换 iPhone 照片

iPhone 拍的照片，换成什么都打得开的格式。

> 在浏览器里把 iPhone 的 HEIC 和 AVIF 照片转成 JPG。解码器跑在你自己的机器上，不上传，不注册，断网也能用，拍摄日期和相机信息可以一起带过去。 元数据复选框和预览仅适用于 HEIC，AVIF 元数据一律不保留。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/heic-to-jpg/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的照片**在浏览器里处理**，无须上传处理。

解码这一步，在你自己的浏览器里、用你自己的硬件完成。HEIC 是浏览器唯一打不开的图片格式，所以这个页面把解码器一并带上了，大约 1.4 MB，从本站发出，第一次访问之后就有缓存。别的 HEIC 转换器为什么个个要你上传？因为它们把编解码器放在服务器上，照片只能送过去。这个页面把编解码器放在了这边。页面上根本没有联网功能，另一头也没有服务器能接住照片。

- ✗ 不上传
- ✗ 不注册
- ✗ 不限大小
- ✓ 断网能用
- ✓ 开源

## HEIC 照片怎么转成 JPG

1. **选好你的 HEIC 和 AVIF 照片。** 拖到下面的方框里，或者点开自己挑，直接从手机备份、桌面文件夹里选都行。浏览器直接从你的硬盘上读，这期间没有东西发出去。列表会写明每一张是什么，里面有些什么。
2. **看看这些照片都带着什么。** 每一行写出拍摄日期、相机型号，还有这个文件里有没有 GPS 坐标，最后这项用绿色标出来，因为它才是值得留神的。这些不用解码画面，直接从容器里读，所以不花什么代价，也立刻就有。
3. **选格式，再定那些细节。** 没有特别理由就选 JPEG。转换图的本来就是到哪儿都打得开。质量滑块停在 92，这一档上照片很难跟原图区分开。那个勾选框决定日期、相机和位置要不要一起带过去。
4. **按“转换”，然后下载。** 解码器在第一次转换时到位，大约 1.4 MB，只这一次。之后每张照片都在你自己的机器上解码、写出。一个文件给你一个下载按钮，多个文件另外给你一个 zip。

## 说得更细的版本

[手机存下的那张照片，和那个什么都打不开的格式](https://abox.tools/zh/guides/convert-heic-to-jpg/): iPhone 把照片存成 HEIC，而半个互联网打不开它。这个格式是什么，为什么只有 Safari 解得了，转换要拿画质换多少，以及怎么做到不把照片交给任何人。

## 工具箱里还有

- [WebP 转 JPG](https://abox.tools/zh/webp-to-jpg/): 把网页保存的图片，变成所有软件仍然接受的格式。
- [PNG 转 WebP](https://abox.tools/zh/png-to-webp/): 同一张图片，常常减少三分之一体积，透明区域保持完整。
- [AVIF 转 JPG](https://abox.tools/zh/avif-to-jpg/): 把网站如今保存的格式，变成所有软件一直支持的格式。
- [证件照制作](https://abox.tools/zh/id-photo/): 选择支持的国家和证件。公布的要求与指导值均有标注。

## 常见问题

### 我的照片会传到什么地方去吗？

不会。读取、解码、写出，全由你自己的浏览器在你自己的硬件上完成。这个工具没有任何联网功能，不取东西，也不发东西。页面的 `Content-Security-Policy` 把它可能联的地址全列了出来，没有一个是本站的。确实会加载的只有解码器，它来自本站，只加载一次，而且发生在你的照片被牵扯进来之前。

### 为什么第一次打开要下载 1.4 MB？

因为 HEIC 是浏览器唯一打不开的图片格式。它是装在盒式容器里的一帧 HEVC，只有苹果设备上的 Safari 有解码器，Chrome、Firefox 和 Edge 干脆不认这个文件。所以 HEIC 转换器总得从某处弄个解码器来，能放的地方只有两个，服务器或者这个页面。别人都选了服务器，这就是它们个个要你上传照片的原因。这一个改成自带一份编译成 WebAssembly 的 `libheif`。它从本站发出，第一次访问之后就有缓存。你的照片哪儿也不去，代价就是这 1.4 MB，仅此而已。

### 转出来的 JPEG 还保留拍摄日期、相机和位置吗？

你要它留就留，页面上有个勾选框。开着的时候，EXIF 块从 HEIC 里原样复制出来，按手机写的样子写进 JPEG，所以转换后的照片仍然按拍摄那天排序，而不是按转换那天。大家抱怨 HEIC 转换器的，正是这一点。只有一个标签会改，就是方向。它被设成“正立”，因为旋转已经作用在像素上了，看图软件要是再转一次，每一张竖构图都得躺下。把勾选框关掉，出来的 JPEG 里只剩画面。

### 它会去掉 GPS 坐标吗？

它先告诉你坐标在那儿，然后照你说的办。还没开始转，每张照片那一行就已经写明文件里有没有坐标，这一步比手机做得多。取消勾选“保留日期、相机和参数”，坐标跟别的一切一起被挡在 JPEG 之外；勾着，它们就跟过去。想逐条细看那些标签，或者把已经是 JPEG 的照片里的标签清掉，那是 [EXIF 查看与清除](https://abox.tools/zh/exif-editor/)干的活，而且它不重新压缩画面。

### 画面会重新压缩吗？

会，而且非压不可。HEIC 和 JPEG 是两种编码，从一种到另一种，只能把画面解开再编一遍。你能拿捏的是这一下的代价有多大。质量滑块默认 92，这一档上照片非常难跟原图区分开。要是一点损失都不想要，又不介意文件大上五到十倍，菜单里还有 PNG。

### 文件名叫 .jpg，其实是 HEIC，怎么办？

照样能用。拖进来的文件按开头那几个字节判断，不按名字。名字取决于最后碰过它的那个应用怎么叫它，而一个名叫“.jpg”的 HEIC，正是大家跑来找这类工具的常见原因之一。真的是 JPEG 或者 PNG 的文件会被挡下来，并告诉你它其实是什么，不会被转成一份自己的副本。

### Live Photo 或者连拍能转吗？

里面的静态画面能转。一个 HEIC 可以装不止一张画面，装几张就转几张，按原文件名加编号命名。Live Photo 的视频那一半，是手机搁在 HEIC 旁边的另一个文件，不在这里，也就无从转起。深度图和缩略图在容器里，但不是谁想要的画面，原样留着不动。

### 也能转换 AVIF 图片吗？

AVIF 使用浏览器解码器，不加载 HEIC 引擎。输出仍为 JPEG、PNG 或 WebP。只输出第一张解码后的图片，颜色或 HDR 可能改变。AVIF 元数据一律不保留，元数据复选框仅适用于 HEIC。原文件保持不变。

### 免费吗？要注册吗？

免费，没有账号，不用登录，没有试用期，也没有水印。文件的数量和大小同样没有上限，因为没有哪台服务器在为它们掏钱，活是在你自己的机器上干的。本站带广告，经费就是这么来的，广告拿不到关于你照片的任何信息。

### 断网能用吗？

能，连解码器一起。页面开一次之后断网，它照样处理你的照片，跟之前没有区别。这也是“什么都没上传”最有分量的证明。一个把 HEIC 送出去解码的转换器，拔线那一刻就停了，这一个不会。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **解码器从这儿来，也哪儿都不去。** HEIC 说白了就是装在盒式容器里的 HEVC，除了 Safari 没有浏览器解得开，所以这个页面自带一份编译成 WebAssembly 的 `libheif`，大约 1.4 MB，提交在这个仓库里，从本站发出，跟这里其他文件一样由 service worker 缓存。它不从 CDN 取。走 CDN 等于把一个第三方塞进每一次访问，还会让这个工具离线用不成。二进制放在脚本内部而不是搁在旁边，就是为了启动它连一次 fetch 都不用发。
- **这里没有任何东西会去联网取数据。** 为这个工具写的文件里，一个 `fetch`、一个 `XMLHttpRequest`、一个 `sendBeacon` 都找不到。随附的这份引擎跟所有 Emscripten 构建一样，带着从某个 URL 取 `.wasm` 的加载路径，但那些路径走不到，二进制本来就在手上；就算走到了，`connect-src` 里只列了 Google 的统计端点，浏览器当场就会拒绝。能当证据的是那条策略，不是那句话。
- **元数据在这儿读出来，也报给你看。** 页面上那份列表会写明每张照片带着什么，拍摄日期、相机，还有里面有没有 GPS 坐标。把 JPEG 交给别人之前，这些多半是你想先知道的。读取由 `src/boxes.js` 在这个浏览器里完成，结果显示在这个页面上，写进你的 JPEG 还是丢掉，你自己定。这个仓库里没有哪个统计事件会带上文件名、日期、坐标或者数量。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google，捐助按钮来自 Buy Me a Coffee。关于你照片的信息，一条都没给它们。读文件、解码、写文件的每一行代码都从本站发出，也都摆在仓库里。
- **断网照样能用。** 把页面开一次，然后断网，这个工具跟原来一模一样，解码器也一起缓存下来了。这是最省事的一条证明，在这个页面上还格外有分量。一个把照片送出去解码的转换器，绝无可能做到这一点。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，`src/heif.js` 里是解码器怎么加载、允许干什么，`src/boxes.js` 里是找出照片元数据的容器解析，`src/exif.js` 里是这些元数据进 JPEG 时的遭遇。引擎本身是 `vendor/libheif.js`，原样未改，许可证就放在旁边。
