ZXing で二次元バーコードを作成した際の覚書

スタンドアローンで動作する二次元バーコード作成ソフトを探したところ、文字コードや余白やマスク処理について指定できそうな適当なものが見つかりませんでした。

探し続ければ良いものがあるのかもしれません。

しかし限られた時間中に見つけられる保証もなかったので Java で作成してしまうことに決めました。

なぜ Java なのかは — 単純に Android で用いられることから、最新の状態で整備されているバーコード作成ライブラリが簡単に見つかるような気がしたからです。




検索してみたところ、実際に ZXing Project というプロジェクトが見つかります。

今回はこのプロジェクトを こちら から zip 形式でダウンロードした後、Apache Maven を使用してビルドして使用します。

$ unzip zxing-master.zip
$ cd zxing-master
$ mvn package

私の場合はエラーを出力してビルドに失敗してしまいました。

[WARNING] Rule 4: org.apache.maven.plugins.enforcer.RequireMavenVersion failed with message:
Detected Maven Version: 3.1.1 is not in the allowed range 3.2.5.

このようなエラーメッセージが現れた場合、Maven のバージョンが合致していない事が示されていますので、該当のバージョンをインストールしてやると大体はうまくいきます。

うまくビルドに成功した場合、 core ディレクトリ直下に tagert ディレクトリが作成されます。

使用したいのはその中にある core-3.3.1-SNAPSHOT.jar というファイルです。

パスで示すと次のような具合になります。

zxing-master/core/target/core-3.3.1-SNAPSHOT.jar

この jar ファイルにパスを通して com.google.zxing パッケージとそれに属する必要なクラスを参照すると、二次元バーコードを簡単に作成できるようになります。

import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

入出力の必要に応じて java.awt 等の他パッケージのクラスもインポートしてください。

インポートができたら QRCodeWriter の encode メソッドを使用して BitMatrix を生成します。

この際に予め Map < EncodeHintType, Object > hintMap を作成しておくと引数として文字コードや余白を指定できます。

/* hintMap を作成して引数を指定 */
Map  hintMap = new EnumMap (EncodeHintType.class);
hintMap.put(EncodeHintType.MARGIN, 1);
// EncodeHintType.QR_VERSION , EncodeHintType.CHARACTER_SET , EncodeHintType.ERROR_CORRECTION などの設定項目をキー、設定をバリューとして hintMap の引数に与えることで他の具体的な設定もできます
/* BitMatrix を生成 */
BitMatrix matrix = new QRCodeWriter().encode("入力文字列", BarcodeFormat.QR_CODE, 横サイズ, 縦サイズ, hintMap);
// WriterException を吐きます
// 引数の横サイズと縦サイズは int 型の数字を入れてください

上で作成した BitMatrix を使ってグラフィカルイメージを作成します。

BufferedImage image = new BufferedImage(matrix.getWidth(), matrix.getWidth(), BufferedImage.TYPE_INT_RGB);
image.createGraphics();

あとは他の画像編集などと同様に、Graphics / Graphics2D クラスなど使用して作成した image を編集したり、出力したりしてください。

これに例えばテキストファイルの読み込みを組み合わせれば、エラーの原因ともなる煩わしいコピー&ペーストから解放されるので、とても便利に使えます。

私はこの分野にあまり詳しくなかったのですが、コードを読み込んでいくうちにバージョン、マスク、誤り訂正など基本的な機能を勉強することもでき、なるほどと思わず関心してしまいました。

Reynolds STRIKE は AERO とは異なる… しかしとても優秀かもしれない

Reynolds のロード用カーボンホイールには RZR と AERO と ALLROADS の3種類の商品構成があります。

1つ目の RZR はフラッグシップモデルで、英語圏では「究極の回転体」と比較されているところを目にします。ハブとスポークまでカーボン繊維 (と Boron fiber) で形成されており、前後輪あわせても質量 1.0kg を切るほど軽量だそうです。

対抗ホイールの Meilenstein と Gipfelsturm の方は何度も見たことがありますが、RZR に関しては自分自身で実物を見たことがないので詳しくは語れません。

