De code van deze pagina is niet gestart.

Open je index.html rechtstreeks uit een map, dan worden JavaScript-modules geblokkeerd en gebeurt er niets zodra je een foto van een pagina kiest. Serveer de map in plaats daarvan over http:

powershell -ExecutionPolicy Bypass -File serve.ps1

Open daarna http://localhost:8080/.

Documentscanner — een foto van een pagina, rechtgetrokken

Fotografeer de pagina. Je krijgt iets terug dat eruitziet als een scan.

Taal: Nederlands
Broncode bekijken
Je documenten worden nooit geüpload. Er is geen server.

De foto wordt door je eigen browser gedecodeerd, rechtgetrokken, opgeschoond en in een PDF geschreven, met niets anders dan rekenwerk en de codecs die hij al meebrengt. Dit gereedschap heeft geen enkele netwerkfunctie — niets op te halen, niets te versturen — en waarom dat hier uitmaakt is waar mensen pagina's van fotograferen: een paspoort, een loonstrook, een huurcontract, een formulier dat een instantie heeft gevraagd te „scannen en terug te sturen”.

Live controle: bezig met controleren…

Offline: bezig met controleren…

Neem het niet van ons aan: open DevTools, kijk naar het tabblad Netwerk en scan een pagina. Geen enkel verzoek draagt een foto, een miniatuur, een bestandsnaam of de positie van één hoek mee. Of trek de stekker uit het internet en scan er toch een.

1 Kies foto's

Eén foto per pagina, genomen van ergens erboven. De hele pagina moet in beeld zijn, en de vier hoeken zouden zichtbaar moeten zijn of bijna. Al het andere — de scheve hoek, de schaduw, de tafel eronder — is waar dit gereedschap voor is. Voeg er meerdere toe en ze worden de pagina's van één document, in de volgorde waarin je ze toevoegt.

2 Zet de hoeken op de pagina

Tik ergens op de foto, en de dichtstbijzijnde hoek komt naar je vinger toe; sleep hem naar de hoek van de pagina. Met Tab bereik je een hoek via het toetsenbord, de pijltjestoetsen verplaatsen hem één pixel en met Shift tien. Niets hiervan is definitief: de scan wordt genomen van waar de vier hoeken uiteindelijk staan.

Kies een foto, dan verschijnt hij hier, met zijn vier hoeken voor je gevonden.

3 Opschonen

Wat hieronder staat is het echte resultaat, gemaakt door dezelfde code die het bestand schrijft: rechtgetrokken en met het ongelijke licht eruit gedeeld. Op het scherm wordt het op schermgrootte getekend terwijl je kiest; het bestand zelf ontstaat in de resolutie van de foto.

Kleur, gelijkgetrokken Het papier wordt over de pagina heen gemeten en eruit gedeeld, zodat de schaduw verdwijnt en het papier weer wit wordt, terwijl een stempel, een handtekening in blauwe inkt of een gemarkeerde regel hun kleur houden. Dit is de modus als de kleur bij het document hoort.

Grijstinten Hetzelfde gelijktrekken zonder de kleur. Kleiner dan kleur en vriendelijker voor een foto of een handtekening dan zwart-wit is.

Zwart-wit Elke pixel wordt beoordeeld tegen zijn eigen omgeving en niet tegen één getal voor de hele pagina, en precies dat houdt het schrift binnen een schaduw leesbaar. Dit is wat een scan klein maakt: een contract van twintig pagina's komt er zo onder een megabyte uit en als foto's rond de vijftien. Deze modus kent geen halftonen, dus niets met een foto erop zou hem moeten nemen.

Zo laten Rechtgetrokken en verder niets. Voor een pagina waarbij het papier zelf meetelt: iets ouds, iets kleurigs, een foto.

De rechtgetrokken pagina verschijnt hier zodra er een foto is om recht te trekken.

4 Sla het document op

De PDF ontstaat hier, in het geheugen van deze pagina, pagina voor pagina. Aan de andere kant van dit gereedschap staat geen server om een loonstrook, een paspoort of een contract naartoe te sturen, en in de code staat niets dat dat zou doen als die er wel was.

Afdrukresolutie Hoe groot een vel genoemd wordt dat uit een bepaald aantal pixels bestaat. Het verandert het formaat waarop het document wordt afgedrukt, en geen enkele pixel van de scan.

Langste zijde Een bovengrens voor de rechtgetrokken pagina. De foto van een pagina bevat veel meer pixels dan de pagina waard is, en 2400 op de lange rand is ongeveer 200 DPI op A4.

Kwaliteit Voor de modi kleur en grijstinten, die als JPEG worden opgeslagen. Zwart-witpagina's worden exact opgeslagen; voor die pagina's doet dit niets.

