WebP 转 JPG
每一款浏览器都读得了 WebP,很多桌面软件却不读。
把 WebP 转成 JPG,你得到的文件桌面软件和冲印店柜台都会二话不说地打开。读取和写出都在这个浏览器标签页里发生,所以图像不会被上传到任何地方。JPEG 没有透明度通道,所以 WebP 里透明的部分出来会被压平。
文件不会离开这个标签页。读取它、解码它、写出结果,全都发生在你的机器上;你可以把网断掉再照常用这个工具,自己验证这一点。
工具
把图片拖到这里
也可以粘贴一张,或者选择文件。一次多张也没问题。
转换在你自己的机器上、在这个标签页里完成,所以它必须靠 JavaScript 才能进行。这里没有任何服务器可以代劳。
本次转换
那个打不开的下载文件。
有损的 WebP 是一个 VP8 关键帧外面套了一层容器,所以它的行为就像从视频里抽出来的一帧:编码器以 16 乘 16 的宏块为单位工作,每一块都从它的邻居预测出来。每条边最大 16,383 像素,这是视频的限制,不是照片的。这个文件通常也是意外到手的。一个提供好几种格式的网站会把 WebP 交给浏览器,所以“图片另存为”给你的是它,而不是旁边那个 JPEG。
从九十年代初起,JPEG 就什么都读得了,转成它的理由全在这里。冲印店柜台收它,十年前的 Windows 也收它。这笔交易还算实在:JPEG 不带透明度,所以一个抠掉背景的 WebP 回来时那块空缺会被填上;把一张本来就有损的图像再过一次编码器,也要再花掉一点细节。如果这个文件是要进编辑器,而不是要发给别人,PNG 撑得更住。
文件去了哪里
哪里都没去。
搜出来的转换工具大多是一个上传表单。你把文件交出去,服务器替你转换,然后你只能相信那份副本已经被删掉了。转换一张图像根本不需要这些,所以这里不这么做。
这里没有服务器
转换过程中,这个页面不会发出任何请求。转换器里任何地方都没有对 fetch、XMLHttpRequest、WebSocket、EventSource 或 sendBeacon 的调用,也不会往 cookie、本地存储、会话存储或数据库里写任何东西。
元数据会被去掉
手机拍的照片里带着你当时站立位置的坐标、按下快门的那一秒,以及拍它的那台相机。这些默认会被移除,而结果会告诉你里面原本有什么,让这成为你的选择,而不是一个意外。
你可以自己验证
把网断掉,转一张试试。它照样能用。本页下面的单文件版本更进一步:你下载一次,然后从自己的硬盘上打开它,完全不需要连接。
代码你可以自己读
转换器是一个独立的开源软件包,没有运行时依赖,以 MIT 许可发布。这里的隐私说法出自你能自己读的代码,而不是一句你只能接受的承诺。
格式
能进来什么,能出去什么。
常见的那些在这里,是因为大家需要它们。麻烦的那些在这里,是因为手上有一份扫描的 TIFF、一个 Photoshop 文件或者一整个文件夹的相机 RAW 的人,找不到一个不要求先上传的去处。
可读取
HEIC 与 HEIF、PNG、APNG、JPEG、JPEG XL、WebP、AVIF、GIF、BMP、ICO、TIFF、Photoshop 的 PSD 与 PSB、相机 RAW、DDS、Radiance HDR、OpenEXR、PCX、Apple icon 图标集、Sun raster、XBM、XPM、QOI、TGA、PNM 和 farbfeld,另外还有由浏览器渲染的 SVG。格式是从字节判断出来的,而不是看文件名,因为经聊天应用转发的照片常常叫 image.jpg,里面装的却是 HEIC。
可写出
PNG、APNG、JPEG、WebP、AVIF、GIF、TIFF、BMP、ICO、Apple 图标集、PCX、Sun raster、XBM、XPM、Radiance HDR、OpenEXR、QOI、TGA、PNM 和 farbfeld。Safari 无法写出 WebP,它从未支持过;AVIF 需要浏览器自带 AV1 编码器,Chrome 和 Edge 都有。两种情况工具都会明说,而不是把一个改了名字的 PNG 交给你。
动画会保留每一帧
一张动态 GIF 转成 APNG 会保留每一帧,反过来也一样。转成静态格式时保留第一帧,并且会告诉你,而不是一声不吭地把其余的帧丢掉。
HDR 照片依然是 HDR
手机拍的 HDR 照片,是一张普通图像加上一张更小的图,后者说明每个部分该提亮多少。转换为 AVIF 时两张都会写进文件,连同把它们联系起来的参数,原样复制而不是重新计算。转换为其他格式则得到标准动态范围的画面,并会有一行说明。Radiance HDR 与 OpenEXR 是另一回事,它们之间互转会保留完整范围。
相机 RAW,实话实说
RAW 文件里存的是传感器数据,要靠修图软件把它冲洗成一张照片,这个工具不做那件事。它做的是把相机自己生成、并放进文件里的全尺寸 JPEG 取出来。当你只想从一个 CR2 或 NEF 里拿出那张照片,又不想打开什么大软件时,要的就是这个。
PNG 是这里写的,不是浏览器写的
这意味着没有用到透明度时,它会把那条通道去掉,会嵌入原本的色彩配置文件,也不会撞上任何尺寸上限。对手机照片来说,出来的文件比浏览器做出来的更小。
图标与 favicon
一个 ICO 不是一张图。它是一份小目录,装着同一张图像的好几个尺寸,这样浏览器就能拿 16 像素的那张放在标签上,拿 32 像素的那张放在书签上,网站图标就是这么回事。这里写出 256、128、64、48、32 和 16 像素的条目,而 256 就是 ICO 的上限,因为那份目录用一个字节记录每条边。Apple 图标套件(ICNS)的写法一样,最大到 1024,凡是有两种写法的尺寸,普通版和视网膜版都会带上。从方形的东西开始:每个槽位都是正方形,所以一张横构图的照片回来时会居中放在正方形里,两边是透明的。
它不会做的事
它不会写出 HEIC。没有浏览器做得到,而且其编码器受专利限制,免费工具无法解决。它读取 Photoshop 和 DDS 但不写出,因为读取别人已有的文件是有用的,而写坏一个文件,对方往往一个月后才发现不对。AVIF 以每通道 8 位输出,因为没有浏览器能编码 10 位 AV1,所以没有 PQ 或 HLG 输出。HDR 照片并不需要它,这也是它仍能保留下来的原因。
难办的那个
一个 HEIC 不是一张图,而是几十张。
大多数格式就是一张图像,前面加个文件头,转换起来没什么好说的。HEIC 是例外,值得走一遍,因为把你带到这里来的多半就是它。它是把视频压缩用在了一张静态图像上,装在 MP4 用的那种容器里;有意思的地方在于浏览器居然能读它:解码器它本来就有。
- 01这个文件是一个容器,和 MP4 用的是同一种。里面是一张条目清单:图像本身、一张缩略图、相机元数据,在较新的 iPhone 上还有一层用于高动态范围的额外数据。
- 02图像本身是一张由 512 乘 512 的小块拼成的网格。一张 1200 万像素的照片是 48 块,横八块、竖六块;4800 万像素的接近两百块。一个指望拿到单张图像的读取程序,在里面找不到任何能用的东西。
- 03每一块的压缩方式和视频的一帧一样。工具把这些小块取出来,交给浏览器内置的视频解码器;在大多数机器上,那是一块专门的硬件,所以这件事只要一会儿,而不是一分钟。
- 04网格会补齐到整块,所以它比照片本身更大。真实尺寸另外记录,补出来的部分之后会裁掉。
- 05旋转是存在图像旁边的,而不是应用到图像上的。手机拍的每一张竖构图照片,实际上都是躺着存的,所以忽略这一点的转换工具会给你一张横倒的图。
- 06iPhone 拍的照片用的是 Display P3,色彩范围比大多数文件默认的 sRGB 更宽。工具会读出文件用的是哪一个,并把色彩配置文件一并带过去,所以结果不会看起来发灰。
为什么有些浏览器需要帮忙
Safari 自己就能读 HEIC。只要机器上有对应的硬件,Chrome 和 Edge 就会开放读它所需的视频解码器,而大多数机器都有。Firefox 两者都不提供。在这些浏览器上,这个页面会改为加载一个软件解码器,它到哪里都能用,但更慢;结果里会说明什么时候走的这条路,好让一次慢转换有个解释,而不是莫名其妙。
离线
同一个转换器,做成你硬盘上的一个文件。
把这份文档保存下来,断开连接,它照样能转换你的图像。它运行的每一样东西都写在这个文件里面,所以没有需要连的服务器,你保存之后也不存在会变的版本。
文件
脚本和样式表都写进了页面里
构建过程会编译转换器、压缩样式表,然后把两者都写进文档正文。没有任何东西需要拉取,因为已经没有什么可拉取了。这也是为什么一份文档比你平常加载的页面更重:你拿到的是程序本身,而不是指向它的一个地址。
这个文件不会运行它出厂时没带的代码
构建时会按脚本和样式表落进文档时的样子算出它们的哈希,再把两个哈希写进文件自己头部的 Content-Security-Policy 里。同一条策略把 connect-src 设成了 none,所以这份文档根本不被允许发起网络连接。把脚本改掉一个字符,它就跑不起来了,因为哈希对不上了。
这里没有可以关掉的联网代码
转换器里任何地方都没有调用 fetch、XMLHttpRequest、WebSocket、EventSource 或 sendBeacon,也不往 cookie、本地存储、会话存储或数据库里写任何东西。软件包里有一项测试会读取构建出来的文件,其中只要出现任何一个,这次发布就不通过,所以这是每次构建都验一遍,而不是只承诺一次。
它不会自己更新
这就是这种做法的代价,值得直说。放在你磁盘上的文件,会一直是你存下它那天的样子。转换器新增了一种格式、修好了一处解码,你手上那份不会跟着变。回来重新下载一次,再拿新的 SHA-256 和这里公布的对一遍。
打开它之前
确认你拿到的就是我们发布的。
一个会在你机器上跑程序的文件,值得花一分钟查一查。给下载下来的那份算个哈希,再和为这个文件公布的摘要逐字符对照。
macOS 和 Linux
shasum -a 256 private-image-converter.html
Windows
certutil -hashfile private-image-converter.html SHA256
构建这个文件的工作流,会把它的 SHA-256 记进它发布的那次版本记录里。要对照的就是那个数值,它由生成这些字节的机器记录下来,而不是事后手敲上去的。
如果对不上
别打开这个文件。对不上通常是下载中断,偶尔是更糟的事。把它删掉,重新取一次。如果第二份也对不上,请到问题追踪里提出来,不要绕过去。
验证离线这个说法
网上每一个转换工具都说自己不上传任何东西。这一个,任何人都能在自己的机器上验证,一行源代码都不用读。
- 01把文件存到一个平常的地方。下载文件夹就行。
- 02把网络彻底关掉。开飞行模式,或者拔掉网线并关掉无线。
- 03打开这个文件。地址栏里是一个 file:// 地址,也就是说浏览器是从你的磁盘上加载它的,不是从别的什么地方。
- 04转换一张照片。它能用,速度不打折,而且没有任何地方可以把它发出去。
- 05重新联网,开着开发者工具的网络面板再做一遍。那里始终是空的。
限制
离线文件在 Firefox 里读不了 HEIC。
一个 HEIC 是装在容器里的一帧 HEVC 视频。转换器自己读容器,再把画面交给这台机器上能解 HEVC 的东西。Safari 直接就能解 HEIC。Chrome 和 Edge 会开放你电脑视频硬件里内置的那个解码器,大多数机器都有。Firefox 两者都不提供。
要补上这个缺口,需要一个软件 HEVC 解码器,而把它写进文件里就必然要背上一个依赖。离线版故意一个依赖都不带,正是这一点让它能是一份带着可核对哈希的单一文档。所以在 Firefox 里它会拒绝 HEIC,并给出一句说明原因的话,改什么设置都不管用。
本页顶部的转换器能处理它。这个网站在确认浏览器没有别的路可走之后,会把一个软件解码器作为单独的文件加载进来,而这是单个文档做不到的。
Firefox 能做的事
其余全部。PNG、JPEG、WebP、TIFF、Photoshop、相机 RAW、OpenEXR、Radiance HDR 等等,在 Firefox 里都能用离线文件转换。HEIC 是唯一一个要靠 Firefox 所没有的解码器的格式。
为什么授权条款只有一行
这是同一个限制的另一面。这个文件是转换器包和它的界面,两者都以 MIT 授权,被编译进了一个文档,里面没有任何第三方库,所以那份 MIT 声明覆盖了整个成品。这个网站加载的软件 HEIC 解码器是 LGPL-3.0 的,把这种授权下的库熔进一个压缩过的单文档,会给每一个转手这个文件的人都加上义务。让这个构建不带依赖,换来的就是这份简短的授权条款。
细节
具体规格。
在当前版本的 Chrome、Firefox 和 Safari 上实测。这里没有一条是对未来版本的断言。
- 运行方式
- 完全在浏览器标签页里。没有任何服务器组件。
- 输入方式
- HEIC、HEIF、PNG、APNG、JPEG、JPEG XL、WebP、AVIF、GIF、BMP、ICO、TIFF、PSD、相机 RAW、DDS、HDR、OpenEXR、PCX、ICNS、Sun raster、XBM、XPM、QOI、TGA、PNM、farbfeld、SVG。
- 写出
- PNG、APNG、JPEG、WebP、AVIF、GIF、TIFF、BMP、ICO、ICNS、PCX、Sun raster、XBM、XPM、HDR、OpenEXR、QOI、TGA、PNM、farbfeld。Safari 无法写出 WebP;AVIF 需要 AV1 编码器。
- 上限
- 每张图片 8000 万像素,大约 10,000 乘 8,000,再往上浏览器标签页会在做完之前耗尽内存。手机可能更早停下:工具会问浏览器能不能容纳那么大的绘图表面,答案是不能时会明说。字节数没有上限,因为什么都不用上传。
- HEIC 支持
- Safari 直接就能读。机器上有硬件视频解码时,Chrome 和 Edge 也能读。其余情况使用这个页面按需加载的软件解码器。
- 色彩
- 逐个文件检测 Display P3,并在输出格式能承载时保留它。高动态范围会被压平成标准动态范围。
- 元数据
- 默认移除,包括位置和时间戳。要不要保留,由你每次转换自行决定。
- 网络
- 转换时没有。转换器里任何地方都没有 fetch、XMLHttpRequest、WebSocket、EventSource 或 sendBeacon。
- 存储
- 没有。没有 cookie、本地存储、会话存储、数据库或缓存。
- 离线
- 可以。单文件版在断网的情况下也能从你自己的磁盘上运行。
- 校验
- SHA-256,与文件一并公布,构建它的那次发布记录里也再记了一遍。
- 依赖
- 运行时没有依赖。这个页面可以加载的软件 HEIC 解码器是一份独立的可选资源。
- 许可协议
- MIT
值得一问的问题。
- 我的照片会被上传到什么地方吗?
- 不会。转换在你的浏览器里运行,文件绝不会离开你的机器。这里没有任何服务器可以接收它。最简单的自我验证办法,是把网络关掉,照样转换点什么。
- 这和我找到的其他转换工具有什么不同?
- 它们大多是一个上传表单。你的文件被送到服务器,在那里转换,之后被删掉,至少他们是这么说的。这个工具改在你自己的机器上转换,这个问题也就不存在了。
- 它能读取和写出哪些格式?
- 它能读取二十六种格式:HEIC 与 HEIF、PNG 与 APNG、JPEG、JPEG XL、WebP、AVIF、GIF、BMP、ICO、TIFF、Photoshop 的 PSD 与 PSB、多数厂商的相机 raw、DDS、Radiance HDR、OpenEXR、PCX、Apple 图标集、Sun raster、XBM、XPM、QOI、TGA、PNM 和 farbfeld,以及 SVG。其中二十种可以写出。Photoshop、DDS、相机 raw 和 SVG 只读,Safari 无法写出 WebP,AVIF 需要浏览器自带 AV1 编码器。
- 我该转成 PNG 还是 JPG?
- 要留着或者要编辑的副本,选 PNG。它是无损的,出来的就是进去的那张图,文件通常会大上好几倍。要发给别人的图,选 JPEG,它和 JPG 是同一种格式:它会再压一次,文件很小,一点细节永远回不来了。同样质量下 WebP 和 AVIF 还要更小,能打开它们的软件也更少。如果这张图要去一个你控制不了的地方,JPG 是那个永远能用的。
- 转换会损失画质吗?
- 转成 PNG 不会:它是无损的,结果就是进去的那张图。转成 JPEG、WebP 或 AVIF 会再压一次,这确实会损失一点,损失多少由质量滑块控制。
- 位置和日期会怎么处理?
- 除非你勾选保留,否则它们会被移除。每个结果都会列出被去掉了什么,让你看清原文件里带着哪些东西。这件事比听上去要紧:在家里拍的照片,里面就有你的住址。
- HEIC 是什么,为什么到处都打不开它?
- HEIC 是 iPhone 默认保存照片所用的格式。它用视频压缩来存储图像,文件大小大约只有同等 JPEG 的一半。这种压缩背着专利负担,所以很多浏览器和应用一直没有支持读取它。
- 为什么在 Firefox 里更慢?
- 读取 HEIC 需要一个 HEVC 解码器。Safari 自带一个,Chrome 和 Edge 会开放你机器硬件里内置的那个。Firefox 两者都不提供,所以这个页面会改为加载一个软件解码器。它给出的结果一样,只是耗时更久;凡是走了这条路的转换,工具都会标注出来。
- 为什么转换后的照片在别的地方有时看起来发灰?
- 因为 iPhone 照片用的是 Display P3,色彩范围比大多数文件用的更宽;转换工具如果把这些数值写出去,却不记下它们属于哪个范围,画面看起来就会发灰。这个工具会从文件里检测出范围,并把色彩配置文件带进结果。
- HDR 照片转换后还是 HDR 吗?
- 转换为 AVIF 就还是。HDR 照片是一张普通图像加一张亮度映射,AVIF 会把两者都带上,描述它们关系的参数也逐字节原样复制,而不是重新算一遍。其他输出格式只能装一张图,所以你得到的是标准动态范围版本,并会看到一行说明 HDR 没有保留。
- 为什么 PNG 比它原来的文件还大?
- PNG 是无损的,JPEG、WebP、AVIF 和 HEIC 不是。那些格式为了达到自己的体积扔掉了细节,而 PNG 什么都扔不掉,只能把剩下的完整存下来。如果体积比保真更重要,那就转成 JPEG 或 WebP。
- 在手机上能用吗?
- 能。转换在手机浏览器里跑,和在桌面上跑是一回事,你也可以直接从相册里挑照片。在 iPhone 上,保存会把结果交给系统的共享菜单,而不是丢进 Files,所以你能从那个早就熟悉的菜单把它放回 Photos,或者发进一条消息里。浏览器没有共享菜单的地方,保存就照常下载文件。
- 我能一次转换多张吗?
- 可以。想拖多少、选多少都行,它们会一张接一张地转换。之所以按顺序处理而不是一起处理,是因为一个浏览器标签页同时转换二十张照片会耗尽内存。
- 一批里有一个文件失败了,怎么办?
- 其余的照样转换完成了。失败的文件也占着它自己那一行,并写明原因,所以你能直接看出是哪一个,而不用数着行数去推断少了什么。原因通常是文件损坏或者只下载了一部分、这个浏览器写不出那种格式,或者图片超过了像素上限。把那一个弄好之后再拖进来就行,别的都不用重做一遍。
- 没有互联网连接也能用吗?
- 可以,只要页面已经加载完。本页下面还有一个单文件版本,你下载一次,就能完全不连网直接从硬盘上打开它。
- 单文件版本到底是什么?
- 一份 HTML 文档。转换器、它的界面和它的样式表全都写在里面。你像打开电脑上任何一个文件那样打开它,浏览器就从你的磁盘上把它跑起来。
- 我需要安装什么吗?
- 不需要。没有要安装的东西,没有扩展,也不用加什么运行时。这几年的浏览器已经带齐了它要用的一切。
- 我怎么知道下载到的文件就是对的那个?
- 给它算个哈希,和为它公布的 SHA-256 对一下。构建这个文件的工作流会把那个数值记进它发布的那次版本记录里,所以它来自生成这些字节的那台机器。
- 为什么在离线文件里,Firefox 处理 HEIC 会失败?
- Firefox 不提供 HEVC 解码器,而一个 HEIC 就是一帧 HEVC。离线文件按设计不带任何依赖,所以没有软件解码器可以退回去用。本页顶部的转换器会把一个软件解码器作为单独的文件加载进来,而这是单个文档做不到的。
- 我怎么拿到更新的版本?
- 回来重新下载一次。放在你磁盘上的文件没法自己更新,这是你换取一份谁也没法在你背后动手脚的副本所付出的代价。
- 我能把这个文件转给别人吗?
- 可以。它以 MIT 许可发布,又自成一体,装在 U 盘里带走也一样好用。记得让对方核对哈希。
- 它用的是什么许可?
- 整个文件都是 MIT。里面没有编译进任何用别的许可发布的库,这是有意为之,也正是它在 Firefox 里解不了 HEIC 的原因。
- 为什么这个离线文件这么大?
- 因为它就是程序本身,而不是一个去取程序的页面。普通网页本身很小,然后再下载好几百 KB 的脚本。这个文件把那次下载一次做完,之后再也不用做。
- 它能转换动态 GIF 吗?
- 能,而且帧都会保留。GIF 转成 APNG 出来还是动画,节奏也一样;APNG 转回 GIF 同样如此。两者转成静态格式时保留第一帧,并且会说明这一点。
- 实况照片会怎么样?
- 一张实况照片其实是两个文件:静态图像,以及你按下快门前后录下的一小段视频。到这里来的是那张静态图像,你拿回去的也是它。动起来的那部分留在旁边那段视频里,这个工具不读它。它转换的是图片,不是视频。
- 它怎么处理相机 RAW 文件?
- 它取出相机在按下快门时嵌进文件里的全尺寸 JPEG,现在的相机都会附带这一张。那是相机自己的成像,而不是对 RAW 数据的冲洗,所以它不会和修图软件出来的效果一致;但它是一张全分辨率的真实照片,而且很快就能拿到。
- 它能做出 PDF 吗?
- 不能,而这是一个决定,不是还没做。PDF 是一个页面,写出一个 PDF 就得选定页面尺寸、页边距,还有图片摆在哪里,而这些选择属于做那份文档的人。转成 PNG 或 JPG,再把它放进你用来排版的东西里。
- 它能把东西转成 HEIC 吗?
- 不能,也没有这个打算。没有浏览器能写出 HEIC,而它所用的压缩带着授权义务,免费工具无从满足。
各种转换
为人们真正会问的那些转换准备的页面。
这些每一个都是同一个转换器,只是直接打开在你想要的格式上,前面配了一页专门讲那次转换的文字。它们背后没有任何本页上还没有的东西。
- HEIC 转 JPG
- HEIC 转 PNG
- HEIC 转 WebP
- PNG 转 JPG
- JPG 转 PNG
- WebP 转 PNG
- PNG 转 WebP
- JPG 转 WebP
- AVIF 转 JPG
- AVIF 转 PNG
- PNG 转 AVIF
- JPG 转 AVIF
- PNG 转 ICO
- PNG 转 ICNS
- ICO 转 PNG
- PSD 转 PNG
- PSD 转 JPG
- SVG 转 PNG
- SVG 转 JPG
- TIFF 转 JPG
- TIFF 转 PNG
- PNG 转 TIFF
- JPG 转 TIFF
- GIF 转 APNG
- APNG 转 GIF
- WebP 转 GIF
- GIF 转 PNG
- GIF 转 JPG
- PNG 转 GIF
- BMP 转 JPG
- BMP 转 PNG
- PNG 转 BMP
- RAW 转 JPG
- CR2 转 JPG
- NEF 转 JPG
- DNG 转 JPG
- ARW 转 JPG
- EXR 转 PNG
- HDR 转 PNG
- DDS 转 PNG