읽히는 한도 안에서
최대한 비워낸 QR
보통 QR은 검정이 절반쯤입니다. 규격을 건드리지 않고 그 절반을 10분의 1까지 덜어냅니다.
같은 주소, 같은 스캐너
빈 자리를 만드는 게 아니라, 원래 있던 자리를 비우는 것
- 남는 칸을 만든다
- 주소보다 큰 규격을 고르면 남는 칸이 생깁니다. 규격은 이 자리를 정해진 쓰레기값으로 채우라고 말합니다. QR이 촘촘해 보이는 이유의 상당 부분이 여기에 있습니다.
- 마스크를 거꾸로 푼다
- QR은 마지막에 격자무늬를 XOR로 덧씌웁니다. XOR은 같은 값끼리 만나면 0이 되니, 덧씌울 값과 똑같은 값을 미리 넣어두면 두 값이 상쇄되어 흰색이 됩니다.
- 읽는 쪽은 신경 쓰지 않는다
- 디코더는 종료 신호를 만나면 그 뒤를 읽지 않습니다. 남는 칸에 무엇이 들어 있든 결과는 같습니다. 그래서 이 영역은 사실상 우리 캔버스입니다.
얼마나 비워지는지는 복원 레벨이 정합니다
오류 복원용 코드는 우리가 손댈 수 없는 영역이라 그대로 검정으로 남습니다. 복원 레벨을 올릴수록 이 영역이 커지고, 그만큼 여백이 줄어듭니다.
| 레벨 | V2 | V5 | V10 | 쓰임새 |
|---|---|---|---|---|
| L | 27% | 15% | 12% | 화면 공유 |
| M | 34% | 21% | 21% | 기본 권장 |
| Q | 38% | 32% | 29% | 명함, 스티커 |
| H | 해당 없음 | 40% | 34% | 인쇄물, 야외 |
같은 주소를 각 설정으로 인코딩해 데이터 영역의 검정 모듈을 센 값입니다. 참고로 일반 QR은 어느 설정에서나 47% 안팎입니다.
자주 묻는 질문
- 규격을 어기는 건가요?
- 남는 칸에 넣는 값만 규격과 다릅니다. 사용한 마스크 번호는 규격대로 기록하고 오류 복원 코드도 정상으로 계산하므로, 디코더는 평범한 QR로 읽습니다. 설정에서 완전 준수 모드를 고르면 남는 칸까지 규격대로 채웁니다.
- 어떤 스캐너에서나 읽히나요?
- 만들 때마다 브라우저 안에서 실제 디코더로 읽어보고 결과를 알려드립니다. 다만 아이폰 기본 카메라, 카카오톡, 네이버 앱은 각각 다른 디코더를 씁니다. 중요한 곳에 쓸 QR이라면 실제 기기로 꼭 확인하세요.
- 왜 어떤 설정은 읽히다 말다 하나요?
- 넓은 흰 영역에는 스캐너가 밝기 기준을 잡을 단서가 없습니다. 어두운 곳이나 흔들린 사진에서는 없던 점이 생기고, 복원 코드가 그걸 다 메우지 못하면 실패합니다. 복원 레벨을 올리거나 규격을 한 단계 줄이면 해결됩니다.
- 입력한 주소가 서버에 저장되나요?
- 저장되지 않습니다. 인코딩부터 이미지 생성까지 전부 브라우저 안에서 처리하고, 주소를 서버로 보내지 않습니다. 주소를 줄여주는 기능도 없으므로 중간에 거치는 리다이렉트도 없습니다.
- 주소가 너무 길다고 나옵니다
- 현재 규격 10까지 지원합니다. 복원 레벨 L 기준으로 일반 주소는 271자, 영문 대문자와 숫자만 쓰면 395자까지 들어갑니다. 대문자 전용 모드가 두 글자를 11비트에 욱여넣기 때문인데, 주소 경로를 대문자로 바꿀 수 있다면 QR을 한두 단계 작게 만들 수 있습니다.