Documenttitel (optioneel) Het enige wat er behalve de pagina's in het document geschreven wordt. Geen datum, geen auteur en niets over dit apparaat. Zie src/document.js.

82%

Als Markdown bekijken

Zo scan je een document met de camera van je telefoon

  1. Fotografeer de pagina. Van boven, met de hele pagina in beeld en de vier hoeken zichtbaar of bijna. Hij hoeft niet recht van voren en hij hoeft niet gelijkmatig belicht: de hoek en de schaduw zijn waar dit gereedschap voor is. Wat wel uitmaakt is het beeld vullen — een pagina die van de andere kant van de kamer gefotografeerd is, heeft geen detail meer om terug te halen.
  2. Controleer de vier hoeken. Ze worden voor je gevonden zodra de foto gelezen is, en de pagina zegt het als hij het niet zeker weet — een pagina op een bureau van dezelfde kleur als het papier heeft werkelijk een rand die nauwelijks te zien is. Druk ergens op de foto en de dichtstbijzijnde hoek komt naar je vinger toe, of bereik er een met Tab en verplaats hem met de pijltjestoetsen.
  3. Kies wat er met het licht moet gebeuren. „Kleur, gelijkgetrokken” meet het papier over de pagina heen en deelt het eruit, zodat de schaduw verdwijnt en een stempel of een handtekening zijn kleur houdt. „Zwart-wit” gaat verder en is wat een scan klein genoeg maakt om te mailen. Wat je op het scherm ziet is het echte resultaat, gemaakt door dezelfde code die het bestand schrijft.
  4. Voeg de andere pagina's toe. Elke foto die je toevoegt wordt een volgende pagina van hetzelfde document, in de volgorde waarin ze staan, en elke pagina houdt haar eigen hoeken. De pijltjes bij een pagina in de strook verplaatsen haar naar voren of naar achteren.
  5. Sla de PDF op, en open hem voordat je hem verstuurt. Het document wordt hier opgebouwd, in het geheugen van deze pagina. Er is niets geüpload om het te maken, en er is nergens iets over gemeld.

De uitgebreide versie

Hoe je een document scant met je telefoon Wat een foto van een pagina scheidt van een scan ervan: de hoek, het ongelijke licht en de bestandsgrootte. Hoe je de foto maakt, wat je daarna herstelt, en waarom er nergens een server aan te pas komt.

Vragen

Wordt mijn document ergens naartoe geüpload?

Nee. De foto wordt door je eigen browser op je eigen hardware gedecodeerd, rechtgetrokken, opgeschoond en in een PDF geschreven. Dit gereedschap heeft geen enkele netwerkfunctie — het haalt nooit iets op en verstuurt nooit iets — en het Content-Security-Policy van de pagina noemt elk adres dat hij mag benaderen, en geen daarvan hoort bij deze site. Laad de pagina één keer, trek de stekker uit het internet, en hij werkt nog steeds.

Hoe vindt hij de hoeken van de pagina zonder model?

Door te zoeken naar de vier lange rechte randen waaruit een rechthoek bestaat. De foto wordt verkleind, de gradiënt wordt genomen — waar het beeld verandert, en in welke richting — en elke pixel die op een rand ligt stemt op de rechte lijn waar hij op zou liggen. De sterke lijnen worden tot kandidaat-rechthoeken gekoppeld, en elke kandidaat krijgt een score door zijn vier zijden af te lopen en te vragen hoeveel van elke zijde er werkelijk een rand onder heeft, en of die vier samen de grens van één ding zijn: een pagina is lichter dan wat eromheen ligt, of donkerder, maar op alle vier de zijden hetzelfde, en dat is wat voorkomt dat een regel tekst voor de onderkant van de pagina wordt aangezien. Er zijn geen gewichten, er wordt niets gedownload, en het rekenwerk is hetzelfde rekenwerk voor elk document dat erdoorheen gaat.

De hoeken die hij gevonden heeft kloppen niet. Wat nu?

Sleep ze. De hoeken zijn een beginpositie en nooit een beslissing: de scan wordt genomen van waar de vier uiteindelijk staan. Druk ergens op de foto en de dichtstbijzijnde hoek springt naar je vinger, wat makkelijker is dan een klein handvat raken, en de pijltjestoetsen verplaatsen de hoek met de focus één pixel per keer. De pagina vertelt je ook wanneer de hoeken een gok zijn in plaats van een vondst, en markeert die pagina in de strook — een pagina die op een bureau van ongeveer zijn eigen kleur ligt is de gebruikelijke reden, want daar valt echt bijna geen rand te vinden.

Waarom komt de rechtgetrokken pagina in de goede vorm uit en niet platgedrukt?

