make is.dev make it simple. development.
2024年9月17日

PHPでQRコード生成

PHPでQRコード画像を生成してみる。
ジェネレータは、endroid/qr-codeをお借りして使用。

使用環境

・ PHP 8.2.9
endroid/qr-code

ライブラリのインストール

Composerを使ってインストールする。

composer require endroid/qr-code

GitHub:endroid/qr-code

基本サンプル

QRコードを生成してPNG形式のファイルに出力するサンプル。

<?php

require '../vendor/autoload.php';

use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Writer\ValidationException;


// QRコードの設定を行う
$qrCode = QrCode::create( 'QRコードに埋め込む文字列' )
    ->setEncoding( new Encoding( 'UTF-8' ) )    // 文字コード指定
    ->setErrorCorrectionLevel( ErrorCorrectionLevel::Low )
    ->setSize( 300 )    // QRコードサイズ(px)
    ->setMargin( 10 )    // マージンサイズ(px)
    ->setRoundBlockSizeMode( RoundBlockSizeMode::None )
    ->setForegroundColor( new Color( 0, 0, 0 ) )    // 描画色
    ->setBackgroundColor( new Color( 255, 255, 255 ) );    // 背景色

// PNG形式で生成
$writer = new PngWriter();
$result = $writer->write( $qrCode );

// ファイルに出力
$result->saveToFile( './qrcode.png');

画像サイズはQRコードのサイズ+マージンサイズ×2になるので注意。
余白無しのQRコードを使いたい時は setMargin( 0 )を指定すればOK。

GitHubのサンプルでは、setRoundBlockSizeMode() で Margin が指定されているが、この指定だとマージンサイズが小さい場合にその通りにならない。
他の指定でもサイズの自動調整が入っている様子なので、Noneで指定した上でマージンサイズを数値指定した方がサイズを調整しやすいように感じる。

ロゴ画像を入れる場合

ロゴ画像と設定を用意して、生成時に併せて指定する。

<?php

require '../vendor/autoload.php';

use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Writer\ValidationException;


// QRコードの設定を行う
$qrCode = QrCode::create( 'QRコードに埋め込む文字列' )
    ->setEncoding( new Encoding( 'UTF-8' ) )    // 文字コード指定
    ->setErrorCorrectionLevel( ErrorCorrectionLevel::Low )
    ->setSize( 300 )    // QRコードサイズ(px)
    ->setMargin( 10 )    // マージンサイズ(px)
    ->setRoundBlockSizeMode( RoundBlockSizeMode::None )
    ->setForegroundColor( new Color( 0, 0, 0 ) )    // 描画色
    ->setBackgroundColor( new Color( 255, 255, 255 ) );    // 背景色

// ロゴ画像を設定する
$logo = Logo::create( './logo.png' )
    ->setResizeToWidth( 50 )
    ->setPunchoutBackground( true );

// PNG形式で生成
$writer = new PngWriter();
$result = $writer->write( $qrCode, $logo );

// ファイルに出力
$result->saveToFile( './qrcode.png');

ファイルを作らずブラウザ表示

画像ファイルを作らずそのままブラウザに表示すれば良い場合、URIを生成してimgタグのsrcパラメータに埋め込む。

<?php

require '../vendor/autoload.php';

use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Writer\ValidationException;


// QRコードの設定を行う
$qrCode = QrCode::create( 'QRコードに埋め込む文字列' )
    ->setEncoding( new Encoding( 'UTF-8' ) )    // 文字コード指定
    ->setErrorCorrectionLevel( ErrorCorrectionLevel::Low )
    ->setSize( 300 )    // QRコードサイズ(px)
    ->setMargin( 10 )    // マージンサイズ(px)
    ->setRoundBlockSizeMode( RoundBlockSizeMode::None )
    ->setForegroundColor( new Color( 0, 0, 0 ) )    // 描画色
    ->setBackgroundColor( new Color( 255, 255, 255 ) );    // 背景色

// PNG形式で生成
$writer = new PngWriter();
$result = $writer->write( $qrCode );

// ファイルを使わずに、imgタグに吐き出す場合のURI
$dataUri = $result->getDataUri();

?>
<html>
<body>
  <img src="<?php echo $dataUri; ?>">
</body>
</html>