이 페이지의 코드가 시작되지 않았습니다.

index.html을 폴더에서 바로 열면 브라우저가 JavaScript 모듈을 막습니다. 그래서 종이 사진 하나를 골라도 아무 일도 일어나지 않아요. 폴더를 http로 띄워서 여세요:

powershell -ExecutionPolicy Bypass -File serve.ps1

그런 다음 http://localhost:8080/을 여세요.

문서 스캐너 — 종이 사진을 반듯하게

종이를 찍으십시오. 스캔한 것처럼 생긴 것이 돌아옵니다.

언어: 한국어
소스 보기
문서는 절대 업로드되지 않습니다. 서버가 아예 없으니까요.

사진을 디코딩하고, 반듯하게 펴고, 정리하고, PDF로 쓰는 일은 모두 이 브라우저가 산술과 이미 들어 있는 코덱만으로 합니다. 이 도구에는 네트워크 기능이 아예 없어서 가져올 것도 보낼 것도 없습니다. 여기서 그것이 중요한 이유는 사람들이 어떤 종이를 찍는지에 있습니다. 여권, 급여명세서, 임대차 계약서, 관공서가 ‘스캔해서 보내라’고 한 서류입니다.

실시간 확인: 확인 중…

오프라인: 확인 중…

말만 믿지 마십시오. 개발자 도구를 열고 네트워크 탭을 보면서 종이를 스캔해 보십시오. 사진도, 축소판도, 파일 이름도, 모서리 한 점의 위치도 실어 나르는 요청은 하나도 없습니다. 아니면 인터넷을 끊고 그냥 스캔해 보십시오.

1 사진 고르기

한 장에 사진 하나씩, 위쪽 어딘가에서 찍으십시오. 종이 전체가 화면에 들어와야 하고, 네 모서리는 보이거나 거의 보여야 합니다. 나머지 — 기울기, 그림자, 아래의 책상 — 는 모두 이 도구가 있는 이유입니다. 여러 장을 더하면 더하는 순서대로 한 문서의 장들이 됩니다.

2 모서리를 종이에 맞추기

사진 아무 데나 누르면 가장 가까운 모서리가 손가락으로 옵니다. 그것을 종이의 모서리로 끌어다 놓으십시오. Tab으로 키보드에서 모서리를 잡고, 화살표 키로 한 픽셀씩, Shift와 함께 누르면 열 픽셀씩 옮깁니다. 어느 것도 되돌릴 수 없는 것이 아닙니다. 스캔은 네 모서리가 최종적으로 놓인 자리에서 뜹니다.

사진을 고르면 여기에 나타나고, 네 모서리는 찾아 놓은 상태입니다.

3 정리하기

아래에 있는 것이 실제 결과이고, 파일을 쓰는 것과 같은 코드가 만든 것입니다. 반듯하게 펴고 고르지 않은 빛을 나눠 걷어 낸 상태입니다. 고르는 동안 화면에는 화면 크기로 그려지고, 파일 자체는 사진의 해상도로 만들어집니다.

색, 고르게 종이의 밝기를 지면 전체에 걸쳐 재서 나눠 걷어 냅니다. 그래서 그림자가 사라지고 종이는 다시 하얘지는 한편, 도장이나 파란 잉크 서명이나 형광펜으로 그은 줄은 제 색을 지킵니다. 색이 문서의 일부일 때 쓰는 모드입니다.

회색조 색 없이 같은 방식으로 고르게 만듭니다. 컬러보다 작고, 사진이나 서명에는 흑백보다 너그럽습니다.

흑백 각 픽셀을 지면 전체의 한 숫자가 아니라 제 이웃에 견주어 정하는데, 바로 그것이 그림자 속 글씨를 읽을 수 있게 지켜 줍니다. 스캔을 작게 만드는 것이 이것입니다. 스무 장짜리 계약서가 이 모드에서는 일 메가바이트 아래로 나오고, 사진으로는 십오 메가바이트쯤이 됩니다. 중간 톤을 모르므로 사진이 얹힌 것에는 쓰지 않는 편이 좋습니다.