Omdat de vorm uit het perspectief wordt teruggerekend en niet van de randen wordt afgemeten. Een pagina die schuin gefotografeerd is heeft een verkorte verre rand, dus de voor de hand liggende methode — neem het langste paar tegenoverliggende randen en noem dat de verhouding — levert een zichtbaar gedrongen A4 op, en dat is wat de meeste webscanners je geven. Een foto van een rechthoek draagt in werkelijkheid genoeg informatie om zowel de verhouding van de rechthoek als de brandpuntsafstand van de camera terug te rekenen, mits de camera een gewone is; dat is een resultaat van Zhang en He uit 2003, en dat is wat src/geometry.js doet. Waar de foto recht van voren genomen is, is er geen perspectief om mee te werken en is dat ook niet nodig, want dan zijn de randen exact — dus valt hij daarop terug, en de pagina zegt welke van de twee het antwoord gaf.

Wat doet het „opschonen” nu eigenlijk met het beeld?

Het deelt het licht eruit. De eigen helderheid van het papier wordt over de pagina heen gemeten — een raster van vakjes, en in elk vakje een hoog percentiel van de helderheid, dat tekst te donker en te schaars is om te verschuiven — en elke pixel wordt gedeeld door het papier zoals dat op dat punt geschat is. Wat overblijft is de inkt, gelijkmatig belicht, zonder de schaduw en zonder de afval van licht naar de randen. Dat is niet hetzelfde als het contrast verhogen: het contrast van een gefotografeerde pagina verhogen maakt het lichte deel wit, het donkere deel zwart, en wat er in het donkere deel staat onleesbaar, en daarom maken „automatische niveaus” deze beelden slechter in plaats van beter.

Waarom is de zwart-witmodus zoveel kleiner?

Omdat een beeld met twee kleuren erin werkelijk een fractie is van de gegevens van een beeld met zestien miljoen, en het wordt hier ook zo opgeslagen: één bit per pixel, acht per byte ingepakt en exact gecomprimeerd, en niet als een JPEG van een zwart-witbeeld. Op dezelfde pagina's komt het er ongeveer achttien keer kleiner uit dan de kleurmodus, dus een contract van twintig pagina's blijft onder een megabyte in plaats van rond de vijftien te landen. De drempel is die van Sauvola, die elke pixel beoordeelt tegen het gemiddelde en de spreiding van zijn eigen omgeving in plaats van tegen één getal voor de hele pagina — en dat is wat het schrift binnen een schaduw leesbaar houdt. Hij kent geen halftonen, dus een pagina met een foto erop kan beter een van de andere modi nemen.

Kan ik meerdere pagina's in één PDF zetten?

Ja. Elke foto die je toevoegt wordt een volgende pagina, in de volgorde waarin ze staan, en elke pagina houdt haar eigen hoeken — dus een stapel pagina's die na elkaar gefotografeerd is wordt één document. De pijltjes bij elke pagina in de strook verplaatsen haar naar voren of naar achteren. De opschoon-instelling wordt met opzet door allemaal gedeeld: pagina's in één document die verschillend opgeschoond zijn, zien eruit als twee documenten.

Leest hij de tekst, zodat ik de PDF kan doorzoeken?

Nee. Er is geen tekstlaag en geen tekenherkenning: wat eruit komt is een beeld van de pagina op een pagina. Het goed doen zou een OCR-motor betekenen, en dat zijn tientallen megabytes aan model om te downloaden — en een documentscanner die een model ophaalde voordat hij je loonstrook kon lezen, zou een documentscanner zijn met een reden om over loonstroken naar huis te bellen. Als je de tekst nodig hebt, levert de zwart-witmodus precies het soort bestand op waar OCR-software op je eigen machine het beste mee werkt.

Hij is wazig geworden. Waarom?

Bijna altijd omdat de pagina klein was in de foto. Het paneel onder het voorbeeld zegt hoeveel van het beeld de pagina vulde en ongeveer hoeveel punten per inch dat oplevert op een vel van dat formaat — onder zo'n 150 DPI ziet een afgedrukte scan er slap uit, en geen enkel gereedschap kan iets doen aan detail dat nooit in het bestand heeft gezeten. Ga dichterbij staan in plaats van in te zoomen, houd stil, en laat de camera scherpstellen op de pagina voordat je op de knop drukt. Bewegingsonscherpte is de andere oorzaak, en die is ook niet terug te halen.

Is het gratis, en heb ik een account nodig?

Het is gratis, en er is geen account, geen inloggen, geen proefperiode, geen paginalimiet en geen watermerk. Er is ook geen limiet op de grootte van de foto's, want er is geen server die ervoor betaalt — het werk gebeurt op je eigen machine. De site draait advertenties, en dat is wat hem betaalt; de adverteerders krijgen niets over je documenten.