2008년 10월 20일 월요일

QR Code(2차원 바코드) 생성하고 읽어보기

회사일로 2차원 바코드에 대해서 이것저것 점검해 보다가 마침 블로그 포스팅도 뜸하고 해서 정리도 할 겸 글을 써봅니다.

QR Code 에 대한 자세한 내용은 http://en.wikipedia.org/wiki/QR_Code 를 참고하시고, QR Code 란 흔히 말하는 2차원 바코드입니다.

일본에서는 여기저기 잘 활용되고 있고, 구글에서도 AdSense 에 적용해서 신문광고에 써먹는 모양입니다만 우리나라에서는 아직까지는 '말아먹은' 상태입니다.

JISC- Japanese Industrial Standards Committee 에 가셔서 JIS-X-0510 의 spec을 찾아볼 수도 있습니다.


아무튼 이 QR Code 는

Numeric Only : Max 7,089 characters
Alphanumeric : Max 4,296 characters
Binary(8bit) : Max 2,953 characters

만큼의 데이터를 담을 수 있어 일반적인 바코드보다 데이터 저장 용량이 크고 왜곡에 대해서도 강한 특징이 있습니다.


우선 서버에서 1) QR Code를 생성할 수 있어야 하고,  2) 사용자가 업로드한 QR Code 이미지로부터 데이터를 추출할 수 있어야 합니다.

About 2D Code QR Code.com 이 링크를 통해 들어가면 QR 저작툴 두개를 다운로드 받을 수 있는데 Trial 이니 Pro 니 하는걸로 봐서 돈주고 사야하는듯 하고 라이브러리가 아닌 사용자용 제품인 관계로 패스~

뒤지다 보니 http://qrcode.kaywa.com/ 라는 사이트에서 입력값으로 QR Code 이미지를 출력해줍니다. 가입절치 등도 없고 단순히  QR Code 의 이미지 사이즈를 선택하고(S/M/L/XL) URL/Text/Phone Number/SMS 중 하나를 선택한 다음 Generate! 를 누르면 QR Code 이미지가 생성됩니다.

아래의 QR Code 는

RSS URL : http://www.potatosoft.com/tt/rss

라는 문구를 입력하여 만든 QR Code입니다.

qrcode

permlink 를 제공해 주길래 봤더니

http://qrcode.kaywa.com/img.php?s=8&d=Hello%20World

이런 식이네요. 앞으로 QR code 만들때 유용하게 써먹을 수 있을 것 같습니다. ( 그나저나 iPhone 은 언제나와 ㅜ.ㅜ )

몇몇 국내 보급된 휴대폰이 이 QR Code 를 읽을 수 있는 듯 하지만 국내 보급률이 그렇게 높지 않아서 아마 갖고 계신 분이 거의 없을테고, 혹시라도 iPhone 을 쓰시는 분이라면 iMatrix 같은 것들이 나와있기 때문에 곧바로 메세지를 읽어보실 수 있겠군요. ( iPod Touch 는 카메라가 없어서 /애도 )


어쨌든 이미지를 만들었기 때문에 이걸 읽어봐야 할텐데... -_-;; NTT Docomo 에서 QR Factory (http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/tool/) 라는 QR Code 저작툴을 제공합니다만, 영어/일본어 윈도우만 지원을 하기 때문에 한국어 윈도우를 쓰신다면 설치가 불가능합니다. 그리고 역시 클라이언트 용도이기 때문에 패스~

image

.NET 용의 라이브러리를 찾을 수 있었지만 회사에서는 주로 C/Java 를 쓰는 관계로 계속 검색을 하다 보니 http://qrcode.sourceforge.jp/ 이런게 있군요.

"Hello World" 라는 내용으로 QR Code 를 만들어 이미지를 저장하고

qrcode

다운로드받은 java 용 qrcode 예제 중 CUIExample 을 돌려서 읽어봤습니다.

[freesoft@localhost qrcode]$ java -classpath classes example.QRCodeDecoderCUIExample ./qrcode.png
Hello World
[Success] ./qrcode.png
Processed 1 images in 283ms (283 images/sec)
OK: 1 NG: 0

