这个页面的代码没跑起来。

直接从文件夹里打开 index.html,浏览器会拦下 JavaScript 模块,于是你选好一张照片之后,页面不会有任何反应。改用 http 把这个文件夹提供出去:

powershell -ExecutionPolicy Bypass -File serve.ps1

然后打开 http://localhost:8080/。

证件照制作 — 护照和签证照按规格来

选择支持的国家和证件。公布的要求与指导值均有标注。

语言: 简体中文
查看源码
你的照片在浏览器里处理,无须上传处理。

裁切、测量、读取背景和排版打印,全都在你自己的浏览器里、你自己的硬件上完成,用的是浏览器本来就带的 JPEG 编码器。这个工具没有任何形式的网络功能,没有什么可取,也没有什么可发。就算真有路,页面的另一端也根本没有服务器来接收一张你的面部照片。

实时检查: 检查中…

离线: 检查中…

不用信我们说的。打开开发者工具,盯着“网络”面板,做一张护照照片试试。没有哪个请求带上图片、缩略图、文件名,或者你选中内容里的任何一个字节。嫌麻烦就直接拔掉网线,照样做。

1 选好照片

你浏览器能打开的任何图片都行。白天对着一面素净的墙、从大约一米半外用手机拍的那种,正是这些规定当初设想的样子。照片直接从你的磁盘上读,不会发到任何地方。

2 选好国家和证件

下面每一个数字都是公布的要求,抄录自其下注明的机构。这份清单里没有一条是猜的,也没有一条是去网上取的:它是两张表,src/specs.js 放数字,src/sources.js 放每一条的出处,随页面一起送来。

证件

3 标出脸,检查构图

头顶、下巴,还有左右瞳孔。规定要量的全部就是这四个点,裁切框取自它们最后停在哪里——哪个落偏了就拖回来,然后按套用裁切框。找这四个点,靠的是量这张照片本身:你的头在背后那面墙前的轮廓,以及眼睛所在的那两块偏暗的地方。里头没有模型,也不去取任何东西;它是个起点,不是判决——所以改它是你的事,下面那行也会说清楚四个点里哪一个它量不出来。

照片旁边那块就是裁切结果本身,按规定要的形状,上面什么都不画。文件就长这个样子;取景不对的话,在那里就已经看得出来,用不着等下载完。

选好一张照片,裁切框就会出现在这里。

4 背景

取自裁切框顶部的一条带子,以及两侧肩膀以上的部分,也就是画面里本该只有背景的地方。在 CIE Lab 里测量,而不是在 RGB 里,因为相差四十个 RGB 单位的两种灰根本分不出来,而四十个单位的蓝就是另一种颜色了。

5 保存

以 Markdown 查看

如何准备护照照片

  1. 选好照片。白天,对着一面素净的墙,从大约一米半外用手机拍的一张就行。浏览器直接从磁盘上读,这期间没有任何东西发往别处。
  2. 选好国家和证件。在框里打国家地区的名字,或者点开它的列表,然后选你要办的是这个国家地区的哪一种证件。面板随即显示那条规定的打印尺寸、头高区间、眼线、背景色和上传限制,并注明每个数字出自哪个机构、哪天读的。这份清单里没有一条是猜的;要是人家给你的要求不在上面,就走“其他国家和地区”自己填。
  3. 看一眼脸上那四个点。头顶、下巴和左右瞳孔——规定要量的全部就是这四个点。它们是量这张照片本身放上去的,下面那行会说哪几个量出来了、哪几个是推出来的。哪个落偏了就拖回来,或者切到我自己放,四个都自己放。然后按套用裁切框,裁切框就落在那个国家要的位置上。
  4. 看那四项检查,还有背景。头高、眼线、居中和倾斜,每一项都是按当前的框量出来的,超标的还会说明该往哪边拖。背景取自裁切框的顶边和两侧,再和规定要求的颜色比对;真正让照片被退回的“不均匀”,是和颜色分开量的。
  5. 把三个文件带走。打印用的那张,尺寸精确到毫米,分辨率写在文件里,冲印店才会按正确大小出。拼版那张,⁦10 × 15⁩ 上能排几张就排几张,缝隙里带裁切标记。还有上传用的那张,像素尺寸按门户要求,并落在它两头都卡的 KB 区间里。

