📸

[php]BaconQrCodeで生成したQRコードの色を変える

2023/06/02に公開

はじめに

BaconQrCodeライブラリを使ってQRコードを生成しています。
https://github.com/Bacon/BaconQrCode

QRコードの色を変えたいという要望があり実現方法を試してみたので、備忘録として投稿します。

現状

二要素認証用のQRコード画像を生成しています。

public function createQrImage(string $key, string $accountName): string
{
    // QRに埋め込むURL生成
    $g2fa = new Google2FA();
    $qrUrl = $g2fa->getQRCodeUrl(
        config('app.name'),
        $accountName,
        $key
    );

    // QR画像生成
    $renderer = new ImageRenderer(
        new RendererStyle(256, 12),
        new ImagickImageBackEnd()
    );
    $writer = new Writer($renderer);
    return base64_encode($writer->writeString($qrUrl));
}

こんな感じで生成されます。

変更

確認したところ、RendererStyleのfillで、背景白・印字色黒の設定を行っているようでした。

BaconQrCode\Renderer\RendererStyle\RendererStyle.php
public function __construct(
    int $size,
    int $margin = 4,
    ?ModuleInterface $module = null,
    ?EyeInterface $eye = null,
    ?Fill $fill = null
) {
    $this->margin = $margin;
    $this->size = $size;
    $this->module = $module ?: SquareModule::instance();
    $this->eye = $eye ?: new ModuleEye($this->module);
    $this->fill = $fill ?: Fill::default();
}
BaconQrCode\Renderer\RendererStyle\Fill.php
public static function default() : self
{
    return self::$default ?: self::$default = self::uniformColor(new Gray(100), new Gray(0));
}

上記からuniformColorを設定することで色を変えれそうということがわかったので、試してみます。(赤に変更)

    // QR画像生成
    $renderer = new ImageRenderer(
+        new RendererStyle(256, 12, null, null, Fill::uniformColor(new Gray(100), new Rgb(255, 0, 0))),
-        new RendererStyle(256, 12),
        new ImagickImageBackEnd()
    );

無事赤のQRコードになりました。

おわりに

QRコードは白地に黒が推奨されているため、あまり需要もなさそうですが参考になれば幸いです。

おわり

Discussion