本ページはプロモーションが含まれています

Java入門

【コピペOK】Java QRコード作成ガイド!ライブラリ比較から実装まで

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

「WebアプリにQRコード決済機能をつけたい」「イベントの電子チケットをJavaで作りたい」

私自身、以前JavaでQRコード作成機能が必要になった際、どのライブラリを選べば良いのか、具体的な実装方法はどうするのか、情報収集に多くの時間を費やした経験があります。特に、日本語の扱い方やエラー処理でつまずくことが多かったです。

この記事は、過去の私と同じように「JavaでQRコードを作成する方法が知りたい」と考えている初心者の方に向けて書きました。

この記事を読めば、数あるライブラリの中から最適なものを選び、コピペで動くサンプルコードを使って、わずか5分でQRコードの作成から読み取りまで実装できるようになります。JavaでのQRコード作成の全てを、この記事一本にまとめました。

JavaでQRコードを作成する方法【初心者向け解説】

QRコードとは?仕組みと使い道を簡単に解説

QRコードは、私たちの生活のいたるところで使われている便利な技術です。スマートフォンをかざすだけで、Webサイトにアクセスしたり、キャッシュレス決済をしたりできます。

この白と黒の四角い模様は、膨大な量の情報を格納できる二次元コードの一種です。従来のバーコードが横一列にしか情報を持てないのに対し、QRコードは縦横の二方向に情報を持つため、より多くのデータを記録できる仕組みになっています。

数字だけでなく、アルファベットや漢字、ひらがなも格納できるため、URLやメールアドレス、商品情報など、さまざまな用途で活用されています。

JavaでQRコードを生成する手順の全体像

JavaでQRコードを作成する手順は、大きく分けて3つのステップしかありません。

ステップ

  1. ライブラリの導入: QRコードの生成・読み取り機能を提供してくれる部品(ライブラリ)をプロジェクトに追加します。
  2. 生成コードの記述: ライブラリの機能を使って、指定した文字列をQRコードのデータに変換し、画像として作成するコードを書きます。
  3. 画像ファイルへの出力: 作成したQRコードの画像を、PNGやJPEGなどの形式でファイルに保存します。

このように、専門的な知識がなくても、ライブラリをうまく活用すれば誰でも簡単にQRコードを作成できます。

開発環境の準備(JDK・IDE・ライブラリ導入)

QRコード作成を始める前に、開発環境を整えましょう。必要なものは以下の3つです。

  • JDK (Java Development Kit): Javaで開発を行うための基本セットです。バージョンは8以上を推奨します。
  • IDE (統合開発環境): EclipseやIntelliJ IDEAなど、普段お使いのもので問題ありません。
  • ライブラリ: QRコードを扱うためのライブラリ。本記事では、最も広く使われているZXingを例に進めます。

ライブラリの導入は、MavenGradleといったビルド管理ツールを使うと非常に簡単です。

Mavenの場合 (pom.xmlに追記)

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.3</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.5.3</version>
</dependency>

Gradleの場合 (build.gradleに追記)

implementation 'com.google.zxing:core:3.5.3'
implementation 'com.google.zxing:javase:3.5.3'

これで、javaqrコード作成の準備は完了です。

JavaでQRコードを作るためのライブラリ紹介

最も人気のあるZXingとは?特徴とメリット

JavaでQRコードを扱うライブラリはいくつかありますが、中でもZXing(ゼブラクロッシング)はデファクトスタンダードと言える存在です。

ZXingはGoogleが開発・提供しているオープンソースのライブラリで、以下のような多くのメリットがあります。

メリット

  • 生成と読み取りの両方に対応: 1つのライブラリでQRコードの作成とデコード(読み取り)の両方が可能です。
  • 豊富な機能: QRコードだけでなく、さまざまな形式の一次元・二次元バーコードに対応しています。
  • 高い実績と信頼性: Google製ということもあり、世界中の多くのプロジェクトで採用されています。情報が多く、困ったときに解決策を見つけやすい点も魅力です。
  • 活発なメンテナンス: 定期的にアップデートされており、安心して利用できます。