说得更细的版本

怎么拍一张不会被退回来的证件照 证件照真正被量的是什么——头部高度、眼睛的位置、背景——哪个国家要哪些数字,以及怎么满足网上表格卡的像素和 KB 限制。

各国照片规定

每条公布了具体数值的规定都有自己的页面,写明这些数值、公布它的机构,以及核对的日期。

常见问题

我的照片会被传到哪里去吗?

不会。图像的解码、裁切、测量和写出,都由你自己的浏览器在你自己的硬件上完成,用的是浏览器本来就带的 JPEG 编码器。这个工具没有任何形式的网络功能:它从不去取什么,也从不发出什么;页面的 Content-Security-Policy 里写着它允许联系的每一个地址,没有一个属于本站。这一点在这儿比在别的工具上更值钱,因为这个文件是你脸的照片。

覆盖了哪些国家?

够多了,多到在这里列出名字就成了一份每加一个国家就得改一次的清单。所以换个说法:每一条都抄录自公布它的那个机构,而且每一条都把机构和读取日期印在数字底下。选择器本身就是那份清单——在它里面打个国家名,一秒钟就知道在不在。不在的走“其他国家和地区”,那里每个数字都由你自己填;而由于世界上大多数地方都按 ICAO 的几何要求签发,那一项一开始就用的是它。 没人公布数字的国家也在单子上,并且在自己那一条里说清楚:画幅用的是世界上大多数地方签发所用的 ⁦35 × 45⁩ 毫米,区间用 ICAO 的且从不标红,注释里写明那个机构实际上说了什么——很多时候是“照片在窗口当场拍”。这里从来不做的,是照着别的工具说的把数字填上。

没有人脸模型,它怎么找到头顶、下巴和眼睛?

靠一个通用人脸检测器不能假设、而这个工具可以假设的前提:这里每一条规定要的都是同一个场面——一个人,正对镜头,站在一面干净、打光均匀的墙前。于是墙的颜色从照片边缘读出来,凡不是这个颜色的就是人,人最上面那一点就是头顶,连头发一起算。瞳孔则是这样找的:在比自身周围更暗的斑块里,挑出高度齐平、分居头部中线两侧的最佳一对。这个比较完全是局部的,所以里头没有一处取决于一张脸是什么颜色。下巴是唯一这样找不到的,因为脖子前的下颌是一条不变色的软边;它由瞳孔推出来——把头发也算进头高里,瞳孔落在中点稍下——再拿轮廓来对一遍。这一切都是 src/detect.js 里的算术:没有权重,没有推理运行时,不取任何东西,而且对每一张脸都是同一套算术。最后这点才是要紧的,因为随工具附上的检测器不会均匀地出错——在某些脸上比在别的脸上更糟——而照片本来就最常被退回的那些人,恰恰是它最先辜负的。

它放的这几个点,能信到什么程度?

够拿来当起点,不够让你不看一眼。四个点每一个都有会出错的照片:有花纹的墙或一排书架就没有轮廓可以衬出一个头,从上面切掉的头照片里根本没有头顶,而眼镜、厚刘海或闭着的眼睛都可能把瞳孔放到别的地方去。所以这个工具会明说四个点里哪几个是量出来的、哪几个是推出来的,遇上没有干净背景的照片宁可直接拒绝也不编一个答案,并且让每个点都还能拖。裁切框取自这些点最后停在哪里,绝不取自它们一开始在哪里。要是你更想四个都自己放,照片上方那个开关写着我自己放;而只要用手动过任何一个点,它自己就会切过去——从那一刻起这些点归你,什么都不会再去动它们。

头高规定是什么,为什么我的老是不合格?

这些规格每一条都写明头部要占画面多少,从下巴底量到头顶,含头发在内;通常是 70% 到 80%,对一张 45 mm 高的照片来说就是 31.5 到 36 mm。最常见的不合格原因是自拍:一臂长大约 60 cm,会让脸变形,也让头在画面里显得太大。第二常见的原因是头顶:头顶指的是头发的最高点,不是发际线,标在发际线上会让每个头都偏小。

