携帯向けアプリでQRコードを生成する

RailsでのQRコードの生成方法

これは主に2つの方法がある。1つはプラグインを使用する方法、もう一つはGDを使ったライブラリを使用する方法だ。

1.プラグインを使用する

こちらはプラグインを使用する方法である。導入も簡単で、直ぐに使えるだろう。しかし、問題もある。

  • JavaScriptを使用しているため、PCでしか使えない
  • QRコードを画像でなく、tableタグとして実現するため、保存できない

参考

2.ライブラリを使用する

今回は携帯向けということで、こちらを使用する。こちらは、GDという画像を扱う為のライブラリを用いてQRコードを生成するため、携帯でも使えるし、画像として保存もできる。ただ、1の方法と比較すると、やや下準備が必要になる。

下準備のステップ
  • GDライブラリに必要なライブラリをインストールする
    • zlib:png画像を扱うために必要
    • libpng:同上
  • GDをインストールする
  • ruby-gdをインストールする:rubyからGDを扱うためのライブラリ
  • QRコードライブラリをインストールする
  • ライブラリの設定を行う
  • 表示用のコードを記述する

以下、各手順を説明していく。

一発でruby-gdとgdを入れる方法

gem install ruby-gd -- --build-flag --with-freetype --with-jpeg --enable-gd2_0

これで、GDも一緒に入れてくれるみたい。僕は最初これを知らなかったので、以下からの手順をとった(泣)--with-jpegとかは、jpegを扱うためのライブラリを入れているのだろう。pngを扱いたいなら--with-pngとなるのかな。

GDライブラリに必要なライブラリをインストールする

GDは画像を扱うライブラリだが、GD自体も画像を扱うために他のライブラリの機能を使っている。例えば、PNG画像を扱うならzlib、libpngといった具合に。よって、それらをインストールする。

  • zlib
[root@server src /]## wget http://jaist.dl.sourceforge.net/sourceforge/libpng/zlib-1.2.3.tar.gz
[root@server src]# tar xvzf ./zlib-1.2.3.tar.gz
[root@server src]# cd zlib-1.2.3
[root@server zlib-1.2.3]# ./configure
[root@server zlib-1.2.3]# make
[root@server zlib-1.2.3]# make install
  • libpng
[root@server src]#wget http://prdownloads.sourceforge.net/libpng/libpng-1.2.23.tar.bz2
[root@server src]#tar xvjf ./libpng-1.2.23.tar.bz2
[root@server src]#cd libpng-1.2.23
[root@server libpng-1.2.23]#make -f scripts/makefile.linux CC=gcc ZLIBLIB=../zlib-1.2.3 ZLIBINC=../zlib-1.2.3

GDをインストールする

  • yum(僕はこっちでやりました)
[root@server src]#yum install gd-devel
  • yumでインストールできない場合(envのconfigureのオプションが怪しい・・・)
[root@server src]#wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
[root@server src]#tar xvzf ./gd-2.0.33.tar.gz
[root@server src]#cd gd-2.0.33
[root@server gd-2.0.33]# env CPPFLAGS="-I../zlib-1.2.3 -I../libpng-1.2.8" LDFLAGS="-L../zlib-1.2.3 -L../libpng-1.2.8" ./configure 
[root@server gd-2.0.33]# make
[root@server gd-2.0.33]# make install

ruby-gdをインストールする

gem install ruby-gd --enable-gd2_0

前述した通り、僕は後から一発でruby-gdもGDもインストールする方法に気がついた。実際このステップでは、以下のコマンドでインストールした。2度手間(泣)

gem install ruby-gd -- --build-flag --with-freetype --with-jpeg --enable-gd2_0

QRコードライブラリをインストールする

以下からtarballのファイルを取得する。

参考

取得したら、qrcodeディレクトリをlib下に配置する。(lib\qrcodeとなる)

ライブラリの設定を行う

  • Qrcode#pathの設定

@pathにデータディレクトリのパスを設定します。
今回は、lib下に設置したので、以下のようになります。

class Qrcode

def initialize
    @path="#{RAILS_ROOT}/lib/qrcode/qrcode_data"

    @qrcode_error_correct="M"
    @qrcode_version=0

    @qrcode_structureappend_n=0
    @qrcode_structureappend_m=0
    @qrcode_structureappend_parity=""
    @qrcode_structureappend_originaldata=""
end
  • アプリケーションエラー対策を行なう

上記の参考にあったサイトの以下の節を参考に、対策を施す。

「アプリケーションエラーになっちゃう場合」

表示用のコードを記述する

ここまでで設定は終わります。最後にQRコードを出力するコードをアプリケーションに追加します。また、注意として、基本的にdocomopng形式が使えない。また、ruby-gdもgifを扱わないようになったので、jpegで出力します。

コントローラとして定義しておくと、imgタグから呼び出せて便利なので、コントローラとして抽出します。

  • controller/util/qrcode_controller.rb
class Util::QrcodeController < ApplicationController
  def qrcode 	
    url = params[:url]+(params[:id] ? "&id="+params[:id] : "")
    qrcode = Qrcode_image.new 
    gd = qrcode.qrcode_image_out(url,'jpeg') 
    send_data gd.jpegStr(0),:type => 'image/jpeg',:disposition => 'inline'
    gd.destroy 
  end 
end

最後に、ビューに、このアクションを呼び出すコードを追加します。
コード中のurl変数に、生成したいurlをセットします。imgタグのsrc属性を使ってアクションを呼び、その結果を表示という作戦です。

<% url = "http://test.co.jp?change=test&id=1" -%>
QRコードはこちら
<div style="text-align:center;">
<img src="/Util/Qrcode/qrcode/?url=<%= url %>" width="150" height="150" />
</div>