qr-swastika-avoider v0.1.0 — QR 코드의 우발적 스와스티카 문양 회피
3 hours ago
1
- QR 코드에 우연히 생길 수 있는 스와스티카 문양을 탐지하고, 선택적으로 문양 없는 QR 코드를 생성하는 Rust 크레이트임
- QR 표준의 8개 마스크 패턴을 모두 렌더링해 문양 없는 후보를 추린 뒤, ISO/IEC 18004 페널티가 가장 낮은 마스크를 선택함
- 파인더·타이밍·정렬·포맷·버전 모듈을 검사에서 제외하고 주변 대비를 고려해, 기능 요소나 눈에 보이지 않는 형태를 오인하지 않도록 함
- 기본 탐지기는 외부 의존성이 없고 unsafe 코드를 금지하며, 여러 QR 라이브러리와 Vec<Vec<bool>> 표현을 지원함
- 탐지 범위는 축에 정렬된 5×5·7×7 갈고리 십자형의 양쪽 방향과 두 색상 극성으로 한정되며, 45도·대각선 형태와 임의 회전은 지원하지 않음
우발적 문양을 피해야 하는 이유
- qr-swastika-avoider는 QR 코드에 무작위로 나타날 수 있는 스와스티카 패턴을 탐지하고 회피함
- QR 코드는 서로 교체 가능한 8개 마스크 패턴 중 가독성 점수가 가장 좋은 것을 선택하지만, 불쾌감을 줄 수 있는 기호까지 검사하지는 않음
- 작고 얇은 문양은 QR 표준의 평가 과정에서 걸러지기 어려워 최종 코드에 우연히 남을 수 있음
기능 요소와 대비를 고려한 탐지
- 기본 탐지기는 외부 의존성이 없으며 #![forbid(unsafe_code)]를 적용함
- 두 개 메서드로 구성된 작은 QrModules 트레이트를 통해 다양한 QR 표현 형식을 검사할 수 있음
- 파인더·타이밍·정렬·포맷·버전 모듈을 탐지 대상에서 제외해 파인더 모서리를 스와스티카로 오인하지 않음
- 같은 색 모듈 안에 묻혀 실제로 보이지 않는 문양은 주변 대비를 기준으로 무시하며, 이 기준은 조정 가능함
- 기존 QR 코드는 contains_swastika로 검사할 수 있고, 문양이 발견되면 다시 생성하거나 사용자에게 경고할 수 있음
지원하는 QR 표현과 라이브러리
- Cargo 기능으로 다음 어댑터를 제공함
- qrcodegen: qrcodegen::QrCode용 QrModules
- qrcode: qrcode::QrCode용 QrModules
- fast_qr: fast_qr::QRCode용 QrModules
- 원시 모듈 행렬인 Vec<Vec<bool>> 도 별도 어댑터 없이 지원하며, true는 어두운 모듈을 뜻함
문양 없는 QR 코드 생성
- generate 기능의 encode_safe는 콘텐츠와 오류 정정 수준을 받아 문양 없는 스캔 가능한 QR 코드를 반환하며, 생성할 수 없으면 명시적 오류를 돌려줌
- 생성 과정에서는 8개 마스크를 모두 렌더링한 뒤 탐지 대상 문양이 없는 후보만 유지함
- 남은 후보 중 ISO/IEC 18004 페널티가 가장 낮은 마스크를 반환해 표준의 가독성 최적화를 유지함
- 반환값의 matrix()로 모듈 행렬을 가져오고 mask()로 선택된 마스크를 확인할 수 있음
Cargo 기능 구성
- 기본 기능에는 의존성 없는 탐지기만 포함됨
- qrcodegen, qrcode, fast_qr 기능은 각 라이브러리용 어댑터를 추가함
- generate 기능은 qrcodegen을 의존성으로 가져오며 encode_safe를 제공함
탐지 범위와 라이선스
- 고전적인 축 정렬 갈고리 십자형 중 5×5와 7×7 크기, 양쪽 방향, 밝고 어두운 두 색상 극성을 작은 허용 오차 안에서 탐지함
- 45도 또는 대각선 문양과 임의 각도로 회전한 형태는 탐지 범위에 포함되지 않음
- MIT License로 배포됨
-
Homepage
-
Tech blog
- qr-swastika-avoider v0.1.0 — QR 코드의 우발적 스와스티카 문양 회피