原创文章 · 手机与浏览器

手机大照片用AI变清晰前要知道的事:尺寸、上传与颜色

Jinlab · 2026年10月1日 · 基于真实开发与真机测试整理

想把一张手机照片用AI放大、变清晰,很多人的第一次尝试是这样结束的:等了半天上传,最后被告知"分辨率过高";或者终于出了结果,鲜艳的红色和绿色却比原图淡了一截。这两个问题我们在做图片工具pixforge的"变清晰"功能时都遇到了。这篇文章把背后的原因和我们的实测数据写下来,帮你在动手之前心里有数。

先算一笔账:手机原图本来就不小

现在手机的主摄照片,常见的是4032×3024,约1220万像素。放大2倍,输出是8064×6048,约4880万像素;放大4倍,输出是16128×12096,约1亿9500万像素。数字是我们按边长直接乘出来的,你可以看到:像素数随放大倍数的平方增长。

所以很多AI放大服务对输入的尺寸都有限制,限制的是边长或总像素。我们的做法是在你点击之前就把话说清楚:

  • 点开"变清晰"时,按你这张图的真实尺寸,写明放大后会变成多大(例如4032×3024放大2倍后是8064×6048),而不是只说"2倍"。
  • 4倍只适合比较小的图。超过400万像素的图,我们会提示改用2倍。
  • 边长超过4096,或者总像素超过1600万的照片,不能直接放大。点击前就说明原因,并提供"一键缩小后再变清晰"。

这里有个值得想一想的问题:一张1200万像素的手机原图,真的需要再放大吗?如果只是为了发朋友圈、做头像,它已经够大了。AI变清晰更适合的是:老照片、截图、被压缩得很小的图、或者先裁出来的一小块局部。先裁剪、再放大,通常比直接放大整张原图更划算,这是我们的使用建议,不是实测结论。

上传:大图为什么慢,怎么变快

变清晰要把图片传到处理服务上。我们最早的做法是把整张图编码后交给网站的服务端中转,结果手机拍的12MP照片根本传不动,要么超出服务端的内存限制,要么干脆在上传之后才被拒绝。后来我们改成让浏览器直接把图片上传出去,并显示上传进度;服务端只读取文件开头一小段,拿到真实尺寸,再重新核对一遍能不能处理、应该怎么计算。

第二个改动是上传的格式。小图继续用无损PNG;大于400万像素的图,改上传质量为95的JPEG。在一台安卓手机(Redmi)上,用4032×3024的照片实测:

  • 上传无损PNG:约132秒。
  • 上传质量95的JPEG:上传约25秒,从点击到拿到结果全程约54秒。

代价是JPEG是有损格式,大图在上传这一步会有一点点压缩损失。我们认为在质量95时换来的速度值得,所以这样定了。你的网络不同,时间也会不同。我们还在联通家宽、不开VPN的情况下测过,上传和下载都能连通,不过这只是一家运营商的一个网络,换成其他运营商或手机流量,我们没有测过。

隐藏的风险:一个69字节的"炸弹"

支持大图之后,我们要防一种攻击,叫"解压炸弹":文件本身只有几十字节,文件头里却声明了一个巨大的尺寸。浏览器如果照着声明去解码,就会按这个尺寸申请内存,直接把手机撑爆。

我们的办法是在解码之前,先读文件头里的宽和高:PNG读IHDR,JPEG读SOF,WebP读它的几种头,GIF和BMP也各有办法。其中JPEG有个细节:EXIF里可能带着缩略图,缩略图里也有一个SOF,读的时候要按段长度跳过它,不能误读成主图的尺寸。超过4000万像素的图直接拒绝,并且告诉你这张图有多少百万像素、上限是多少,而不是笼统地说"无法读取"。文件头读不出来的格式(比如AVIF、HEIC),仍然保留解码之后的像素检查作兜底。

我们用一个真实的测试文件验证:一个69字节的PNG,文件头声明了20000×20000,也就是4亿像素。如果真的解码成每像素4字节的位图,要约1.6GB内存,这是我们按声明尺寸的估算。在手机上,它被立即拒绝,提示"这张图有400.0百万像素,超过了40百万像素的上限"。同一台手机上,1200万像素的正常照片照常打开。

经验:写"防XX"的测试,要确认把防护去掉之后,这条测试真的会失败。我们把预检临时关掉重跑,测试确实失败了,才说明它测的是预检本身,而不是别的路径碰巧给出了类似的提示。

颜色:广色域照片放大后为什么会变淡

iPhone等手机拍的照片,常常带有Display P3广色域的色彩配置,能表示比普通sRGB更鲜艳的颜色。网页里最常见的做法是:把图片画到画布上、转成sRGB再上传。这一步会把最鲜艳的那部分颜色压掉,放大完之后,颜色已经回不来了。(颜色配置的原理和浏览器里的坑,我们在另一篇文章里讲过。)

我们的做法分两步:上传时保留原始色值,不转sRGB、也不带色彩配置;拿到放大结果之后,再把原图的ICC色彩配置写回去,这样看图软件会按P3去显示。

用一张P3测试图放大2倍,把结果缩回原尺寸,与原图比较平均色差ΔE(数字越小越接近,这里的ΔE与CMYK那篇文章里的数字用的公式不一定相同,请不要跨文章比较):

  • 先转sRGB再上传:平均ΔE约13.6。
  • 保留原始色值、写回ICC:平均ΔE约4.9。
  • 最鲜艳的红、绿、橙黄这几块,ΔE从27到37降到2到9;灰、白、黑两种做法一致,本来就没有损失。

在那台安卓手机上跑真实流程,小图(PNG结果)带回P3配置后全图ΔE约4.87,大图(JPEG结果)约3.89。

这里还有一个小坑:Chrome用画布编码JPEG时,会自动嵌入一份sRGB的色彩配置(PNG不会)。我们要的是"不带标签的原始值",所以编码之后要显式把它去掉,否则上传的内容会被当成sRGB。这是我们写测试断言"上传文件不带ICC"时,JPEG路径失败才发现的。

还有一点要坦白:写回ICC这一步如果失败了,我们不会丢掉你已经付出的处理结果,会照常保存,并提示“颜色可能比原图略淡”。

动手前的清单

  • 先想清楚要不要放大。手机原图通常已经很大,真正需要的往往是老照片、小图或裁出来的局部。
  • 先裁、后放。只放大需要的那一块,更省时间,也更可能成功。
  • 选2倍还是4倍:4倍的输出是2倍的4倍像素,只适合小图。
  • 在网络稳定的环境下操作。大图上传是最耗时的一步。
  • 在意颜色的照片,确认工具会保留色彩配置。否则放大后颜色会淡一截。
  • 结果会和原图略有不同。AI会补出原图里没有的细节,所以对要求"完全忠实"的用途,要自己放大后检查。

这些结论来自我们的实测,范围要说清楚:上传耗时(132秒、25秒、54秒)、69字节伪造文件的拦截、真机上的色差(4.87和3.89),都是在一台安卓手机的Chrome上测的;ΔE从13.6降到4.9(鲜艳色从27到37降到2到9)那一组,是在电脑上调用同一个处理服务做的对比。iPhone上的这套流程我们还没有测过。

这些处理已用在Jinlab的图片工具pixforge里。相关文章:手机拍的广色域(Display P3)照片,为什么在网页里处理后颜色变淡?怎么保住?