読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【プリパラAdventCalender】Pythonの画像処理でプリチケのQRコードを隠せるかどうか試してみた

プリパラ & プリティーリズム Advent Calendar 2015 - Adventarの3日目です。

プリチケの写真を撮ったら、自動でQRコードをかわいく隠してくれるアプリがあると便利だよねって記事です。

プリチケの写真ファイル(png形式)を指定すると、自動でQRコードを隠すプログラムを書いてみようとしました。結論から言うとうまくいきませんでしたが…。

1/13追記

kiito.hatenablog.com

動機

プリチケのカワイイ画像をSNSに投稿するとき、他人に悪用されないように、QRコードを隠す作業が必要となります。 そのため「カメラで画像を撮ったとき、QRコードを認識して、自動で可愛く隠してくれないかな」と思うことがあります。

プリチケ (ぷりちけ)とは【ピクシブ百科事典】

プリチケは上下に切り離すことが可能で、下部分の大きい方が「マイチケ」と呼ばれる。この部分のQRコードにはゲームのプレイ履歴などが記録されるので、インターネット上に写真をアップする場合は悪用を防ぐためQRコード部分を隠すのが望ましい。

その「自動でQRコードを認識して隠す」ということができないか試してみました。そうすれば、Webアプリケーションにするなりなんなりできそうなので。

実装方針

私はPythonというプログラミング言語に慣れているため、Pythonでやってみました。

環境は

  • MacOSX
  • Python 2.7.7 (Anaconda 2.0.1)
  • ライブラリはPillowとzbarを利用

主に下のサイトを参考にしました。ライブラリのインストール方法もこちらに書いてあります。

qiita.com

zbarの公式サイトはこちらです。

ZBar bar code reader - About

実装方針は、

  1. QRコードの位置を抽出
  2. そこに新しい画像(stamp.png)を合成して隠す

という方針です。

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コード」という画像検索結果を

f:id:takeshi0406:20151203030035p:plain

違反チケットで隠してみました。

f:id:takeshi0406:20151203031552p:plain

まあそれなりにうまく貼れてるのかなという感じです。

ただし、プリチケの写真ではうまく動作しませんでした。その理由は、プリチケのQRコードが特殊で、そもそもzbarで読み込めなんじゃないか…と考えています。(スマホQRコードリーダーで読み込もうとして、何も出力されなかった経験は誰にでもあると思います。)

これ以上はちょっと単純にライブラリを利用するだけでは難しそうです。煮え切らない終わり方でスミマセン。