[QRCode] QR코드 생성 원리와 구현
포스트
취소

[QRCode] QR코드 생성 원리와 구현

캡스톤을 진행하며 QRCode에 대해 공부하고 기록하기 위한 글 입니다.

QR코드 종류

Model 1과 Model 2

  • 모델1이 가장 처음 만들어진 QR코드
  • 모델2는 개량된 버전의 QR코드로, 현재 대부분의 QR코드에 해당.
  • 두 모델을 저장 용량과 오류 정정 수준에서 차이가 있음
    • 모델1은 최대 1167개의 숫자, 707개의 영숫자, 299개의 한자 표현 가능
    • 모델2는 최대 7089개의 숫자, 4296개의 영숫자, 2953개의 바이너리 바이트 및 1817개의 간지 문자 표현 가능

Micro QR코드

  • 기존 QR코드의 작은 버전
  • 최대 35자리의 숫자까지 표현 가능.

rMQR

  • 직사각형으로 생성이 가능한 QR코드
  • 공간 절약을 위해 사용
  • 이론상 약 4만자리 숫자까지 표현 가능

SQRC

  • 모양은 일반 QR코드와 동일하지만, 특정 QR코드 스캐너만 정보를 읽을 수 있도록 구성하는 QR코드

Frame QR코드

  • QR코드 중앙에 자유롭게 이미지를 배치할 수 있는 캔버스 영역이 존재하는 QR코드

QR코드 구조

QR코드 구조는 현재 가장 보편적으로 사용되는 Model2가 기준입니다.

구조

model2 structure 출처: KS X ISO/IEC18004 문서 6페이지

Finder Pattern

  • 좌측 상단/하단, 우측 상단에 존재하는 구조
  • 3x3, 7x7의 검정 모듈과 5x5의 흰 모듈로 구성됨
  • 가장 바깥쪽에 흰 모듈의 분리자가 존재
  • 이 패턴을 이용해 QR코드가 정방향이 아니더라도 인식이 가능함

Timing Pattern

  • 파인더 패턴과 이어저 검정색/흰색 모듈이 번갈아 가며 나오는 구조
  • QR코드의 행, 열 갯수와 모듈의 크기를 결정하는 역할

Format Information

  • QR코드를 해석할때 필요한 정보를 담고있는 부분
  • ECC Level, Masking pattern에 대한 정보를 갖고있음

Alignment Pattern

  • QR코드가 왜곡되었을 때 보정하기 위해 사용되는 패턴
  • 모델2 QR코드에서만 사용됨
  • 버전에 따라 여러 위치에 배치됨

Version Information

  • QR코드의 버전 정보를 담고있는 부분.
  • 버전정보는 버전 7 이상부터 생성됨.

Data Area

  • 실제 데이터가 인코딩 되어 저장된 영역
  • 데이터는 8비트 단위의 코드워드로 변환되고, 마스킹 패턴을 사용하여 읽기 쉽도록 조정되어 저장됨.

Error Correction Code

  • 데이터 영역에 포함된 오류 수정 코드워드.
  • Reed-Solomon 오류 수정 알고리즘을 이용해 생성됨.

QR코드 생성 과정

QR코드 생성 과정은 현재 가장 보편적으로 사용되는 Model2가 기준입니다.

1. 데이터 분석 및 인코딩

데이터 분석

  • 입력된 데이터와 ECC LEVEL에 맞는 모드 결정
  • 모든 데이터를 담을 수 있는 적당한 크기의 버전 결정

ECC LEVEL?

ecc 출처: KS X ISO/IEC18004 문서 29페이지

  • ECC 레벨은 L(7%), M(15%), Q(25%), H(30%)가 존재
  • 각 레벨은 오차 정정률로 H는 30%가 손상되도 복구가 가능한 레벨
  • 복원 방식은 Reed-Solomon 에러 정정 방식
  • 레벨이 높을수록 ECC에 사용되는 모듈 수는 늘고, 데이터를 표현하는 모듈 수는 줄어듦
  • 표현 할 데이터의 크기와 ECC Level에 따라 버전을 결정

모드?

mode 출처: KS X ISO/IEC18004 문서 20페이지

  • 입력된 데이터를 인코딩 하는 방식
  • 모드에 따라 데이터를 비트로 변환하는 방법이 다름

인코딩

  • 모드에 맞는 방식으로 데이터를 이진수로 변경
  • 모드 비트 + 데이터 길이 비트 + 데이터 인코딩 비트 + 종단자 비트 + 패딩 비트로 구성
  • 종단자와 패딩 비트 인코딩 후 남은 공간에 추가

length 출처: KS X ISO/IEC18004 문서 20페이지

  • 데이터 길이 비트는 모드와 버전에 따라 정해진 길이의 비트로 변환
  • 자세한 인코딩 방식은 KS X ISO/IEC18004 문서 8.4장이나 구현 코드 참고

2. 오류 수정 코드워드 생성

length 출처: KS X ISO/IEC18004 문서 35페이지

  • Reed-Solomon 알고리즘으로 정해진 코드워드 개수에 따라 오류 보정 비트 생성
  • 규칙에 맞게 8비트씩 잘라서 코드워드 생성
  • 자세한 코드워드 생성 방식은 KS X ISO/IEC18004 문서 8.6장이나 구현 코드 참고

3. 기능 패턴, 버전/포맷 정보 추가

기능 패턴 추가

  • 지정된 위치에 파인더 패턴, 정렬 패턴, 타이밍 패턴 추가

버전 정보 추가

  • QR코드의 버전이 7 이상일때만 추가
  • 6비트의 이진수로 표현된 버전 수를 bch(18, 6) 알고리즘으로 오류 보정 비트 추가
  • 지정된 위치에 버전 정보 추가

포맷 정보 추가

  • ECC LEVEL과 마스크 정보를 정의된 이진수로 바꾸고, bch(15, 5) 알고리즘으로 오류 보정 비트 추가
  • 오류 보정까지 추가한 비트를 101010000010010로 XOR 연산해서 최종 포맷 비트 생성
  • 지정된 위치에 포맷 정보 추가
  • 자세한 포맷 정보 생성 방식은 KS X ISO/IEC18004 문서 8.6장이나 구현 코드/주석 참고

4. 코드워드 배치

  • 규칙에 맞게 나머지 공간에 코드워드 배치
  • 자세한 코드워드 배치 방식은 KS X ISO/IEC18004 문서 8.9장이나 구현 코드/주석 참고

5. 마스킹 및 평가

  • 8 종류의 마스크를 기준에 따라 마스크 적용
  • 각 마스크를 적용한 qr코드별로 페널티 점수를 산출 후, 가장 패널티 점수가 낮은 마스크 선택 후 적용
  • 자세한 마스크 종류와 마스크 평가 방식은 KS X ISO/IEC18004 문서 8.8장이나 구현 코드/주석 참고

레퍼런스

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.