2020年8月21日金曜日

Ruby で QR コードを生成してみる

概要

Ruby で QR コードを作成できる rqrcode を使ってみました
簡単な使い方を紹介したいと思います

環境

  • macOS 10.15.6
  • Ruby 2.7.1p83
    • rmagick 4.1.2
  • imagemagick 7.0.10

rqrcode インストール

  • bundle init
  • vim Gemfile
gem "rqrcode"
gem "rmagick"
  • bundle config path vendor
  • bundle install

また今回は ImageMagick を使って svg ファイルを画像ファイルにするので ImageMagick 自体のインストールができていない場合はインストールしましょう

  • brew install imagemagick

文字列として作成

そもそも QR コードは英数字や漢字などの文字列をあるルールに則って小さなコードに変換する技術です
コードはパターンに沿って 2 値で表現されるのでコンソールなどに表示することも可能です

require 'rqrcode'

qr = RQRCode::QRCode.new('http://github.com')
result = ''

qr.qrcode.modules.each do |row|
  row.each do |col|
    result << (col ? 'X' : 'O')
  end

  result << "\n"
end

puts result

svg として作成

次に画像として保存してみます
svg ファイルをそのまま保存する方法と svg ファイルの情報から png 形式保存する方法を紹介します

require 'rqrcode'
require 'RMagick'

qrcode = RQRCode::QRCode.new("http://github.com/")

svg = qrcode.as_svg(
  offset: 0,
  color: '000',
  shape_rendering: 'crispEdges',
  module_size: 6,
  standalone: true
)

File.open("qr.svg", mode = "w"){|f|
  f.write(svg)
}

img = Magick::Image.from_blob(svg) {
  self.format = 'SVG'
  self.background_color = 'transparent'
}
img[0].write "qr.png"

これで svg ファイルと png ファイルが作成されています

png イメージとして作成

先程は imagemagick を使って svg から png ファイルを作成しました
rqrcode 自体にも png 形式のバイナルデータを作成する方法があるのでそれを使っても OK です

require 'rqrcode'

qrcode = RQRCode::QRCode.new("http://github.com/")

png = qrcode.as_png(
  bit_depth: 1,
  border_modules: 4,
  color_mode: ChunkyPNG::COLOR_GRAYSCALE,
  color: 'black',
  file: nil,
  fill: 'white',
  module_px_size: 6,
  resize_exactly_to: false,
  resize_gte_to: false,
  size: 120
)

IO.binwrite("qr.png", png.to_s)

ansi カラーコードとして作成

コンソールに出力する用です
先程は単純なバイト文字でしたがカラーコードで出力できるのでターミナルでも見やすくなります

require 'rqrcode'

qrcode = RQRCode::QRCode.new("http://github.com/")

svg = qrcode.as_ansi(
  light: "\033[47m", dark: "\033[40m",
  fill_character: '  ',
  quiet_zone_size: 4
)

print svg

ruby の場合 print を使うと自動的にカラーコードを展開してくれます

その他オプション

qrcode = RQRCode::QRCode.new("http://github.com/", size: 4)
  • size・・・QR コードの大きさを指定できます、数が大きいほどコードも大きくなります
  • level・・・「l」「m」「q」「h」が指定できます、コードが汚れて見えない部分が多くなっても補完できるレベルを指定します、h がより補完できますがコードが複雑になります

最後に

Ruby で QR コードを生成してみました
プログラマブルに QR コードを生成するようなサービスを作りたい場合に使えるかなと思います

0 件のコメント:

コメントを投稿