그대로 두기 반듯하게만 펴고 그 밖에는 아무것도 하지 않습니다. 종이 자체가 중요한 장에 씁니다. 오래된 것, 색이 있는 것, 사진 같은 것입니다.

반듯하게 펼 사진이 생기면 그 결과가 여기에 나타납니다.

4 문서 저장하기

PDF는 여기, 이 페이지의 메모리에서 한 장씩 만들어집니다. 이 도구 건너편에는 급여명세서나 여권이나 계약서를 보낼 서버가 없고, 설령 있다 해도 그렇게 할 코드가 없습니다.

인쇄 해상도 픽셀이 그만큼 있는 종이를 얼마나 큰 종이라고 부를지입니다. 문서가 인쇄될 크기를 바꿀 뿐, 스캔의 픽셀은 하나도 바꾸지 않습니다.

가장 긴 변 반듯하게 편 장의 상한입니다. 종이를 찍은 사진에는 그 종이가 값하는 것보다 훨씬 많은 픽셀이 들어 있고, 긴 변 2400은 A4에서 대략 200 DPI입니다.

품질 JPEG으로 저장되는 컬러와 회색조 모드에 적용됩니다. 흑백 장은 정확하게 저장되므로 이 설정이 아무 일도 하지 않습니다.

문서 제목 (선택) 장들 말고 문서에 쓰이는 유일한 것입니다. 날짜도, 작성자도, 이 기기에 대한 것도 없습니다. src/document.js를 보십시오.

82%

Markdown으로 보기

휴대폰 카메라로 문서 스캔하는 법

  1. 종이를 찍으십시오. 위에서, 종이 전체가 화면에 들어오고 네 모서리가 보이거나 거의 보이게 찍으십시오. 정면일 필요도, 빛이 고를 필요도 없습니다. 기울기와 그림자야말로 이 도구가 있는 이유입니다. 중요한 것은 화면을 채우는 것입니다. 방 건너편에서 찍은 종이에는 되살릴 세부가 없습니다.
  2. 네 모서리를 확인하십시오. 사진을 읽을 때 찾아 주고, 확신이 서지 않으면 페이지가 그렇게 말합니다. 종이와 같은 색 책상 위의 종이는 정말로 가장자리가 잘 보이지 않습니다. 사진 아무 데나 누르면 가장 가까운 모서리가 손가락으로 오고, Tab으로 하나를 잡아 화살표 키로 옮길 수도 있습니다.
  3. 빛을 어떻게 할지 고르십시오. ‘색, 고르게’는 종이의 밝기를 지면 전체에 걸쳐 재서 나눠 걷어 냅니다. 그래서 그림자가 사라져도 도장이나 서명은 제 색을 지킵니다. ‘흑백’은 거기서 더 나아가고, 스캔을 메일로 보낼 만큼 작게 만드는 것이 바로 그것입니다. 화면에 보이는 것이 실제 결과이고, 파일을 쓰는 것과 같은 코드가 만든 것입니다.
  4. 나머지 장을 더하십시오. 더하는 사진마다 같은 문서의 다음 장이 되고, 순서는 목록에 놓인 대로이며, 각 장은 자기 모서리를 지킵니다. 띠에 있는 장의 화살표가 그 장을 앞이나 뒤로 옮깁니다.
  5. PDF를 저장하고, 보내기 전에 열어 보십시오. 문서는 여기, 이 페이지의 메모리에서 만들어집니다. 그것을 만드는 데 업로드된 것은 없고, 그것에 대해 어디에 알려진 것도 없습니다.

자세한 설명

휴대폰으로 문서 스캔하는 법 종이를 찍은 사진과 그 종이를 스캔한 것을 가르는 것: 기울기, 고르지 않은 빛, 그리고 파일 크기입니다. 사진을 어떻게 찍고, 그다음 무엇을 고치고, 왜 그 어느 것에도 서버가 필요 없는지.

