先说结论
把纸放在一样跟它不同色的东西上,站到正上方,把画面填满,拍一张。然后打开文档扫描,核对它找到的四个角,选「彩色,去掉不匀」或者「黑白」,存成 PDF。
整件事就这么多。剩下的部分说的是每一步各自在修什么,因为只有知道哪一步管哪件事,你才能在三秒钟之内判断出,正要发出去的这份东西会不会被收下。
照片和扫描件真正差在哪
三样,而且分量并不一样。
- 倾斜。照片是从你站着的地方拍的,所以纸是个四边形,不是长方形。这一样谁都看得出来,也是最容易掰回来的。
- 光。扫描仪把一束均匀的光拖过整页,房间不会。灯下面一块亮,离灯远的角落一块暗,而且很多时候还有你自己的影子压在一边。让一张照片看起来就是照片的,其实是这一样;而人们想用「自动对比度」修的也是这一样,结果越修越糟。
- 大小。一千两百万像素拍出来的一页纸,是三到五兆。二十页这样的照片,是一份会被一半邮件服务器弹回来的文档。
把照片拍好
五件事,按各自能起多大作用排:
- 把画面填满。唯一一件事后补不回来的。照片里没有的细节,文件里也没有;从房间那头拍的一页纸,是一页任何分辨率下谁也读不了的纸。别用变焦,直接走近:除非手机切到了第二颗更长的镜头,变焦不过是在裁同一块传感器,扔掉的正是你想留住的那些像素。
- 放在一样别的颜色的东西上。白桌子上的白纸,几乎没有边缘可给人找,软件找不到,等你自己动手拖角的时候你也找不到。深色的桌子、一本书、一件外套,什么都行。
- 别站在纸和光之间。压在纸上的自己的影子,是手机扫描件难看的头号原因。转九十度,它就没了。
- 让它对上焦,然后端稳。手抖任何工具都救不回来,跑焦也一样。在屏幕上点一下那张纸,等画面稳住,再按快门。
- 把整张纸连着四个角一起拍进去。不是因为角有多金贵,而是因为摆正这件事就是从它们身上量出来的。纸跑出画面边缘也还能用,那时照片的边就顶替了纸的边;但一张三个角在画面里、第四个靠猜的纸,出来就是会歪一点点的那一张。
摆正:为什么形状比倾斜更要紧
把倾斜掰回来,是一段被研究透了的算术。一个长方形的四个角,不管从哪儿看,都能定出把它们摆回去的那个变换,再把这个变换用到每个像素上,就得到一页平的纸。任何一个说自己能摆正页面的工具,做的都是这件事。
悄悄出错的是另一半:这页平的纸该有多大。最顺手的办法是量四边形的边、拿它们的比当比例——而斜着拍的照片会把远端那条边压短,于是一张 A4 做出来明显偏矮胖。它看着仍然像扫描件,只是上面每一行字的高度都不对,而屏幕上没有任何地方会说这件事。
更好的答案是:透视本身就带着这个信息。只要相机是台普通相机,一张长方形的照片就足够同时还原出这个长方形真实的长宽比和相机的焦距。这里的文档扫描就是这么做的,然后它会告诉你这页出来是什么形状、那是不是一种标准纸张——所以一页写着「1:1.41,也就是 A4 或者 A5 的形状」的纸,就是你可以不用再操心的纸。
光:用除法,别去拉伸
把一张光线不匀的纸提高对比度,亮的地方变白,暗的地方变黑,暗处写的字也跟着一起没了。问题从来就不是对比度太低,而是纸在这个角和那个角本来就不一样亮,所以根本不存在一个对整页都合适的调整。
管用的办法是估出每一处纸有多亮,再除掉它。纸是一页上任何一小块里偏亮的那个多数,所以把亮度在一格一格的小块上量一遍、每块取一个高分位数,就得到了光的形状,因为文字太暗也太稀疏,动不了这个数。除掉它,剩下的就是墨迹,光线均匀,阴影和边角发暗都没有了。
「彩色,去掉不匀」和「灰度」做的就是这件事。颜色本身属于文档的时候就选彩色:印章、蓝墨水的签字、荧光笔划的那一行,以及任何日后可能有人问「这是不是原件」的东西。
黑白,以及文件为什么突然就小了
存成照片的一页,是几百万个各自能取一千六百万种颜色的像素,而编解码器把力气花在了一页文字根本没有的细腻渐变上。存成黑白的一页,是每像素一位,非墨即纸,压缩起来就像它本来那样重复得厉害。
差距不小:在同样的页面上大约是十八倍。二十页的合同存成照片要到十五兆,存成一位的页面就落在一兆以内。这就是一份文档能不能用邮件发出去的分界线,也是每一台办公室扫描仪都把它设成默认的原因。
代价是没有中间调:页面上的一张照片会变成一片乱点。印刷和手写的页面用它,而文档大多就是这两种;带图的页面用灰度。
有一个细节值得知道,因为它解释了为什么好工具能成、差工具却给你一页带黑角的东西:墨还是纸这个判断必须就地去做。当阴影里的纸比光里的墨还暗,而拍下来的页面上这种情况很常见,整页一个阈值就不可能成立。拿每个像素跟它自己那一小块邻域的均值去比,才让阴影里的字还看得清。
多页,一份文档
按顺序把各页拍下来,一次全加进去,它们就按加进去的顺序变成同一个 PDF 的各页。有两件事要留神:
- 文件名的排序跟你想的不一样。按字母排的时候
page2.jpg排在page10.jpg后面,因为比较是一个字符一个字符做的。别等存成 PDF 之后再看,保存之前在缩略图条上核对顺序。 - 清理是整份文档共用的一个设置,而且是故意的。清理方式不同的页面,看着像两份文档订在了一起,而那恰恰是一份扫描件该避免的印象。按最难看的那一页去挑模式。
发出去之前
- 把 PDF 打开。不是预览,是文件。每一页,方向都对,边上没有被切掉的东西。
- 把页面上最小的那行字读一遍。一个编号、一个日期、一个账号。你在屏幕上按 100% 都读不了,收件人也读不了。
- 核对四个角没有被裁掉。一份表格边上的东西,通常是页码、签字栏,或者那个日后会有人说「本来就没有」的方框。
- 看看这份文档说了你什么。PDF 里有作者、producer 和创建日期这些字段,多数工具都会把它们填上。这要不要紧取决于谁来收,但知道它在那儿总是值得的。
为什么这些都不需要上传
上面每一步,都是在一张你自己的机器早已解好码的图上做算术:四个角、一个变换、一次除法、一个阈值,再加一个一字节一字节写出来的容器。这里没有一样是服务器做得到而浏览器做不到的,也没有一样需要先下载一个模型才能做。
想想这些文件到底是什么,就值得在这儿停一下。人不会随便拍一页纸。人拍的是护照、工资单、租房合同、就诊材料、合同,都是带着姓名、地址和账号的文档,而且拍它们正是因为某个机构要。为了把四个角掰正就把其中一份传到某个网站,等于把整份文档交给一个陌生人。哪些工具是非看你的文件不可、哪些只是顺手看了,怎么判断一个工具是不是真的需要你的文件里有四条用来分辨的检查。