特別な理由がない限り、ZXingを選んでおけば間違いありません

QRGenやZBarなど他の選択肢との比較

ZXing以外にも、特徴的なライブラリが存在します。

ライブラリ名特徴メリットデメリット
ZXingGoogle製。生成・読み取り両対応。多機能。情報が豊富で信頼性が高い。多機能ゆえに少し複雑に感じる場合がある。
QRGenQRコード生成に特化。シンプルで使い方が分かりやすい。読み取り機能はない。
ZBarC言語ベース。高速な読み取りが特徴。読み取り速度が非常に速い。Javaで使うにはJNI連携が必要で導入が少し複雑。

QRコードを生成するだけで、手軽に導入したい場合はQRGenも良い選択肢です。また、カメラ映像からリアルタイムで高速にQRコードを読み取りたい場合はZBarが強みを発揮します。

どのライブラリを選ぶべきか【初心者向けおすすめ】

結論として、初心者の方にはZXingをおすすめします

理由は、QRコードの作成と読み取りの両方を1つのライブラリで完結でき、インターネット上に日本語の情報が最も豊富だからです。学習コストが低く、多くの人が使っているため、エラーが発生しても解決策を見つけやすいのは大きなアドバンテージです。

この記事でも、以降はZXingを使った具体的な実装方法を解説していきます。

実際にQRコードを作ってみよう【サンプルコード付き】

ここからは、実際にJavaのコードを書きながらQRコードを作成していきます。以下のサンプルコードは、そのままコピー&ペーストして試せます。

ZXingを使ったQRコード生成の基本コード

まずは、指定した文字列からQRコードを生成する最も基本的なコードです。

import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import java.nio.file.Paths;

