中古の二次元バーコードリーダ(AT10Q-SM)を購入したので、バーコード生成方法について調べてみました。
Rubyで1次元バーコードや2次元バーコード(QRコード)を生成する方法を説明します。今回はbarbyライブラリを利用してバーコードを生成します。
下記のデモアプリの作成のためにいろいろ調べた結果を残します。
QRコードにルータのコマンドを埋め込み、2次元バーコードリーダーで読み取るとこで、コマンドの実行を素早く正確にできるようになった‼️ pic.twitter.com/lFlKjcNX77
— kooshin (@kooshin) 2016年11月6日
今回は文字列を埋め込める二次元バーコード(QRコード)と一次元バーコード(code128)を生成する方法について例示します。
環境
環境とライブラリは下記のとおりです。
- Ruby 2.3.1
- barby 0.6.4
- rqrcode 0.10.1
- chunky_png 1.3.7
source "https://rubygems.org"
gem 'barby'
gem 'rqrcode'
gem 'chunky_png'
二次元バーコード(QRコード)
いわゆるQRコードを生成します。PNGとbase64で出力します。
パラメータとして指定するsize(バージョン)とlevel(誤り訂正レベル)はQRコードとは?に詳しく記載されています。
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
実行結果
HTML向けにbase64としても出力しています。
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrAQAAAABYxEGhAAABaUlEQVR4nMVTMWrDMBSV7IC61M5qsLEhJ8imgMHZco4eIZ46xTKdm9yg98hWQcDaegU5NmSN08WCOqq6JaGt/tT+7aHH1/vv/+foy5IOuqr/gxw7PHLEqMOYWclEHynSj0GpPwAfYUbcbtsinoBUiXqNJHgEzX57vYSaKdPcZZm0kxUekygnswKP7ORMn1UVzZuN1nbrxLBcpLivMR7sZHqI+zoXkyMByBBBzuOzkmga2sl0ss52JxqVVQPSfJdu/Ph5VtvJ053fo6LjTKR2GSR9mMvSGKIl4ESRJ4a1aMaqBQzYnlRifF7OAW686bg6GJ/P4rvX287DnoYrJZ9eAWSEXkRrfD4i124dd/co8P1wswB0zpCnKt3JYgsIrEk3CvAiORFAYL/S3XpCej9MdA0xEyHu23IGWIopanxOiz6zazZFkpVqcsIBZBO9gNHkHgM0m3TzxvfRewVYikl3hpa99CjgkP4IfgKDDKGqCDKCLwAAAABJRU5ErkJggg==
base64出力結果は、下記のようにHTMLのimgタグのsrc属性に指定すると、HTMLに画像を埋め込むことができます。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrAQAAAABYxEGhAAABaUlEQVR4nMVTMWrDMBSV7IC61M5qsLEhJ8imgMHZco4eIZ46xTKdm9yg98hWQcDaegU5NmSN08WCOqq6JaGt/tT+7aHH1/vv/+foy5IOuqr/gxw7PHLEqMOYWclEHynSj0GpPwAfYUbcbtsinoBUiXqNJHgEzX57vYSaKdPcZZm0kxUekygnswKP7ORMn1UVzZuN1nbrxLBcpLivMR7sZHqI+zoXkyMByBBBzuOzkmga2sl0ss52JxqVVQPSfJdu/Ph5VtvJ053fo6LjTKR2GSR9mMvSGKIl4ESRJ4a1aMaqBQzYnlRifF7OAW686bg6GJ/P4rvX287DnoYrJZ9eAWSEXkRrfD4i124dd/co8P1wswB0zpCnKt3JYgsIrEk3CvAiORFAYL/S3XpCej9MdA0xEyHu23IGWIopanxOiz6zazZFkpVqcsIBZBO9gNHkHgM0m3TzxvfRewVYikl3hpa99CjgkP4IfgKDDKGqCDKCLwAAAABJRU5ErkJggg==" />
一次元バーコード
code128Bで一次元バーコードを生成します。
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形式の場合、数字以外に英文字も入力できます。
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAioAAAB4AQAAAAD0kuTLAAAAv0lEQVR4nO3PwQ2CQBQE0P+RxD2BBUDcNjhBSUoBbtYC0JKWE21goADhtCaYb7YFwwHjzG0yyUsmkjXiIlolYMB8x7TjTKNV4/zSUpBVOVe5UfFUaVH6VvGhfZiwck2cFu+wcm4KfQ81vhLX7fZOgQEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAHzg0yZJZQZnyX7njsyfhA3WL+krmffn508y6MNqzQkU7cLqwy260+hLheSptzeKTB/xXwA+KOEbO4XACgAAAAASUVORK5CYII=