자주 묻는 질문

제 문서가 어딘가로 업로드되나요?

아닙니다. 사진을 디코딩하고 반듯하게 펴고 정리해서 PDF로 쓰는 일은 모두 이 브라우저가 이 기기의 하드웨어에서 합니다. 이 도구에는 네트워크 기능이 아예 없어서 무엇을 가져오지도, 보내지도 않습니다. 그리고 페이지의 Content-Security-Policy에는 접속할 수 있는 주소가 모두 적혀 있는데 그중 이 사이트의 것은 하나도 없습니다. 페이지를 한 번 불러온 다음 인터넷을 끊어도 그대로 동작합니다.

모델 없이 종이의 모서리를 어떻게 찾나요?

사각형을 이루는 네 개의 길고 곧은 가장자리를 찾습니다. 사진을 줄이고 기울기를 구합니다. 이미지가 어디에서 어느 방향으로 변하는지입니다. 그리고 가장자리에 놓인 픽셀마다 자기가 놓일 직선에 표를 던집니다. 강한 직선들을 짝지어 후보 사각형을 만들고, 후보마다 네 변을 따라 걸으며 각 변 아래에 실제로 가장자리가 얼마나 있는지, 그리고 그 넷이 한 물건의 경계인지를 물어 점수를 매깁니다. 종이는 주변보다 밝거나 어둡되 네 변에서 모두 같은 방향으로 그러한데, 그것이 글줄 한 줄을 종이의 아랫변으로 착각하지 않게 해 줍니다. 가중치도 없고, 내려받는 것도 없으며, 어떤 문서가 들어와도 산술은 같은 산술입니다.

찾아 준 모서리가 틀렸습니다. 어떻게 하죠?

끌어서 옮기십시오. 모서리는 출발 위치일 뿐 결코 결정이 아닙니다. 스캔은 네 모서리가 최종적으로 놓인 자리에서 뜹니다. 사진 아무 데나 누르면 가장 가까운 모서리가 손가락으로 뛰어오는데, 작은 손잡이를 정확히 짚는 것보다 쉽습니다. 화살표 키는 초점이 놓인 모서리를 한 픽셀씩 옮깁니다. 모서리가 찾아낸 것이 아니라 추측일 때도 페이지가 말해 주고, 띠에서 그 장을 표시해 둡니다. 제 색과 비슷한 책상 위에 놓인 종이가 흔한 이유인데, 거기에는 찾을 가장자리가 정말로 거의 없기 때문입니다.

반듯하게 편 종이가 왜 눌리지 않고 제 모양으로 나오나요?

모양을 가장자리에서 재는 것이 아니라 원근에서 되살리기 때문입니다. 비스듬히 찍은 종이는 먼 쪽 가장자리가 짧아 보입니다. 그래서 뻔한 방법 — 마주 보는 가장 긴 변 한 쌍을 골라 그것을 비율이라고 부르는 것 — 은 눈에 띄게 뭉툭한 A4를 만듭니다. 웹 스캐너 대부분이 그렇게 줍니다. 사실 사각형을 찍은 사진에는 카메라가 평범한 카메라이기만 하다면 그 사각형의 종횡비와 카메라의 초점 거리를 함께 되살리기에 충분한 정보가 들어 있습니다. 2003년 Zhang과 He의 결과이고, src/geometry.js가 하는 일입니다. 정면으로 찍은 사진에는 원근이랄 것이 없고 필요하지도 않습니다. 그때는 가장자리가 정확하기 때문입니다. 그래서 그쪽으로 물러나고, 어느 쪽이 답했는지를 페이지가 말해 줍니다.

‘정리’는 이미지에 실제로 무엇을 하나요?

