파이썬으로 QR 코드 생성하기 - ft. qrcode 모듈
업무상 QR 코드 생성할 일이 있어서, 잠시 이리 저리 짱구를 굴려보니 파이썬을 활용하면 편하겠다는 생각이 들었습니다.
파이썬으로 qrcode 생성을 위해서는 qrcode 모듈을 import 해와야 합니다.
당연하게도, 아직 qrcode 모듈이 프로젝트에 설치되지 않았기 때문에 import 명령어에 에러가 표시됩니다.
qrcode 모듈을 설치하자 - pip install qrcode
터미널에 아래와 같이 pip 명령을 입력하고 엔터를 쳐줍니다.
pip install qrcode
(※ 혹시 에러가 난다면, 파이썬을 방금 설치하고 PC 재부팅을 하지 않은 경우일 수 있습니다. PC 재부팅을 해주세요.)
pip는 node.js의 npm 처럼, 파이썬 패키지 매니저라고 보면 됩니다.
pip = Package Installer for Python.
npm = Node Package Manager.
초보자는 이렇게 기억하면 쉬울듯 합니다만... 엄격함을 꼬치꼬치 따지기 좋아하는 개발자들은 npm이 Node Package Manger의 Acronym(두문자어)이 아니라고 합니다.
pm은 원래 pkgmakeinst의 줄임말로 bash utility 중 하나의 이름이었다고 합니다. 뭐 유래가 그렇답니다.
Javascript 구문 끝에 ;(세미콜론)을 붙이는 게 좋다, 아니다 같은 걸로 갑론을박 하는 사람들이 개발자들이라는 종족입니다.^^(저 같은 꼬꼬마 취미러들은 그냥 잘 돌아가게만 하면 되는거죠. 뭐.)
아무튼 pip를 이용해서 qrcode 모듈을 설치해주도록 합니다.
qrcode 모듈이 설치되고 잠시 후, import의 에러표시도 사라졌습니다. 성공!
파이썬 코드를 두 줄 더 쳐 넣어줍니다. 예제를 보니 대충 저렇게 사용해주기만 하면 되는군요.
### QR 코드 생성기
import qrcode
myQR = qrcode.make("https://naver.com")
myQR.save("D:/QR_Generaged/filename_temp01.png")
qrcode 모듈의 make() 메서드를 이용해서 네이버URL을 myQR이라는 변수에 담았습니다.
그리고 생성된 myQR 객체의 save() 메서드를 이용해서 D드라이브 경로에 filename_temp01.png 라는 이름으로 저장을 하도록 했습니다.
파이썬 코드 실행하기(F5)
파이썬 코드 실행을 위해서 VSC에서 F5키를 누릅니다.(디버깅)
엇.. 디버그 설정용으로 뭘 골라줘야 하는군요. Python File을 선택해줍니다.
뭔진 몰라도 터미널 창에서 챠라라락~ 동작하며 디버깅이 진행됩니다.
그리고, 저장 경로를 살펴보면 이렇게 QR코드가 이미지로 생성되었습니다. 오~ 완전 신기합니다.
능력자 분들이 만들어 놓은 모듈(라이브러리) 가져다가 활용할 줄만 알면 되는 거군요!
생성된 QR코드를 검증해보기 위해, 휴대폰 카메라로 어디 한번 스캐닝을 해도록 합시다.
잘 되는 것 같습니다. 파이썬 코드 몇 줄로 매우 간단하게 QR을 생성하고, 이미지 파일로 저장을 할 수가 있는 세상에 살고 있습니다. 간단하게 QR을 만들어서 사용하기 위해서라면, 지금까지의 내용 만으로도 충분할 것 같습니다.
QR 코드 생성 활용 - 고급편(Further Study)
QR을 조금 더 정밀하게 제어하고 싶다면? 아래 원문 매뉴얼을 참고하면 되시겠습니다.
https://pypi.org/project/qrcode/
저는 QR을 좀 더 디테일하게 생성해야 할 것 같은 미래를 대비해서, 요약을 좀 해 놓습니다.
import qrcode
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data('Some data')
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
version : 1~40 까지. QR의 size 결정.
예) version 1 = 21 x 21 cell, version 40 = 177 x 177 cell
※ 저장할 데이터가 많은 경우 version을 올려야 겠죠?
아래 코드는 오류복원 레벨에 관련된 내용입니다. QR 코드가 가려지거나, 지워지거나 손상되었을 때도 스캐닝이 가능한 수준을 결정하는 레벨이라 보면됩니다. 너무 내용이 깊어지니 패쓰.
error_correction=qrcode.constants.ERROR_CORRECT_L
'''
ERROR_CORRECT_L
- 7%의 오류 복원 능력을 보유 Low
- QR코드가 손상되지 않는 환경에 적합. 예, 인쇄물?
ERROR_CORRECT_M
- 15%의 오류 복원 능력을 보유. Midium
ERROR_CORRECT_Q
- 25%의 오류 복원 능력을 보유. Qualified?
ERROR_CORRECT_H
- 30%의 오류 복원 능력을 보유. High
- QR코드 위에 이미지나 로고를 얹거나, QR코드가 손상되는 환경에서 사용.
'''
QR 코드 이미지의 크기를 바꾸고 싶다면, box_size 설정을 만져주면 되겠습니다.
box_size=10,
'''
1cell의 한변의 크기.
1이면 QR코드 점 한 개가 1px
10이면 QR코드 점 한 개가 10px
'''
border=4,
'''
border는 테두리의 여백
'''
이 정도면 대략, QR을 이리저리 설정을 바꿔가면서 자유자재로 활용할 수 있을 것 같습니다.
저는 나중에 실무에서 써먹기 위해 아래와 같이 코드를 정리해두었습니다.(개발자도 아닌 내가... 왜... 자꾸만... 이런걸)
import qrcode
## 간단 TEST용
# myQR = qrcode.make("https://naver.com")
# myQR.save("D:/QR_Generaged/filename_temp01.png")
qrText = "https://naver.com"
qr = qrcode.QRCode(
version=4,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10,
border=4,
)
qr.add_data(qrText)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save("D:/QR_Generaged/temp01.png")
사실, 많은 포털 사이트들에서도 무료로 QR 코드를 생성할 수 있는 서비스를 제공해주고 있습니다.
Adobe 웹사이트에서도 아주 간단하게 QR 코드를 생성하고 활용할 수 있습니다.
https://express.adobe.com/ko-KR/tools/qr-code-generator
일반적인 사용의 경우라면 이런 온라인 서비스를 이용하는 것도 좋은 대안이 될 것입니다.
마치며
이번에 굳이 Python으로 QR코드를 제너레이팅 해보려는 이유는... 업무상 QR코드를 1000개 이상 만들어야 하기 때문입니다. ㅡ,.ㅡ; 게다가 파라미터를 담아서 생성할 예정인데, 뭐라도 하나 수정사항이 발생하는 경우를 예상한다면 1000번씩 만드는 작업을 매번 반복해야 합니다.
인턴에게 업무로 주면 아~주 쉽게 해결될 수도 있는 일이지만, 인턴이 무슨 죄입니까..?
대학까지 공부시킨 남의집 귀한 아들 딸들에게 이런 하찮은 반복업무를 시킬수는 없는거죠.
(나중에 우리집 얼라들이 그런 대접 받는다 생각하면... ㅎㄷㄷ)
단순 반복적인 컴퓨터를 시키는 것이 현명할 것입니다.
블로그 앞 부분에서 수차례 다뤘던 '반복문'을 사용한다면 어째, 이번 태스크가 쉽게 풀리지 않을까요?
그래서 파이썬으로 코딩해서 이미지로 저장해보자는 생각을 하게 되었고, 코딩으로 풀어보고 있습니다.
한편, Javascript QR 라이브러리도 있던데, 브라우저 화면 안에서 생성하는 방식이더군요. 이미지 저장을 위해서는 파일핸들링 부분을 추가 작성해야 할 것 같아서, 이번에는 파이썬으로 간단하게 해보고 있습니다.
1000 여 개의 데이터들은 분명히 엑셀 파일 같은것으로 넘어올테니, 그 값들을 배열이나, 객체에 담아서 사용하면 되지 않을까 예상합니다. 쉽게 풀릴 것 같은 생각에 벌써부터 두근댑니다. 결과는 추후에 정리해보겠습니다.
오늘도 즐거운 코딩, 즐코딩.
KINcoding.
댓글