LoginSignup
27
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-07

中古の二次元バーコードリーダ(AT10Q-SM)を購入したので、バーコード生成方法について調べてみました。
Rubyで1次元バーコードや2次元バーコード(QRコード)を生成する方法を説明します。今回はbarbyライブラリを利用してバーコードを生成します。

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

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

環境

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

  • Ruby 2.3.1
  • barby 0.6.4
  • rqrcode 0.10.1
  • chunky_png 1.3.7
Gemfile
source "https://rubygems.org"
gem 'barby'
gem 'rqrcode'
gem 'chunky_png'

二次元バーコード(QRコード)

いわゆるQRコードを生成します。PNGとbase64で出力します。
パラメータとして指定するsize(バージョン)とlevel(誤り訂正レベル)はQRコードとは?に詳しく記載されています。

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

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

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で一次元バーコードを生成します。

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

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

参考

27
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
26