プリパラ & プリティーリズム Advent Calendar 2015 - Adventarの3日目です。
プリチケの写真を撮ったら、自動でQRコードをかわいく隠してくれるアプリがあると便利だよねって記事です。
プリチケの写真ファイル(png形式)を指定すると、自動でQRコードを隠すプログラムを書いてみようとしました。結論から言うとうまくいきませんでしたが…。
動機
プリチケのカワイイ画像をSNSに投稿するとき、他人に悪用されないように、QRコードを隠す作業が必要となります。 そのため「カメラで画像を撮ったとき、QRコードを認識して、自動で可愛く隠してくれないかな」と思うことがあります。
プリパラで踊(ダンス)ってきた pic.twitter.com/465u6usf0W
— 黒めだか (@takeshi0406) November 22, 2015
プリチケは上下に切り離すことが可能で、下部分の大きい方が「マイチケ」と呼ばれる。この部分のQRコードにはゲームのプレイ履歴などが記録されるので、インターネット上に写真をアップする場合は悪用を防ぐためQRコード部分を隠すのが望ましい。
その「自動でQRコードを認識して隠す」ということができないか試してみました。そうすれば、Webアプリケーションにするなりなんなりできそうなので。
実装方針
私はPythonというプログラミング言語に慣れているため、Pythonでやってみました。
環境は
主に下のサイトを参考にしました。ライブラリのインストール方法もこちらに書いてあります。
zbarの公式サイトはこちらです。
実装方針は、
という方針です。
Pythonは3.*系が主流になりつつあるのですが、qrコード読み取りツールzbarと連携するためのzbarライブラリが使えなかったので。Python3系でももう少し気軽に使えるzbarlightというライブラリは使えるようなのですが、QRコードの位置を取得する機能がなさそうだったので断念しました。
import zbar import PIL.Image pritike_path = 'pritike.png' stamp_path = 'stamp.png' output_path = 'output.png' # create a reader scanner = zbar.ImageScanner() # configure the reader scanner.parse_config('enable') # obtain image data base_img = PIL.Image.open(pritike_path).convert('RGBA') # 画像合成用にカラーで読み込む pil = PIL.Image.open(pritike_path).convert('L') # qrコード解析用に白黒で読み込む (width, height) = pil.size raw = pil.tostring() stamp = Image.open(stamp_path).convert('RGBA') # pngの透過処理を認識しているらしい # wrap image data image = zbar.Image(width, height, 'Y800', raw) # scan the image for barcodes scanner.scan(image) # extract results for symbol in image: # symbol.locationでQRコードの範囲が取れる ichi = symbol.location[0] #QRコードの中央の位置 base_img.paste(stamp, ichi, stamp) # 貼り付け new_image = base_img.convert('RGB').convert('P', palette=Image.ADAPTIVE) new_image.save(output_path, "PNG") # clean up del(image)
結果
これで試しにGoogleで「QRコード」という画像検索結果を
違反チケットで隠してみました。
まあそれなりにうまく貼れてるのかなという感じです。
ただし、プリチケの写真ではうまく動作しませんでした。その理由は、プリチケのQRコードが特殊で、そもそもzbarで読み込めなんじゃないか…と考えています。(スマホのQRコードリーダーで読み込もうとして、何も出力されなかった経験は誰にでもあると思います。)
これ以上はちょっと単純にライブラリを利用するだけでは難しそうです。煮え切らない終わり方でスミマセン。