뭐 나름대로 괜찮군요. 하지만 이 오픈소스 라이브러리는 좀 길거나 복잡한 내용이 들어가거나, "안녕하세요? 제 RSS 주소는 http://www.potatosoft.com/tt/rss 입니다" 와 같은 식으로 입력해서 만든 QR Code 는 읽어들이지 못하는데.. 일단 생성시에 오류는 발생하지 않으니 Reader쪽에 문제가 있다고 보는게 맞을 것 같네요.

구글에서 AdSense 에 QR Code 를 적용하니 어쩌니 하는 기사를 봤던 것 같아서 뒤져보니 Google에서 Chart API 의 한 형태로 QR Code를 만들 수 있는 기능을 제공해줍니다.  럭키~

기존의 바코드와 QRCode  를 모두 읽을 수 있는 java 오픈소스 ZXing 도 제공해주는군요. (http://code.google.com/p/zxing/)

... 모든 걸 원점에서 다시 시작해봅니다.


Google Chart API 로 "My RSS URL is http://www.potatosoft.com/tt/rss" 를 QR Code 로 만들어 봤습니다.

입력은

http://chart.apis.google.com/chart?cht=qr&chl=My%20RSS%20URL%20is%20http://www.potatosoft.com/tt/rss&chld=H|2&chs=144

이런식으로 하면 되구요 EC Level 을 H 로, 차트 사이즈는 144pixel 로 설정했습니다.

보이기는 이런 식으로 보이게 되지요.

ZXing 은 android / j2se / j2me 등 다양한 환경의 코드를 제공해주는데 우선 core 라는 공통 라이브러리를 컴파일해야 하고, 이를 위해서는 WTK를 설치해야 합니다. ( 공통이면 모바일이든 웹이든 상관없이 돌아가 줘야 하는거 같은데 WTK에 의존한다는게 좀 -_-;; )

qrcode.sourceforge.jp 는 간단한 QR Code 만 가능했지만, 구글이 제공하는 chart api 로 QR Code 를 만들었으니 당연히 구글에서 제공하는 것으로 디코딩도 되리라는 믿음으로 WTK 를 설치하고 Eclipse 에서 core 를 컴파일 한 다음(build.xml 에 WTK-home 경로 지정), j2se 쪽 gui runner 를 실행시키기 위해 core.jar 를 library build 에 추가하고 실행해봅니다.

Google Chart API로 만든 QRCode 이미지를 파일로 저장한 다음 ZXing 에서 해당 파일을 읽어보니

image

깔끔하게 디코딩이 자~ㄹ 됩니다. QR Code 만들기 위해 상용 패키지 사서 쓰지 않아도 되겠군요. 우왕국~

깔끔한 이미지는 잘 읽는데, 그럼 실제 사용자들이 찍어 올리는 QR Code는 어느정도 인식을 할지 궁금해져서 테스트를 해봤습니다.

QR Code가 가장 널리 쓰이는 곳이 아무래도 일본이다 보니 이미지 대부분이 일본쪽 것들이군요.

image

실패 -_-;; 이런 건 인식 못하는군요. 옆에 이미지를 잘라내고 깔끔하게 만들어서 먹여줘봤습니다.

image

역시 실패 -_-;


웹검색을 하다 보니 이런 이미지도 있더군요. 그냥 해보면 당연히 에러가 나겠지 라는 새각으로 가운데 부분만 잘라서 인식시켜 보았습니다.

image

우왕 성공~!!  어떻게든 QR Code 의 흰색과 검은색만이 보이도록 사진을 찍어야 하는군요.

... 라고 생각하다가 이미지 패턴인식 형태이기 때문에 색깔이 문제가 아닐수도 있겠다 싶어 원본 이미지를 그대로 인식시켜 보았습니다.

image

우왕 -_-;; 이런것도 인식되는군요.


간단한 테스트였지만 이걸 만약에 사진을 찍어서 MMS로 전송한 다음 뭔가의 내용을 서버에서 처리하여 다시 사용자에게 SMS로 보내준다든지 하면 인식률 때문에 사용자들이 서비스를 쓰지 않을 것 같고, 사용자의 단말기에 QR Code 리더가 붙어있어야만 서비스가 활성화 될 가능성이 높아 보입니다. 그것도 별도의 리더를 붙인다든가 하는 게 아니라 휴대폰 카메라로 찍으면 바로 인식되는 형태의 built-in 으로 제공되어야 할 것 같군요.

Android 를 적용한 구글폰이나 iPhone 을 언제까지나 기다릴 순 없고.. -_-;;

QR Code 의 주요 활용 방안 중 하나라고 한다면 리더기로 해당 QR Code를 읽으면 곧바로 단말기가 무선인터넷 접속을 해서 관련 정보를 읽는 등의 용도로 쓰일 수 있는데(쿠폰을 바로 받는다든지), 국내의 이통사 3사에서는 아직까지 무선인터넷 요금을 내리실 생각이 별로 없기 때문에 향후로도 QR Code 가 활성화될 가능성은 거~의 없다고 봐도 되겠습니다.

국내 이통사에서도 KTF의 핫코드, SKT의 네이트코드, LGT의 이지코드 ( 그나마 KTF가 이름 짓는데 좀 창의적이고, SKT는 주로 NATE OOO, LGT는 이지OOO 이런 식 ) 를 이미 시범서비스중인 것으로 알고 있습니다만 이런저런 문제로 상용화는 이루어지지 않고 있다고 합니다. ( http://www.dt.co.kr/contents.html?article_no=2008081402012060745001 )

뭐 그 이유는 위에서 이야기한대로 QR Code를 읽을 수 있는 단말기의 부재와 더불어 요금문제가 가장 크게 다가올 것 같군요.


그나마 현재로써 가장 가능성이 있는건 LGT의 OZ 서비스일텐데... QR Code 무제한 요금제 같은거 도입하고 단말기에 리더 집어넣어서 활성화 시켜 볼 생각은 없으신가요?

특히 최근의 한우/멜라민 득 각종 식품파동과 관련해서 대형마트와 공조해서 차별화된 서비스를 내어놓아도 좋을 듯 합니다만...

이건 뭐 관련 서비스를 만들어봐야 리더기 보급이 되어있지 않으니 말짱 헛일이군요 쯥~

댓글 25개:

  1. 정말 반갑습니다. 이제까지 QRCode에 관한 국내사이트를 찾아다녔지만 여기가 제일 상세하고 실전적이군요.

    저는 사무실에서 사용하고자 하다가 QRCode에 관심을 가지게 되었습니다. Code39를 쓸까 했는데 너무 바코드가 길어서 서류에 추가하기가 쉽지않더군요.

    시도하는 것은 해당거래처에 싸인을 받을 인수인계증(여기에는 업체코드등의 정보가 바코드와 일반 문자로 인쇄됨)을 싸인을 받고 서류를 스캔해서 서버에 보관할때. 기존에는 스캔한 파일을 하나하나 확인해서 서버의 해당코드업체에 등록해야 하지만. 만약 바코드를 응용하면 스캔한 파일을 디코더와 연계된 프로그램으로 자동으로 파일등록이 가능하겠죠.

    문제는 제가 java가 아직초보라서 우울한딱다구리님 같이 쉽게 sourceforge의 파일을 사용할 수 없겠더군요. 윈도우기반 자바개발자를 위해서 CUIExample 부분을 다운에서 컴파일 까지 그 과정을 상세하게 알 수 있을까요?

    답글삭제
  2. @6년근홍삼 - 2008/10/22 11:16
    CUIExample 은 qcode.sourceforge.jp 쪽으로부터 다운로드 받았는데 제가 잘 못해서 그런지 이놈은 간단한 것만 인식하고 복잡한 것은 인식하질 못합니다.

    빌드 자체는 안에 빌드를 위한 bash 스크립츠 및 Makefile이 있기 때문에 유닉스/리눅스 혹은 윈도우상에서 cygwin 같은걸 설치해서 빌드시켜보실 수 있을겁니다.



    후자에 실행시킨 것은 google code에서 다운로드받은 zxing 입니다.

    이건 받아보시면 알겠지만 WTK가 필요한데, WTK는 sun 사이트에 가서 받으실 수 있습니다.

    빌드 요령은

    1. WTK 설치

    2. 윈도우 또는 이클립스에서 zxing 의 core 부분을 빌드(이때 WTK 설치 경로를 설정해줘야 합니다. 자세한 내용은 build.xml 내부 참고 )

    3. 2에서 만들어진 core.jar 를 각 플랫폼별(j2se, j2me, android 등등... ) 빌드시에 라이브러리로 추가 및 ANT 로 빌드

    (제가 쓴 것은 j2se 용입니다)



    java에 아직 익숙치 않으시면 당장은 컴파일을 위해서는 ANT가 필요합니다. 좀 더 편하게 하려면 Eclipse 를 쓰시는걸 추천드리고 싶습니다. 관련솔루션 개발이 아니라 활용이 목적이시라면 더존 C&T(http://www.duzoncnt.com/) 와 같은 몇몇 곳에서 이미 상용의 솔루션들을 판매하고 있으니 고려해보시는것도 좋을 듯 합니다.

    답글삭제
  3. 최근 모바일 사이트를 만들어주는 곳의 설정란에서 QR Code 라는것을 보고 이게 뭔가해서 찾아봤는데 이런 용도였군요. 국내에도 도입되면 편할것같네요^^

    답글삭제
  4. 우울한딱따구리2008년 10월 27일 오후 5:21

    @Song4U - 2008/10/27 23:04
    무선인터넷 완전개방과 데이터 통화료가 현실적인 수준으로 내려가야 가능하지 않을까 싶습니다.



    일본에서는 이미 많은 곳에서 사용되고 있고, 국내에서도 몇몇 대학과 고지서 등에는 도입되어 있는걸로 알고 있습니다. :)

    답글삭제
  5. 버거킹에서 햄버거 먹으면서 덧글 달아여 즐거운 하루 보내요 ㅎㅎ

    답글삭제
  6. 우울한딱따구리2008년 11월 2일 오후 4:26

    @냐모 - 2008/10/31 19:30
    저도 iPod Touch 사고싶은데 ㅜ.ㅜ

    환율이 슬슬 내려가니 조만간 2세대 구입이 가능할지도요 ㅋㅋ

    (textcube for iPhone 기능 꺼버릴까 -_-;;;)

    답글삭제
  7. 바코드에 대한자료를 찾다가 들렀습니다 상세한 자료 감사드립니다

    답글삭제
  8. @shostakovich - 2008/11/28 12:33
    조금이라도 도움이 되셨길 바랍니다. :)

    답글삭제
  9. 좋은 글 감사합니다. 많은 도움이 되었습니다.



    추가로 문의 할 사항이 있어 글 드립니다.

    혹시 QR code 내에 한글을 입력하고 리더기로 읽기가 가능한지요?

    dBarcode라는 제품의 트라이얼 버젼으로 테스트 결과 영,숫자는 가능한데 한글은 안되더군요

    말씀하신 http://qrcode.kaywa.com/ site에서도 입력한 문장중 영,숫자믄 가능하나 한글을 리더기가 인식하지 못했습니다.

    혹시 아시는 내용 있으면 답변 부탁드립니다.



    만일 한글 입/출력이 가능하다면 vb로 제작하여 직접 QR code를 인쇄하고 싶은데 가능한 콤포넌트를 제공하는 회사를 알려 주실순 없으신지요(유료도 관계없습니다)



    두서없는 질문 죄송합니다.

    답글삭제
  10. @마징가 - 2008/12/02 17:29
    Google Chart API 를 이용하실 수 있다면 본문에 소개드린 것처럼 char api 중 2d barcode 생성코드를 이용해서 한글을 입력하고 그 결과를 ZXing 으로 인식할 수 있습니다.



    http://chart.apis.google.com/chart?cht=qr&chl=%EB%A7%8C%EB%82%98%EC%84%9C+%EB%B0%98%EA%B0%91%EC%8A%B5%EB%8B%88%EB%8B%A4&chs=144&choe=utf-8



    위의 URL 호출은 "만나서 반갑습니다" 라는 걸 utf-8로 넘긴 결과인데요.. 생성되는 이미지를 저장해서 ZXing 에서 인식시켜보면 결과가 제대로 인식됩니다. 생성된 이미지를 저장해서 출력하셔도 될 것 같구요... VB연동이시면 http 관련 컴포넌트나 소켓질(?)로 구글 api를 호출하고 결과물을 받아서 이미지로 저장하셔도 되겠네요.



    솔루션을 원하신다면 더존C&T(http://www.duzoncnt.com/) 에 각종 s/w 및 h/w 제품군들이 있으니 금전적인 여유가 있으시다면 그쪽을 고려해 보시는 것도 좋을 것 같습니다.

    답글삭제
  11. 안녕하세요. 박정환이라고 합니다.







    NATECode, HotCode, ezCode 사업을 전개하고 있는 회사에서 바코드 인식 관련 기술을 총괄하고 있습니다.



    위 세 서비스가 그다지 단말 보급률이 높다고 말하기엔 좀 그렇지만 ^^; 현재 상용화 되어서 서비스되고 있습니다. (따라서 위의 디지털타임즈 기자도 사실과 다른 기사를 쓴 것이 사실이죠; 좀 더 확인해 보고 쓰지...ㅠㅠ)



    QR 쪽도 어느 정도 파악하고 있습니다. 업무적으로 필요하시거나, 질문하실 것이 있으시면 연락 주십시오. 뭐, 회사 업무로서 정식 진행하는 것은 사업팀을 통해야 하겠지만 개인적으로 커뮤니케이션 하는게 뭐 문제가 되겠습니까? ^^;;



    제 개인 이메일 주소는 ffee21 (골뱅이) 지메일 입니다.



    저자 분 말고도, 다른 분도 환영합니다. 제 개인적인 시간이 허락하는 한, 도움 드리겠습니다.





    감사합니다.

    답글삭제
  12. @마징가 - 2008/12/02 17:29
    안녕하세요 박정환입니다.



    우울한딱따구리 님께서 답글 다셨다시피, 캐릭터셋이 중요할 듯 합니다.



    QR 코드의 경우, Numeric, AlphaNumeric, Byte, Kanji (일본어) 등의 표준 상의 캐릭터셋을 지원합니다. 즉, 숫자로만 이루어진 코드값이나, 영문자+숫자로만 이루어진 코드값일 경우 효율 좋게 조그만 코드에 더 많은 내용을 넣을 수 있도록 (사실상의) 압축을 표준에서부터 지원한다는 뜻이지요.



    그렇지만, 한글은 그 중에 포함되어 있지 않습니다. 따라서 byte (임의의 이진수)를 이용해야 할 것이고요. 이 때 한글을 어떤 캐릭터셋을 이용해서 표현할 것이냐가 중요합니다.



    구글 & ZXing에서는 utf-8을 사용하는 것이고요. 그 외에도 euckr 등을 이용해서 넣으실 수 있겠습니다.









    저희 회사(아이콘랩, iconlab.co.kr)에서도 관련 라이브러리를 보유하고 있고요, 위에 우울한 딱따구리 님이 써 주셨듯이 더존C&T에도 보유하고 있습니다.



    더존은 아마도 QR 디코더만 따로 떼어서 라이브러리로 팔지는 않는 것으로 알고 있고요 (작은 볼륨으로는) 자세한 것은 더존 측 담당자와 상의하시면 되겠습니다.







    참고로, QR Code가 유일한 2차원 바코드는 아닙니다. ( http://en.wikipedia.org/wiki/Barcode#2D_barcodes ) DataMatrix라는 코드도 QRCode와 함께 세계 표준(ISO16022)으로 되어 있고요. (표준이라는 것이 전세계가 그 표준을 다 쓴다는 뜻이 아닙니다. 해당 방식을 따르고 싶을 때는 유료든 무료든 공개된 설명서에 따라 시스템을 만들면 그 설명서를 보고 다른 사람들이 따라 만든 시스템과 잘 동작한다는 뜻 외에는 없습니다.)



    예전에 조사했을 때는 libdmtx 라는 라이브러리가 C(?확실하진 않습니다.C++일수도 있고요..) 로 제작되어 있었던 것으로 기억합니다. (바이너리만 공개, 소스는 옛날 버전만 공개) 퍼포먼스도 괜찮았고요.





    더 궁금한 점 있으시면 연락 주세요 :)

    답글삭제
  13. @박정환 - 2009/02/25 19:50
    이메일 잘 기억해 두었다가 관련 업무 진행하게 되거나 개인적으로 도움이 필요할때 꼭 연락드리겠습니다. :)

    혹시 라이브러리 중에 Java 나 Python 라이브러리도 제공되는지요?

    답글삭제
  14. 우리나라에서 조금더 추가개발한게 Color코드이죠. 4개의 색상으로 4X4 Matrix로 4억비트정도까지 표현할수 있다고 하니...

    QRCode도 뜯어보고 했습니다만 Color코드가 사뭇 궁금해지더군요. 4진법으로 처리하여야 하나...

    제가 QRCode공부할때 이런 정보들이 많이 있었다면 별거아닌 것들에 삽질을 안했을 텐데요...

    여튼 지금이나마 자료가 많이 올라와 내심 기쁩니다.

    답글삭제
  15. 정말 좋은 내용 감사합니다ㅜㅜ

    답글삭제
  16. @하늘소날다 - 2009/03/16 09:18
    이제서야 댓글을 봤습니다. 저도 살짝 맛보기만 한거라 그닥 깊이는 없습니다만... 저도 컬러코드인가 ColorZip 인가 하는걸 봤는데 아직 그리 널리 쓰이진 않는 것 같더군요.



    기왕이면 국내기술이 널리 쓰일 수 있었으면 좋겠습니다.(라이센스비!!)

    답글삭제
  17. @철이 - 2009/04/14 21:46
    음.. 뭔진 모르겠지만 제 글이 도움이 된 것 같아 기쁘군요 ㅎㅎ

    답글삭제
  18. 제가 자바 초보라. 실례지만 초보적인 질문 하나 올릴게요.. 꼭 이 프로그램 돌려야해서요.

    BUILD FAILED

    C:\Documents and Settings\MyHome\바탕 화면\QR\JIZZ\QR\zxing\build.xml:25: The following error occurred while executing this line:

    C:\Documents and Settings\MyHome\바탕 화면\QR\JIZZ\QR\zxing\javame\build.xml:52: Please put proguard.jar in 'bin' under the WTK install directory



    Total time: 2 seconds

    에러가 나는데 이유를 모르겠네요.

    답글삭제
  19. @Edain - 2009/04/28 00:35
    WTK를 설치 또는 이미 설치되었다면 WTK에 포함되어 있는 proguard.jar 를 클래스패스에 추가하고 컴파일 해 보시기 바랍니다.

    답글삭제
  20. 좋은 정보, 잘 읽고 갑니다. ^^

    감사합니다!

    답글삭제
  21. qr코드 해석에 대해서 알아보다가 들어왔어요. 제가 대학생이라 학생증 모바일 코드가 이 코드인데 해석이 안되네요..

    폰으로 하다 보니 불편해서 코드를 직접 생성해서 프린트 해서 다니려고 합니다. 어떻게 가능할까요/

    답글삭제
  22. @신승원 - 2009/06/06 20:10
    칩이 아니고 패턴인식이기 때문에 학생증의 QR코드를 잘~ 디카 같은걸로 찍어서(크기보다는 선명함이 중요) 종이에 출력한 다음 그걸 인식기에 갖다대면 "아마" 될 겁니다.

    답글삭제
  23. 시간이 많이 지났음에도 아직도 이 포스팅보다 더 자세한 것은 없더군요.

    다들 콘텐츠 소비만 하고 생산을 안하니 당연한 건가요? ㅋ

    그나저나 직접 소스를 입력해서 코드를 만들려니 힘들군요.

    주방에서 요리만 하던 요리사가 가게 홍보를 하려고 QR코드를 만들려니 흰머리 나겠네요..

    답글삭제
  24. @평원 - 2010/07/15 03:11
    안녕하세요?

    가게 홍보를 위해서 QA코드를 만들기만 하실꺼면 제 글 중에 있는 Google Chart API를 이용해서 간단하게 QR코드를 만드실 수 있습니다. 만들어진 이미지를 저장하시면 홍보 인쇄물 등에도 넣으실 수가 있으실꺼구요.



    이쪽으로 혹시 좀 약하시면 QR코드에 넣고자 하는 문구를 알려주시면 제가 이미지 만들어서 이메일 등으로 전달하거나 해당 QR코드를 만들 수 있는 구글 URL을 알려드릴께요.

    답글삭제

가장 많이 본 글