public class QRCodeGenerator {
    public static void main(String[] args) {
        try {
            // QRコードに含める文字列
            String text = "https://www.google.com";
            // 画像のサイズ
            int width = 300;
            int height = 300;
            // 出力するファイルパス
            String filePath = "qrcode.png";

            // QRコードを生成
            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                text,
                BarcodeFormat.QR_CODE,
                width,
                height
            );

            // ファイルに出力
            MatrixToImageWriter.writeToPath(
                bitMatrix,
                "PNG",
                Paths.get(filePath)
            );

            System.out.println("QRコードの生成に成功しました: " + filePath);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

このコードを実行すると、プロジェクトのルートディレクトリに qrcode.png という名前でQRコード画像が生成されます。スマートフォンで読み取ると、"https://www.google.com" にアクセスできるはずです。

画像ファイル(PNG・JPEG)として出力する方法

上記のサンプルコードではPNG形式で出力しましたが、MatrixToImageWriterはJPEG形式にも対応しています。

JPEGで出力する場合は、writeToPathメソッドの第2引数を "JPEG" に、ファイルパスの拡張子を ".jpg" や ".jpeg" に変更するだけです。

// ...
String filePath = "qrcode.jpg";
// ...
MatrixToImageWriter.writeToPath(
    bitMatrix,
    "JPEG", // 出力形式をJPEGに変更
    Paths.get(filePath)
);
// ...

一般的に、QRコードのような単純な図形は、くっきりと表示されるPNG形式の方が適しています

文字コード・サイズ・誤り訂正レベルの設定方法

実用的なアプリケーションでは、文字化けを防いだり、QRコードのサイズや強度を調整したりする設定が必要になります。

  • 文字コード: 日本語を含む場合は、文字化けを防ぐためにUTF-8を指定するのが一般的です。
  • 誤り訂正レベル: QRコードの一部が汚れたり破損したりしても、正しく読み取れるようにする機能。レベルは低い順にL(7%)、M(15%)、Q(25%)、H(30%)の4段階あり、レベルが高いほど多くの情報を復元できますが、格納できるデータ量は少なくなります。
  • マージン(余白): QRコードの周囲の白い余白部分。読み取り精度を上げるために重要です。

これらの詳細な設定は、EncodeHintTypeを使って行います。

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class QRCodeGeneratorAdvanced {
    public static void main(String[] args) {
        try {
            String text = "こんにちは、Java QRコード!";
            int size = 350;
            String filePath = "qrcode_advanced.png";
            
            // エンコードのヒント(設定)をMapで作成
            Map<EncodeHintType, Object> hints = new HashMap<>();
            
            // 1. 文字コードをUTF-8に設定
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            
            // 2. 誤り訂正レベルをQ(25%)に設定
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
            
            // 3. マージン(余白)を2に設定
            hints.put(EncodeHintType.MARGIN, 2);

            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                text,
                BarcodeFormat.QR_CODE,
                size,
                size,
                hints // 設定を渡す
            );

            MatrixToImageWriter.writeToPath(
                bitMatrix,
                "PNG",
                Paths.get(filePath)
            );

            System.out.println("詳細設定でQRコードを生成しました: " + filePath);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

このコードを実行すると、日本語の文字列を含み、少し汚れに強いQRコードが生成されます。javaqrコード作成では、この設定が非常に重要です。

JavaでQRコードを読み取る方法も知っておこう

ZXingを使えば、QRコードの読み取り(デコード)も簡単に行えます。

ZXingでQRコードをデコードする手順

デコードの基本的な流れは以下の通りです。

  1. 画像ファイルを読み込む: BufferedImageオブジェクトとしてQRコードの画像ファイルを読み込みます。
  2. バイナリビットマップを作成: 読み込んだ画像を、ZXingが解析できる形式(BinaryBitmap)に変換します。
  3. デコードを実行: MultiFormatReaderを使って、ビットマップからテキスト情報を抽出します。

画像ファイルからテキストを抽出するサンプルコード

先ほど作成したQRコード画像を読み取ってみましょう。

import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class QRCodeReader {
    public static void main(String[] args) {
        try {
            // 読み取るQRコードの画像ファイル
            File file = new File("qrcode_advanced.png");
            
            BufferedImage image = ImageIO.read(file);
            
            // ZXingが解析できる形式に変換
            BinaryBitmap bitmap = new BinaryBitmap(
                new HybridBinarizer(
                    new BufferedImageLuminanceSource(image)
                )
            );
            
            // デコードを実行
            Result result = new MultiFormatReader().decode(bitmap);
            
            System.out.println("QRコードの読み取りに成功しました。");
            System.out.println("テキスト: " + result.getText());
            System.out.println("フォーマット: " + result.getBarcodeFormat());

        } catch (NotFoundException e) {
            System.err.println("QRコードが見つかりませんでした。");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

このコードを実行すると、コンソールに「こんにちは、Java QRコード!」というテキストが出力されるはずです。

エラーが出たときのチェックポイント

QRコードの読み取り時にNotFoundExceptionというエラーが頻繁に発生する場合、以下の点を確認してみてください。

  • 画像の品質: 画像がぼやけていたり、解像度が低すぎたりしませんか?
  • 余白(マージン): QRコードの周囲に十分な余白はありますか?
  • コントラスト: QRコードの黒い部分と背景の白い部分の明暗差ははっきりしていますか?
  • 画像の傾き: 画像が大きく傾いていたり、歪んでいたりすると読み取れない場合があります。

これらの問題がないか確認することで、読み取りの成功率を高めることができます。

QRコード作成機能をアプリに応用するアイデア

WebアプリでのQRコード生成機能の実装例

Spring Bootを使えば、ユーザーが入力したテキストを動的にQRコード画像として表示するWebアプリケーションを簡単に作れます。

例えば、以下のようなControllerを実装します。

import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.ByteArrayOutputStream;

@RestController
public class QRCodeController {

    @GetMapping(value = "/qrcode", produces = MediaType.IMAGE_PNG_VALUE)
    public ResponseEntity<byte[]> generateQRCode(@RequestParam(defaultValue = "Hello") String text) {
        try {
            int width = 250;
            int height = 250;

            BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height);

            ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
            
            return ResponseEntity.ok(pngOutputStream.toByteArray());

        } catch (Exception e) {
            // エラーハンドリング
            return ResponseEntity.internalServerError().build();
        }
    }
}

このWebアプリを起動し、ブラウザで http://localhost:8080/qrcode?text=Java最高 にアクセスすると、"Java最高" という文字列を含んだQRコードが動的に生成・表示されます。

名刺・商品・チケットなど活用アイデア集

Javaで作成したQRコードは、さまざまな場面で活用できます。

  • オンライン名刺: 自分のプロフィールページのURLをQRコードにして名刺に印刷。
  • 商品管理: 商品ごとの詳細情報ページへのリンクをQRコード化し、商品タグに添付。
  • イベントの電子チケット: 入場者ごとのユニークなIDをQRコードにし、スマートフォンに表示させて受付を電子化。
  • Wi-Fi接続情報: SSIDとパスワードをQRコードにして店舗に掲示し、来店者が簡単にWi-Fiに接続できるようにする。
  • アンケート: アンケートフォームのURLをQRコードにして、イベントや商品の満足度調査に活用。

JavaFXやSpring Bootとの連携事例

  • JavaFX: デスクトップアプリケーションにQRコード生成・表示機能を組み込めます。例えば、顧客管理システムで顧客ごとの会員証QRコードを表示する、といった使い方が考えられます。
  • Spring Boot: 上記の例のように、Web APIとしてQRコード生成機能を提供したり、ユーザー登録完了メールにアカウント情報を含んだQRコードを添付して送信したりするなど、Webシステムとの連携で真価を発揮します。

まとめ|JavaでQRコードを作るのは意外と簡単!

この記事の内容まとめ

この記事では、JavaでQRコードを作成・読み取りする方法について、ライブラリの選定から具体的なサンプルコード、応用例までを網羅的に解説しました。

  • QRコードの作成は、ZXingライブラリを使えば初心者でも簡単。
  • MavenやGradleでライブラリを導入し、数行のコードでQRコードを生成できる。
  • 日本語を扱う場合は、文字コード(UTF-8)と誤り訂正レベルの設定が重要。
  • ZXingは読み取り(デコード)にも対応しており、画像ファイルからテキストを抽出可能。
  • Spring Bootと組み合わせれば、動的にQRコードを生成するWebアプリも手軽に開発できる。

QRコード生成でよくある質問(FAQ)

Q1: QRコードの色は変えられますか?

A1: はい、変更可能です。ただし、読み取り精度を確保するため、背景色と十分なコントラストがある濃い色を選ぶ必要があります。ZXingでは、MatrixToImageConfigクラスを使うことで色をカスタマイズできます。

Q2: 日本語の文字列が文字化けしてしまいます。

A2: 生成時にエンコードのヒントでEncodeHintType.CHARACTER_SETに "UTF-8" を指定しているか確認してください。また、ソースコード自体のファイルエンコーディングもUTF-8に設定することをおすすめします。

Q3: QRコードの真ん中にロゴ画像を入れることはできますか?

A3: 可能です。ただし、ZXing自体には直接その機能はありません。一度QRコードを画像として生成し、Javaの画像処理ライブラリ(java.awt.Graphics2Dなど)を使って中央にロゴ画像を合成する必要があります。その際、誤り訂正レベルを高く(Hなど)設定し、ロゴで隠れる部分の情報が復元できるようにしておくことが重要です。

  • この記事を書いた人
  • 最新記事

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

-Java入門