为什么文件至少要 20 KB,又怎么把它填大?

印度的考试门户、中国的签证表单和英国的护照上传,都同时规定了最小和最大文件大小,因为小于下限的文件通常是有人误传的缩略图。一张 ⁦200 × 230⁩ 的照片是 46,000 个像素,即便用浏览器能写出的最高画质,也可能只有 15 KB,而且没法靠少压缩把它变大。于是这个工具加了一段塞满空格的 JPEG 注释。这本来就是 JPEG 标准的一部分,任何解码器都会跳过,画面逐位都还是同一幅画面,变长的只有文件本身。那段填充里就用英文写着这件事。

它会检查背景吗,能替换背景吗?

它检查,但不替换。颜色取自裁切框顶部的一条带子,以及两侧肩膀以上的部分,再和规定的颜色在 CIE Lab 里比对,而不是在 RGB 里:相差四十个 RGB 单位的两种灰根本分不出来,而四十个单位的蓝就是另一种颜色了。不均匀是单独测的,因为白墙上的一道影子才是真正让照片被退回的原因,而那不是颜色问题。替换背景意味着把人从画面里抠出来,那是分割模型的活,做得不好会吃掉头发。往后退半米离墙远一点,比任何滤镜都更能解决问题。

⁦10 x 15⁩ 拼版是干什么用的?

自助照相亭六张要收好几十块。照片店柜台印一张 ⁦10 × 15⁩ 只要几毛钱,而且哪家都能印。所以这个工具会在纸上排下你这张照片能排的份数——⁦35 × 45⁩ 排在 ⁦10 × 15⁩ 上是八张——缝隙里带裁切标记,任何东西都不会压在照片上。这里不会为了排下而缩放:每一份都严格是规定要求的尺寸,因为一张为了多塞一份而把它们缩小百分之二的拼版,等于八张全都尺寸不对的照片。请按 100% 打印;把拼版弄错的正是“适应页面”。

像素一样的话,DPI 还有什么关系?

因为 JPEG 可以声明自己有多大,不声明的话,打印它的东西就只能猜。分辨率住在 JFIF 文件头里,而浏览器的画布写这个头时,会把单位字段设成“这是宽高比,不是分辨率”。这个工具改写那几个字节,让文件写明 300 dpi,正是这一点把 ⁦413 × 531⁩ 个像素变成一张 ⁦35 × 45⁩ mm 的照片,而不是一幅没有具体尺寸的图。为此不需要解码,也不消耗画质。

签名文件也能做吗?

能。所引用的 IBPS 公告建议签名 JPEG 使用 ⁦140 × 60⁩ 像素,并要求 10 到 20 KB。本预设输出该尺寸;具体要求请查看本次申请的最新公告。签名不显示人脸参考线,工具会检查纸张是否明亮、墨迹是否可见,以及裁切中是否包含线条或纸边。

用了这个,我的申请就一定能过吗?

不能,而且任何工具都无法诚实地作此保证。它做的是把公布的数字一字不差地套用,并把它做过的每一次测量都摆给你看:这样表单自动测的那些东西——像素尺寸、文件大小、格式——是对的;而人工审核会看的那些东西——头高、眼线、背景——就带着数字摆在你面前。规定也会变:这里的每一条规格都写明出自哪个机构、哪天读的,好让你拿它去对照眼前那份表单,而不是盲信一张表。

它免费吗,需要注册吗?

免费,没有账号,不用登录,没有试用期,也不会在你脸上盖水印。做多少张照片也没有上限,因为没有哪台服务器在为它们掏钱。本站带广告,经费就是从那儿来的,广告拿不到任何关于你照片的信息。

断网能用吗?

能。页面加载一次之后断开网络,它照样干活——规格册是随页面一起送来的文件,不是一次查询。这也是证明“什么都没上传”最省事的办法,真要把你的照片送出去裁切,拔线那一刻就停了。