一次元/二次元バーコードを生成する for Ruby

中古の二次元バーコードリーダ（[AT10Q-SM](https://www.denso-wave.com/ja/adcd/product/qrcode/scanner/at10q-at10q-sb.html)）を購入したので、バーコード生成方法について調べてみました。
Rubyで1次元バーコードや2次元バーコード（QRコード）を生成する方法を説明します。今回は[barby](https://rubygems.org/gems/barby)ライブラリを利用してバーコードを生成します。

下記のデモアプリの作成のためにいろいろ調べた結果を残します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">QRコードにルータのコマンドを埋め込み、2次元バーコードリーダーで読み取るとこで、コマンドの実行を素早く正確にできるようになった‼️ <a href="https://t.co/lFlKjcNX77">pic.twitter.com/lFlKjcNX77</a></p>&mdash; kooshin (@kooshin) <a href="https://twitter.com/kooshin/status/795243905209876480">2016年11月6日</a></blockquote>





今回は文字列を埋め込める二次元バーコード（QRコード）と一次元バーコード（code128）を生成する方法について例示します。

## 環境

環境とライブラリは下記のとおりです。

* Ruby 2.3.1
* barby 0.6.4
* rqrcode 0.10.1
* chunky_png 1.3.7

```ruby:Gemfile
source "https://rubygems.org"
gem 'barby'
gem 'rqrcode'
gem 'chunky_png'
```

## 二次元バーコード（QRコード）

いわゆるQRコードを生成します。PNGとbase64で出力します。
パラメータとして指定するsize（バージョン）とlevel（誤り訂正レベル）は[QRコードとは？](http://www.qrcode.com/about/)に詳しく記載されています。

```ruby:qrcode.rb
require 'barby/barcode/qr_code'
require 'barby/outputter/png_outputter'

# パラメータ
content = 'show ip route' # QRコードの中身
size    = 3 # QRコードのバージョン 1〜40
level   = :m # 誤り訂正レベル, l/m/q/h
xdim    = 3  # 一番細いバーの幅

# QRコード生成
qrcode = Barby::QrCode.new(content, size: size, level: level)

# PNGで出力
png_file = 'output.png' # 出力PNGファイル名
File.open(png_file, 'wb') do |f| 
  f.write qrcode.to_png(xdim: xdim)
end

# HTMLのimgタグ用のbase64で出力
puts qrcode.to_image(xdim: xdim).to_data_url
```

### 実行結果
QRコードをPNG画像ファイルとして生成します。
![output.png](https://qiita-image-store.s3.amazonaws.com/0/12026/d2bc554b-2ea2-3569-189f-60b5fdf7f110.png)

HTML向けにbase64としても出力しています。

```txt:base64の出力結果
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrAQAAAABYxEGhAAABaUlEQVR4nMVTMWrDMBSV7IC61M5qsLEhJ8imgMHZco4eIZ46xTKdm9yg98hWQcDaegU5NmSN08WCOqq6JaGt/tT+7aHH1/vv/+foy5IOuqr/gxw7PHLEqMOYWclEHynSj0GpPwAfYUbcbtsinoBUiXqNJHgEzX57vYSaKdPcZZm0kxUekygnswKP7ORMn1UVzZuN1nbrxLBcpLivMR7sZHqI+zoXkyMByBBBzuOzkmga2sl0ss52JxqVVQPSfJdu/Ph5VtvJ053fo6LjTKR2GSR9mMvSGKIl4ESRJ4a1aMaqBQzYnlRifF7OAW686bg6GJ/P4rvX287DnoYrJZ9eAWSEXkRrfD4i124dd/co8P1wswB0zpCnKt3JYgsIrEk3CvAiORFAYL/S3XpCej9MdA0xEyHu23IGWIopanxOiz6zazZFkpVqcsIBZBO9gNHkHgM0m3TzxvfRewVYikl3hpa99CjgkP4IfgKDDKGqCDKCLwAAAABJRU5ErkJggg==
```
base64出力結果は、下記のようにHTMLのimgタグのsrc属性に指定すると、HTMLに画像を埋め込むことができます。

```html
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrAQAAAABYxEGhAAABaUlEQVR4nMVTMWrDMBSV7IC61M5qsLEhJ8imgMHZco4eIZ46xTKdm9yg98hWQcDaegU5NmSN08WCOqq6JaGt/tT+7aHH1/vv/+foy5IOuqr/gxw7PHLEqMOYWclEHynSj0GpPwAfYUbcbtsinoBUiXqNJHgEzX57vYSaKdPcZZm0kxUekygnswKP7ORMn1UVzZuN1nbrxLBcpLivMR7sZHqI+zoXkyMByBBBzuOzkmga2sl0ss52JxqVVQPSfJdu/Ph5VtvJ053fo6LjTKR2GSR9mMvSGKIl4ESRJ4a1aMaqBQzYnlRifF7OAW686bg6GJ/P4rvX287DnoYrJZ9eAWSEXkRrfD4i124dd/co8P1wswB0zpCnKt3JYgsIrEk3CvAiORFAYL/S3XpCej9MdA0xEyHu23IGWIopanxOiz6zazZFkpVqcsIBZBO9gNHkHgM0m3TzxvfRewVYikl3hpa99CjgkP4IfgKDDKGqCDKCLwAAAABJRU5ErkJggg==" />
```

## 一次元バーコード
code128Bで一次元バーコードを生成します。

```ruby:code128.rb
require 'barby/barcode/code_128'
require 'barby/outputter/png_outputter'

# パラメータ
content = 'show ip route' # QRコードの中身
xdim    = 3  # 一番細いバーの幅
           
code128 = Barby::Code128B.new(content)
           
# PNGで出力
png_file = 'code128.png' # 出力PNGファイル名
File.open(png_file, 'wb') do |f|
  f.write code128.to_png(xdim: xdim)
end 
    
# HTMLのimgタグ用のbase64で出力
puts code128.to_image(xdim: xdim).to_data_url
```

### 実行結果
一次元バーコードがPNG画像ファイルで生成されます。code128B形式の場合、数字以外に英文字も入力できます。
![code128.png](https://qiita-image-store.s3.amazonaws.com/0/12026/1b6e7e27-54d5-bc42-c48e-5db88649dee0.png)

```txt:base64の出力結果
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAioAAAB4AQAAAAD0kuTLAAAAv0lEQVR4nO3PwQ2CQBQE0P+RxD2BBUDcNjhBSUoBbtYC0JKWE21goADhtCaYb7YFwwHjzG0yyUsmkjXiIlolYMB8x7TjTKNV4/zSUpBVOVe5UfFUaVH6VvGhfZiwck2cFu+wcm4KfQ81vhLX7fZOgQEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAHzg0yZJZQZnyX7njsyfhA3WL+krmffn508y6MNqzQkU7cLqwy260+hLheSptzeKTB/xXwA+KOEbO4XACgAAAAASUVORK5CYII=
```


## 参考
* [バーコードのしくみ](http://www.keyence.co.jp/barcode/special/codereader/lecture/basic/mechanism/)
* [QRコードとは？](http://www.qrcode.com/about/)
* [CODE128とGS1-128](http://www.keyence.co.jp/barcode/special/codereader/lecture/basic/code128/)

* [github - toretore/barby](https://github.com/toretore/barby)
* [Rubyで簡単にQRコード画像を生成する方法](http://qiita.com/ryosy383/items/c753103c93fa177e4466) 
* [Ruby ( Rails ) で 文字を追加した QR コードを簡単に生成する方法](http://qiita.com/yutackall/items/d68c8c95aa7aa0a3b542)