2つ目の AERO は RZR に使われている技術を採用したミドルレンジモデルです。

約一年前に私が購入した AERO 46 もその一つで、現在は他にリム高の異なる AERO 65 と AERO 80 があります (過去には 72 と 90 がありました)。

こちらはカーボンリムに DT 240S ハブとスチールスポークを組み合わせた一般的なカーボンホイールです。

詳細は該当記事にありますので、興味のある方はそちらをご覧ください。

3つ目の ALLROADS もカーボンリムに合金ハブとスチールスポークを組み合わせたホイールです。

荒れた道に使える ATR の他に、リム高が異なる ATTACK (29mm) ASSAULT (41mm) STRIKE (62mm) の3つのモデルがあります。

これら ALLROADS ホイールとミドルレンジの AERO ホイールとの相違点はリムの形状とリム幅、そしてスポークの本数 (ただし最もディープな STRIKE だけは AERO と同じ本数) ですが、実物を細かく見ていくとカタログに載っていないところでも様々な点が異なります。

ここで偶然 CANYON の完成車に付属してきた STRIKE (62mm) と前述の AERO 46 が両方とも手元にあるので、それらを使って細かな違いを見ていこうと思います。




まず AERO と STRIKE とではハブの形状が異なります。

AERO の後輪は左右ともに2クロスですが、STRIKE はノンドライブサイドがラジアル組みです。

STRIKE Tubeless

AERO 46 Tubular

目立たないところではスポークも異なっており、AERO が DT Aerolite なのに対して STRIKE は DT Aero comp を使用しています。

スポークが DT ということは、ハブも DT 製なのでしょうけれども、今回は完成車外しのため確証がありません。

製品番号らしきフォントを見て「ポーランド工場製かな」と推測できるぐらい DT に魂を売り渡している私が見ても DT っぽいので、高確率で DT 製だとは思われますが。

ハブが異なるならスキュワも異なります。

私のことを良く知っている方は、私がアルミやチタンのような軽量な金属が嫌い (特にフレームやスポークやボルトの素材としては大嫌い) なことをご存知かと思われます。

話は脱線しますが一応は説明しておくと、アルミ素材が嫌いなのは板厚を稼げるので剛性を高める目的に適していても、疲労限度がなく耐久性に乏しいこと。

チタンについては摩擦係数が不安定なことに加えて、加工が難しく、室温でもクリープ性があるためです。

豊富な知識と卓越した技能を持つ整備士が点検した上でレースで使用するなら問題ないでしょうが、公道上で常用するなら鉄の方が安全だと思ってるわけです。

そんなアンチ軽量スキュワな私からしても STRIKE の方はちょっと… 市販品に交換したくなります。

AEROのスキュワはデザイン、質量、素材の全てについて言うことなし。最高です。

上が AERO 下が STRIKE

ハブもリムもスポークも、更に言えば (私の AERO 46 は Tubular なので) 使用するタイヤも異なるので、同じ Reynolds でも両者の性格は大きく異なります。

しかしリム高に対して非常に軽量な点は変わりません。

62mm のリム高に 25c のクリンチャータイヤとチューブ、リムテープが着いている割に前輪 1,033g 後輪 1,449g と質量は大変に優秀です。

(※ カーボンクリンチャーホイール用のタイヤレバーを所持していないので、やむなく完成車外しそのままの状態で計測しています)

特に後輪は DURA-ACE とは言え、11-28T の歯車が11枚とスポークのプロテクターが着いての数値です。

前後セットでカタログ値 1,635g という STRIKE の質量は伊達ではないかもしれません。

AERO 46 の方は Tubular なこともあって前後輪をあわせての質量 1,230g という恐ろしい数値が出ていますが、実際に履いて走ってみるととんでもなく速いです。

常用したくなるほどに気持ち良く速いのですが、私の住んでいる東京という違法駐車天国では 自転車が普通に走れるまともな道路 性能を活かせる場所がないので、イベント参加に遠出する際にしか出番のない不憫なホイールでもあります。

私が活かせていないだけで Reynolds のホイールはとにかく軽くてよく回るので、加速が必要とされるあらゆる場面でも役立つ上、Lifetime Crash Replacement という保証体制が優秀なので本来はとても使いやすいものです。

