上野家のホームページ
ナーマル,マリン,ココ
[
新規
|
一覧
|
検索
|
最新
|
ヘルプ
]
開発/Barcode/QRコード/JavaでQRコードを作成
をテンプレートにして作成
資料室
開発/Barcode/QRコード/JavaでQRコードを作成 をテンプレートにして作成
[
差分
|
バックアップ
|
リロード
]
[ ]
開始行:
* JavaでQRCodeを作成
** 作成する方法
JavaでQRCodeを作成してみる。
QRコードを作成するためのJavaのライブラリに,ZXing(ゼブラ...
ZXingはGoogleで開発されていて,様々な一次元/二次元のバー...
サポートされているフォーマット形式は,
|1D product |1D industrial |2D |h
|UPC-A |Code 39 |QR Code |
|UPC-E |Code 93 |Data Matrix |
|EAN-8 |Code 128 |Aztec (beta) |
|EAN-13 |Codabar |PDF 417 (beta)|
| |ITF |MaxiCode |
| |RSS-14 | |
| |RSS-Expanded | |
です。残念ながら,''MicroQRコードはサポートしていない''よ...
このライブラリを使用して,QRコードを作成してみる。
ZXing Core(ZXingの中核となるライブラリ)
groupId : com.google.zxing
artifactId : core
version : 3.3.2
ZXing Java SE Extensions(Java SEのプロジェクトで,バーコ...
groupId : com.google.zxing
artifactId : javase
version : 3.3.2
Java SEで利用する場合はcoreとjavaseを,Androidの開発で利...
GitHub https://github.com/zxing/zxing からダウンロードす...
もしくは,jarファイルをMaven Repositoryからだと取得しやす...
https://mvnrepository.com/artifact/com.google.zxing/core/...
https://mvnrepository.com/artifact/com.google.zxing/javas...
ダウンロードした,以下の2つのjarファイルを使用する。
core-3.3.2.jar
javase-3.3.2.jar
参照できるクラスパスにコピーしておく。
ソースコードからビルドする場合は,Mavenでビルドする。
$ cd work
$ git clone https://github.com/zxing/zxing
$ cd zxing
$ mvn -Dhttps.protocols=TLSv1.2 package
java 7の場合は,TSL 1.2を指定してビルドする。使用するのは...
** QRCodeの画像をエンコードする
QRCodeの画像を作成する方法は,以下のようなプログラムを作...
''QRCodeEncoder.java''
#code(java,nonumber){{
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLev...
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.imageio.ImageIO;
/**
* JavaでQR Codeを作成
* @author Yuji Ueno
*/
public class QRCodeEncoder {
public static void main(String[] args) throws WriterExce...
// QRコード生成したい文字列
String source = "上野雄二";
// QRコード生成時のエンコーディング
String encoding = "Shift_JIS";
// サイズ(ピクセル)
int size = 100;
// 画像ファイルの保存先
String filePath = "qrcode.png";
// 生成処理
ConcurrentHashMap hints = new ConcurrentHashMap();
//エラー訂正レベル指定
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrect...
//エンコーディング指定
hints.put(EncodeHintType.CHARACTER_SET, encoding);
//マージン指定
hints.put(EncodeHintType.MARGIN, 0);
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(source, BarcodeForm...
BufferedImage image = MatrixToImageWriter.toBufferedIma...
//ファイルへの保存処理
ImageIO.write(image, "png", new File(filePath));
}
}
}}
コンパイルして,動作確認してみる。
$ javac -encoding UTF-8 QRCodeEncoder.java
$ java QRCodeEncoder
qrcode.pngのファイル名で画像が作成されている。
#ref(qrcode.png)
画像の色を変更したい場合には,MatrixToImageWriter.toBuffe...
// 青と白で表示
MatrixToImageConfig config = new MatrixToImageConfig(0xf...
BufferedImage bufferedImage = MatrixToImageWriter.toBuff...
画像ではなく,文字列でもよければBitMatrix.toString()が使...
** ヒント情報(EncodeHintType)
QRCodeを作る際に,いくつかヒント情報を指定することが出来...
ヒント情報は,Mapで指定する。~
キーは,列挙型のEncodeHintTypeを使用するが,キーによって...
また,キーが列挙型なのでEnumMapが使用出来る。
** 誤り訂正レベル
誤り訂正レベルは,以下のように指定する。~
キー : EncodeHintType.ERROR_CORRECTION
値 : 列挙型の ErrorCorrectionLevel で指定する
ErrorCorrectionLevel.L : 7%まで訂正可能(デフォルト)
ErrorCorrectionLevel.M : 15%まで訂正可能
ErrorCorrectionLevel.Q : 25%まで訂正可能
ErrorCorrectionLevel.H : 30%まで訂正可能
ちなみに,QRCodeにイラストなどを載せても読み取れるのは,...
** 文字セット
文字セットは,以下のように指定します。
キー : EncodeHintType.CHARACTER_SET
値 : 文字列( String )で文字セット名を指定
デフォルトは "ISO-8859-1"
デフォルトは,上記のように"ISO-8859-1"(いわゆる ISO-Lati...
必要であれば日本語が扱える文字セットを指定する必要がある。
後述のように,"Shift_JIS"の文字セット名は特別な対応があり...
** マージン
マージンは,以下のように指定する。
キー : EncodeHintType.MARGIN
値 : 上下左右のマージンをセル数( Integer )で指定
デフォルトは 4
QRCodeには,周囲に4セル以上のマージンを必要とする。
普通は,デフォルトのままで十分だと思う。
もし,表示する際に画像の周りに余白を別途用意するなら,マ...
** モードやバージョンを取得する
QRCodeには,「モード」や「バージョン」といった情報があり...
上記の方法では,実際に適用された「モード」や「バージョン...
もしなんらかの理由で,「モード」や「バージョン」が必要な...
変えるなど)は,Encoderを使用する。
#code(java){{
package net.the_blue_pla.net.qrcode;
import java.nio.charset.Charset;
import java.util.EnumMap;
import java.util.Map;
import java.util.Objects;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLev...
import com.google.zxing.qrcode.encoder.Encoder;
import com.google.zxing.qrcode.encoder.QRCode;
public class QRCodeUtils {
public static QRCode createQRCode(String contents, Error...
throws WriterException {
Objects.requireNonNull(contents);
Objects.requireNonNull(level);
Objects.requireNonNull(charset);
if (!charset.canEncode()) {
// エンコード不可
throw new IllegalArgumentException("cannot encode: " +...
}
Map<EncodeHintType, Object> hints = new EnumMap<>(Encod...
hints.put(EncodeHintType.CHARACTER_SET, charset.display...
QRCode code = Encoder.encode(contents, level, hints);
return code;
}
}
}}
注意:MatrixToImageWriter を使っていないので,「ZXing Jav...
com.google.zxing.qrcode.encoder.QRCode
QRCodeは,以下の情報を持っている。
QRCode#getVersion() - バージョン
QRCode#getECLevel() - 誤り訂正レベル
QRCode#getMode() - モード
QRCode#getMatrix() - QRコードの白黒情報
QRCodeから画像データを直接作るメソッドなどは用意されてい...
QRCodeから独自に画像を作るなら,QRCodeWriterとMatrixToIma...
** バージョン
バージョンとは,QRCodeのセル数の大きさを表す。~
一番小さい「バージョン1」は,21セルx21セル。~
バージョンが1つ増える毎に,縦横ともに4セルずつ増えていく。~
最大の「バージョン40」は,177セルx177セルになる。~
|バージョン |縦横のセル数 |h
|バージョン1 |21セル×21セル |
|バージョン2 |25セル×25セル |
|… |… |
|バージョンn |(17+4*n)セル×(17+4*n)セル|
|… |… |
|バージョン40|177セル×177セル |
** モード
QRCodeモード( com.google.zxing.qrcode.decoder.Mode )には...
|モード |許容される文字|h
|数字(NUMERIC) |数字のみ (0~9)|
|英数字(ALPHANUMERIC) |数字,英大文字と一部の記号 (0~9,...
|漢字(KANJI) |Shift_JISの2バイトコードのみ|
|バイト(BYTE) |8bitのデータすべて|
他にも「混在モード」があるが,どうもZXing 3.3.2ではサポー...
モードについては,ちょっと変わった判定方法になっている。
指定した文字セットが,"Shift_JIS"かそうでないかで判定方法...
*** 文字セットが,"Shift_JIS"以外の場合の判定
文字セットが"Shift_JIS"でない場合には,以下のようになって...
対象のデータが数字のみの場合 ⇒ 数字モード
対象のデータが英数字と一部の記号のみの場合 ⇒ 英数字モード
それ以外のデータが含まれる ⇒ バイトモード
英数字モードでの英字は英大文字のみ。
英小文字があるとバイトモードになってしまう。
*** 文字セットが"Shift_JIS"の場合の判定
文字セットが"Shift_JIS"の場合には,以下のようになっている。
対象のデータが"Shift_JIS"の2バイト文字のみの場合 ⇒ 漢字...
それ以外のデータが含まれる ⇒ バイトモード
つまり,文字セットとして"Shift_JIS"を指定した場合には,対...
また,この判定は"Shift_JIS"を指定した場合のみの動作になっ...
例えば,別名の"SJIS"や,"shift_jis"のように小文字で指定し...
当然だが,"MS932" や "Windows-31J" についても,上記「文字...
そのため漢字モードでは,「NEC特殊文字」「NEC選定IBM拡張文...
ちなみに,このあたりの判定は com.google.zxing.qrcode.enco...
''Encoder.java''
#code(java,nonumber){{
// (略)
private static Mode chooseMode(String content, String enc...
if ("Shift_JIS".equals(encoding)) {
// Choose Kanji mode if all input are double-byte chara...
return isOnlyDoubleByteKanji(content) ? Mode.KANJI : Mo...
}
// (略)
}}
つまり,文字セットとして"Shift_JIS"を指定した場合には,対...
うーむ,この動作はおかしい気がする・・・~
3.3.2では,"Shift_JIS"でもNUMERIC/ALPHANUMERICに判定され...
* QRCodeの画像を読み取る
ZXingは,読み取りにも対応している。
QRCodeの画像を読み取るために,以下のようなプログラムを作...
''QRCodeReader.java''
#code(java,nonumber){{
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanc...
import com.google.zxing.common.HybridBinarizer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author Yuji Ueno
*/
public class QRCodeReader {
public static void main(String[] args) throws IOExceptio...
//読み取りたい画像ファイルの保存場所
String filePath = "qr_code.png";
//読み取り処理
BufferedImage image = ImageIO.read(new File(filePath));
LuminanceSource source = new BufferedImageLuminanceSour...
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinari...
Reader reader = new MultiFormatReader();
Result decodeResult = reader.decode(bitmap);
//デコード処理
String result = decodeResult.getText();
//標準出力
System.out.format("読み取り結果=%1$s\r\n", result);
}
}
}}
コンパイルして,動作確認してみる。
> javac -encoding UTF-8 QRCodeReader.java
> java QRCodeReader
読み取り結果=上野雄二
となって,作成したときの文字列が読めた。
終了行:
* JavaでQRCodeを作成
** 作成する方法
JavaでQRCodeを作成してみる。
QRコードを作成するためのJavaのライブラリに,ZXing(ゼブラ...
ZXingはGoogleで開発されていて,様々な一次元/二次元のバー...
サポートされているフォーマット形式は,
|1D product |1D industrial |2D |h
|UPC-A |Code 39 |QR Code |
|UPC-E |Code 93 |Data Matrix |
|EAN-8 |Code 128 |Aztec (beta) |
|EAN-13 |Codabar |PDF 417 (beta)|
| |ITF |MaxiCode |
| |RSS-14 | |
| |RSS-Expanded | |
です。残念ながら,''MicroQRコードはサポートしていない''よ...
このライブラリを使用して,QRコードを作成してみる。
ZXing Core(ZXingの中核となるライブラリ)
groupId : com.google.zxing
artifactId : core
version : 3.3.2
ZXing Java SE Extensions(Java SEのプロジェクトで,バーコ...
groupId : com.google.zxing
artifactId : javase
version : 3.3.2
Java SEで利用する場合はcoreとjavaseを,Androidの開発で利...
GitHub https://github.com/zxing/zxing からダウンロードす...
もしくは,jarファイルをMaven Repositoryからだと取得しやす...
https://mvnrepository.com/artifact/com.google.zxing/core/...
https://mvnrepository.com/artifact/com.google.zxing/javas...
ダウンロードした,以下の2つのjarファイルを使用する。
core-3.3.2.jar
javase-3.3.2.jar
参照できるクラスパスにコピーしておく。
ソースコードからビルドする場合は,Mavenでビルドする。
$ cd work
$ git clone https://github.com/zxing/zxing
$ cd zxing
$ mvn -Dhttps.protocols=TLSv1.2 package
java 7の場合は,TSL 1.2を指定してビルドする。使用するのは...
** QRCodeの画像をエンコードする
QRCodeの画像を作成する方法は,以下のようなプログラムを作...
''QRCodeEncoder.java''
#code(java,nonumber){{
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLev...
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.imageio.ImageIO;
/**
* JavaでQR Codeを作成
* @author Yuji Ueno
*/
public class QRCodeEncoder {
public static void main(String[] args) throws WriterExce...
// QRコード生成したい文字列
String source = "上野雄二";
// QRコード生成時のエンコーディング
String encoding = "Shift_JIS";
// サイズ(ピクセル)
int size = 100;
// 画像ファイルの保存先
String filePath = "qrcode.png";
// 生成処理
ConcurrentHashMap hints = new ConcurrentHashMap();
//エラー訂正レベル指定
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrect...
//エンコーディング指定
hints.put(EncodeHintType.CHARACTER_SET, encoding);
//マージン指定
hints.put(EncodeHintType.MARGIN, 0);
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(source, BarcodeForm...
BufferedImage image = MatrixToImageWriter.toBufferedIma...
//ファイルへの保存処理
ImageIO.write(image, "png", new File(filePath));
}
}
}}
コンパイルして,動作確認してみる。
$ javac -encoding UTF-8 QRCodeEncoder.java
$ java QRCodeEncoder
qrcode.pngのファイル名で画像が作成されている。
#ref(qrcode.png)
画像の色を変更したい場合には,MatrixToImageWriter.toBuffe...
// 青と白で表示
MatrixToImageConfig config = new MatrixToImageConfig(0xf...
BufferedImage bufferedImage = MatrixToImageWriter.toBuff...
画像ではなく,文字列でもよければBitMatrix.toString()が使...
** ヒント情報(EncodeHintType)
QRCodeを作る際に,いくつかヒント情報を指定することが出来...
ヒント情報は,Mapで指定する。~
キーは,列挙型のEncodeHintTypeを使用するが,キーによって...
また,キーが列挙型なのでEnumMapが使用出来る。
** 誤り訂正レベル
誤り訂正レベルは,以下のように指定する。~
キー : EncodeHintType.ERROR_CORRECTION
値 : 列挙型の ErrorCorrectionLevel で指定する
ErrorCorrectionLevel.L : 7%まで訂正可能(デフォルト)
ErrorCorrectionLevel.M : 15%まで訂正可能
ErrorCorrectionLevel.Q : 25%まで訂正可能
ErrorCorrectionLevel.H : 30%まで訂正可能
ちなみに,QRCodeにイラストなどを載せても読み取れるのは,...
** 文字セット
文字セットは,以下のように指定します。
キー : EncodeHintType.CHARACTER_SET
値 : 文字列( String )で文字セット名を指定
デフォルトは "ISO-8859-1"
デフォルトは,上記のように"ISO-8859-1"(いわゆる ISO-Lati...
必要であれば日本語が扱える文字セットを指定する必要がある。
後述のように,"Shift_JIS"の文字セット名は特別な対応があり...
** マージン
マージンは,以下のように指定する。
キー : EncodeHintType.MARGIN
値 : 上下左右のマージンをセル数( Integer )で指定
デフォルトは 4
QRCodeには,周囲に4セル以上のマージンを必要とする。
普通は,デフォルトのままで十分だと思う。
もし,表示する際に画像の周りに余白を別途用意するなら,マ...
** モードやバージョンを取得する
QRCodeには,「モード」や「バージョン」といった情報があり...
上記の方法では,実際に適用された「モード」や「バージョン...
もしなんらかの理由で,「モード」や「バージョン」が必要な...
変えるなど)は,Encoderを使用する。
#code(java){{
package net.the_blue_pla.net.qrcode;
import java.nio.charset.Charset;
import java.util.EnumMap;
import java.util.Map;
import java.util.Objects;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLev...
import com.google.zxing.qrcode.encoder.Encoder;
import com.google.zxing.qrcode.encoder.QRCode;
public class QRCodeUtils {
public static QRCode createQRCode(String contents, Error...
throws WriterException {
Objects.requireNonNull(contents);
Objects.requireNonNull(level);
Objects.requireNonNull(charset);
if (!charset.canEncode()) {
// エンコード不可
throw new IllegalArgumentException("cannot encode: " +...
}
Map<EncodeHintType, Object> hints = new EnumMap<>(Encod...
hints.put(EncodeHintType.CHARACTER_SET, charset.display...
QRCode code = Encoder.encode(contents, level, hints);
return code;
}
}
}}
注意:MatrixToImageWriter を使っていないので,「ZXing Jav...
com.google.zxing.qrcode.encoder.QRCode
QRCodeは,以下の情報を持っている。
QRCode#getVersion() - バージョン
QRCode#getECLevel() - 誤り訂正レベル
QRCode#getMode() - モード
QRCode#getMatrix() - QRコードの白黒情報
QRCodeから画像データを直接作るメソッドなどは用意されてい...
QRCodeから独自に画像を作るなら,QRCodeWriterとMatrixToIma...
** バージョン
バージョンとは,QRCodeのセル数の大きさを表す。~
一番小さい「バージョン1」は,21セルx21セル。~
バージョンが1つ増える毎に,縦横ともに4セルずつ増えていく。~
最大の「バージョン40」は,177セルx177セルになる。~
|バージョン |縦横のセル数 |h
|バージョン1 |21セル×21セル |
|バージョン2 |25セル×25セル |
|… |… |
|バージョンn |(17+4*n)セル×(17+4*n)セル|
|… |… |
|バージョン40|177セル×177セル |
** モード
QRCodeモード( com.google.zxing.qrcode.decoder.Mode )には...
|モード |許容される文字|h
|数字(NUMERIC) |数字のみ (0~9)|
|英数字(ALPHANUMERIC) |数字,英大文字と一部の記号 (0~9,...
|漢字(KANJI) |Shift_JISの2バイトコードのみ|
|バイト(BYTE) |8bitのデータすべて|
他にも「混在モード」があるが,どうもZXing 3.3.2ではサポー...
モードについては,ちょっと変わった判定方法になっている。
指定した文字セットが,"Shift_JIS"かそうでないかで判定方法...
*** 文字セットが,"Shift_JIS"以外の場合の判定
文字セットが"Shift_JIS"でない場合には,以下のようになって...
対象のデータが数字のみの場合 ⇒ 数字モード
対象のデータが英数字と一部の記号のみの場合 ⇒ 英数字モード
それ以外のデータが含まれる ⇒ バイトモード
英数字モードでの英字は英大文字のみ。
英小文字があるとバイトモードになってしまう。
*** 文字セットが"Shift_JIS"の場合の判定
文字セットが"Shift_JIS"の場合には,以下のようになっている。
対象のデータが"Shift_JIS"の2バイト文字のみの場合 ⇒ 漢字...
それ以外のデータが含まれる ⇒ バイトモード
つまり,文字セットとして"Shift_JIS"を指定した場合には,対...
また,この判定は"Shift_JIS"を指定した場合のみの動作になっ...
例えば,別名の"SJIS"や,"shift_jis"のように小文字で指定し...
当然だが,"MS932" や "Windows-31J" についても,上記「文字...
そのため漢字モードでは,「NEC特殊文字」「NEC選定IBM拡張文...
ちなみに,このあたりの判定は com.google.zxing.qrcode.enco...
''Encoder.java''
#code(java,nonumber){{
// (略)
private static Mode chooseMode(String content, String enc...
if ("Shift_JIS".equals(encoding)) {
// Choose Kanji mode if all input are double-byte chara...
return isOnlyDoubleByteKanji(content) ? Mode.KANJI : Mo...
}
// (略)
}}
つまり,文字セットとして"Shift_JIS"を指定した場合には,対...
うーむ,この動作はおかしい気がする・・・~
3.3.2では,"Shift_JIS"でもNUMERIC/ALPHANUMERICに判定され...
* QRCodeの画像を読み取る
ZXingは,読み取りにも対応している。
QRCodeの画像を読み取るために,以下のようなプログラムを作...
''QRCodeReader.java''
#code(java,nonumber){{
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanc...
import com.google.zxing.common.HybridBinarizer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
*
* @author Yuji Ueno
*/
public class QRCodeReader {
public static void main(String[] args) throws IOExceptio...
//読み取りたい画像ファイルの保存場所
String filePath = "qr_code.png";
//読み取り処理
BufferedImage image = ImageIO.read(new File(filePath));
LuminanceSource source = new BufferedImageLuminanceSour...
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinari...
Reader reader = new MultiFormatReader();
Result decodeResult = reader.decode(bitmap);
//デコード処理
String result = decodeResult.getText();
//標準出力
System.out.format("読み取り結果=%1$s\r\n", result);
}
}
}}
コンパイルして,動作確認してみる。
> javac -encoding UTF-8 QRCodeReader.java
> java QRCodeReader
読み取り結果=上野雄二
となって,作成したときの文字列が読めた。
ページ名:
Counter: 0, today: 0, yesterday: 0
Copyright©2008 Yuji Ueno All Rights Reserved.
ログイン
ユーザ名:
パスワード:
IDとパスワードを記憶
パスワード紛失
メインメニュー
ホーム
でぶlog
資料室
最新ページ一覧
全ページ一覧
ヘルプ
フォーラム
お問い合わせ