빛을 나눠서 걷어 냅니다. 종이 자체의 밝기를 지면 전체에 걸쳐 잽니다. 격자로 나눈 칸마다 밝기의 높은 백분위수를 취하는데, 글자는 그 값을 움직이기에는 너무 어둡고 너무 성깁니다. 그리고 각 픽셀을 그 지점에서 추정한 종이 밝기로 나눕니다. 남는 것은 잉크이고, 빛이 고르며, 그림자도 가장자리 어두워짐도 없습니다. 이것은 대비를 올리는 것과 다릅니다. 찍은 종이의 대비를 올리면 밝은 쪽은 하얗게, 어두운 쪽은 새까맣게 되고, 어두운 쪽에 적힌 글씨는 읽을 수 없게 됩니다. ‘자동 레벨’이 이런 사진을 좋게 만들기는커녕 나쁘게 만드는 이유입니다.

흑백 모드는 왜 그렇게 훨씬 작은가요?

색이 둘인 이미지는 천육백만인 이미지에 견주면 정말로 데이터의 극히 일부이고, 여기서도 그렇게 저장하기 때문입니다. 픽셀당 1비트를 바이트마다 여덟 개씩 묶어 정확하게 압축합니다. 흑백 이미지를 JPEG으로 만드는 것이 아닙니다. 같은 문서에서 컬러 모드보다 열여덟 배쯤 작게 나와서, 스무 장짜리 계약서가 십오 메가바이트쯤이 아니라 일 메가바이트 아래로 떨어집니다. 임계값은 Sauvola의 것으로, 각 픽셀을 지면 전체의 한 숫자가 아니라 제 이웃의 평균과 퍼짐에 견주어 정합니다. 그것이 그림자 속 글씨를 지켜 줍니다. 중간 톤이 없으니 사진이 들어간 장은 다른 모드를 써야 합니다.

여러 장을 한 PDF에 넣을 수 있나요?

예. 더하는 사진마다 다음 장이 되고, 순서는 목록에 놓인 대로이며, 각 장은 자기 모서리를 지킵니다. 그래서 차례로 찍은 종이 더미가 문서 하나가 됩니다. 띠에 있는 각 장의 화살표가 그 장을 앞뒤로 옮깁니다. 정리 설정을 모든 장이 함께 쓰는 것은 일부러 그런 것입니다. 한 문서 안에서 서로 다르게 정리된 장들은 두 개의 문서처럼 보입니다.

글자를 읽어서 PDF를 검색할 수 있게 해 주나요?

아닙니다. 텍스트 층도 없고 문자 인식도 없습니다. 나오는 것은 종이의 그림이 한 장에 얹힌 것입니다. 제대로 하려면 OCR 엔진이 필요한데, 그것은 수십 메가바이트짜리 모델을 내려받는 일입니다. 그리고 급여명세서를 읽기도 전에 모델을 가지러 가는 문서 스캐너는 급여명세서에 대해 집에 전화할 이유가 있는 문서 스캐너일 것입니다. 글자가 필요하다면, 흑백 모드가 만드는 파일이 이 기기의 OCR 소프트웨어가 가장 잘 다루는 바로 그런 파일입니다.

흐릿하게 나왔습니다. 왜죠?

거의 언제나 사진 속에서 종이가 작았기 때문입니다. 미리보기 아래 칸이 종이가 화면의 얼마를 채웠는지, 그리고 그 크기의 종이에서 인치당 몇 점쯤 되는지를 말해 줍니다. 대략 150 DPI 아래로 내려가면 인쇄한 스캔이 흐물흐물해 보이고, 파일에 애초에 없던 세부에 대해서는 어느 도구도 해 줄 것이 없습니다. 확대 대신 가까이 가고, 가만히 들고, 버튼을 누르기 전에 카메라가 종이에 초점을 맞추게 하십시오. 흔들림이 나머지 원인이고, 그것도 되살릴 수 없습니다.

무료인가요? 계정이 필요한가요?

무료이고, 계정도 로그인도 체험판도 장수 제한도 워터마크도 없습니다. 사진 크기에도 제한이 없습니다. 그 값을 치르는 서버가 없기 때문입니다. 일은 이 기기에서 일어납니다. 이 사이트는 광고로 운영되고, 광고 쪽에는 문서에 대한 것이 전해지지 않습니다.