販売価格が安いだけのカーボンホイールよりも、品質的にも維持費的にも安心して使い倒せます (詳細は AERO 46 の記事を見てください)。

STRIKE も構造を見るだけで AERO とは根本的に異なる性格をしていることが分かりますが、これはこれで速いんだろうなと使う場面を考えるのが楽しくなってきます。

Nikon 一眼レフに乗り換えるのは非常に簡単!

昨今ではスマートフォンやコンパクトカメラという形態で、一眼レフを購入する以前から何かしらの「カメラ」を所持していることが一般的だと思われます。

既に「カメラ」を所持しているので、新たに一眼レフを購入するのは画質に魅力を感じることはあっても、大なり小なり「大変そうだ」という気持ちを抱くのではないでしょうか。

今までのシステムと互換性のない充電器にレンズ、フィルタにストラップにストラボと、新しいものが次々に増えていくことを受け入れるにはそれなりの覚悟が必要です。

ハード面の変化を受け入れたとしても、時刻合わせに撮影設定に言語設定といったソフト面の環境設定が待っています。

そうした小さな心理的なハードルがいくつも積み重なった結果、「どうしても必要なものでもないし」と購入を先送りしてしまいがちになります。

少なくとも私はそうでした。

しかし、Nikonの新機種では、スマートフォンやタブレット端末さえあれば、電源を立ち上げてから一瞬で時刻設定や画像の転送設定を行ってくれます。

カメラに内蔵されている SnapBridge アプリの完成度が高いのです。




Android スマートフォン (Xperia) の NFC を立ち上げて、一眼レフカメラに近づけると驚くほどの速さで互いを認識し合います。

その速さは日頃、Xperia と一緒に SONY のミラーレス機を使用している私が目を疑うほどです。

無線通信の接続も速ければ、設定も容易です。

面倒な時刻入力などは勝手に調整してくれるので、開封したら直ぐに使えるようになります。

購入前にアプリ名だけを提示されても何ができるのか一切不明でしたが、こんなに簡単に初期設定が終わるなら早く教えて欲しかったという気分です。

Nikon D5600 10.0-20.0 mm f/4.5-5.6 ƒ/8.0 18.0 mm 1/60 ISO 100

アプリを利用すれば基本設定は簡単に終わる反面、一眼レフでできることは豊富にあります。

レンズを交換することでスマートフォンやコンパクトカメラでは表せない超広角の気持ち良さ、スローシャッターの面白さ、望遠の立体感などを手軽に体験できるようになります。

( Nikon D5600 は購入したばかりなので ) 以下は SONY 機で過去に撮影したものですが雰囲気はお分かり頂けるかと思われます。



シャッターを切って出てきた画像に対して「なんだこれは」と感嘆できるので、レンズ選びとは楽しいものです。

自分で選ばなければならないので手間が掛かるという一面も事実ですが、最初から撮影環境が整ったスマートフォンやコンパクトカメラでは味わえない自由と選択の幅もあります。

この表現力の幅広さにこそ、一眼レフのようなレンズ交換式カメラの本当の魅力があるのではないかと私は感じています。

撮影目的に適したレンズさえ用意できれば、あとは3つのことを意識していれば、思うように撮影環境をコントロールできるようになります。

その3つとは

  1. 焦点距離に代表される距離
  2. シャッタースピードに代表される時間
  3. 光源や光量に代表される光の状態

のことです。

一眼レフはそうした撮影環境を設定するのに適した機械なので、一つづつ設定を覚えていけば、無意識的に使いこなせるようになるものです。

揃えるのが大変そうに思える機材も撮影環境をコントロールするためのものなので、本来は必要性を感じた時点で導入していくものです。

導入前に感じていた「大変そうだ」という心理的な壁は、使い出したら胡散霧消して「もっと早く買っておけば良かったかも」と勿体なく思うようになりました。

懸念していた重さも Nikon D5600 のような軽量機種であれば十分に常用できる範囲に収まりますので、大きさや取り回しが気にならないという方なら思い切って購入してしまうのも良いかもしれません。