bacon/bacon-qr-code
BaconQrCode is a PHP QR code generator (ZXing encoder port) with fast Reed-Solomon. Render to PNG via Imagick, or output SVG and EPS; includes a separate GDLibRenderer. Simple API to write files or generate images from text.
Install via Composer:
composer require bacon/bacon-qr-code
use BaconQrCode\Writer;
$writer = new Writer();
$writer->writeFile('https://example.com', 'qr-code.png');
Writer: Core class for generating QR codesRenderer: Handles output format (default: PNG via Imagick)RendererStyle: Controls visual appearance (size, colors, etc.)tests/ directory for advanced use casesRendererStyle class for customizationInstantiate Renderer (choose backend):
// Imagick (default, high quality)
$renderer = new ImageRenderer(
new RendererStyle(400),
new ImagickImageBackEnd()
);
// SVG (vector, no artifacts)
$renderer = new ImageRenderer(
new RendererStyle(400),
new SvgImageBackEnd()
);
// GD (lightweight, limited features)
$renderer = new GDLibRenderer(400);
Create Writer:
$writer = new Writer($renderer);
Generate QR Code:
// To file
$writer->writeFile('data', 'output.png');
// To string (e.g., for responses)
$qrCode = $writer->writeString('data');
use BaconQrCode\Writer;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\RendererStyle;
use BaconQrCode\Renderer\Image\SvgImageBackEnd;
public function generateQr(Request $request)
{
$renderer = new ImageRenderer(
new RendererStyle(300),
new SvgImageBackEnd()
);
$writer = new Writer($renderer);
return response($writer->writeString($request->input('data')), 200, [
'Content-Type' => 'image/svg+xml',
]);
}
$style = new RendererStyle(500);
$style->setForegroundColor(new \BaconQrCode\Color\Rgb(0, 102, 204)); // Blue
$style->setBackgroundColor(new \BaconQrCode\Color\Rgb(255, 255, 255)); // White
$style->setMargin(10);
$renderer = new ImageRenderer($style, new ImagickImageBackEnd());
$writer->getRenderer()->getStyle()->setErrorCorrectionLevel(
\BaconQrCode\Writer\ErrorCorrectionLevel::HIGH
);
$urls = ['url1', 'url2', 'url3'];
foreach ($urls as $index => $url) {
$writer->writeFile($url, "qr_{$index}.png");
}
Storage::put() to save QR codes to disk:
Storage::put('public/qr-codes/' . $filename, $qrCode);
GenerateQrJob::dispatch($data, $filename)->onQueue('qr-codes');
$cacheKey = 'qr_' . md5($data);
$qrCode = Cache::remember($cacheKey, now()->addHours(1), function() use ($data) {
return $writer->writeString($data);
});
Imagick Artifacts:
SvgImageBackEnd or GDLibRenderer if you encounter white pixel artifacts (common with ImagickImageBackEnd).$renderer = new ImageRenderer(new RendererStyle(400), new SvgImageBackEnd());
GD Limitations:
Memory Usage:
PHP Extensions:
php-imagick (pecl install imagick).xmlwriter extension.php-gd).Encoding Issues:
$writer->writeFile(mb_convert_encoding($data, 'UTF-8'), 'output.png');
BaconQrCode\Writer logging for encoding errors:
\Log::debug('QR Data:', ['data' => $data]);
// Test Imagick
$imagickRenderer = new ImageRenderer(new RendererStyle(400), new ImagickImageBackEnd());
$imagickWriter = new Writer($imagickRenderer);
$imagickWriter->writeFile($data, 'test_imagick.png');
// Test SVG
$svgRenderer = new ImageRenderer(new RendererStyle(400), new SvgImageBackEnd());
$svgWriter = new Writer($svgRenderer);
$svgWriter->writeFile($data, 'test_svg.svg');
Custom Renderers:
Extend \BaconQrCode\Renderer\ImageRenderer or \BaconQrCode\Renderer\RendererStyle for custom logic.
Example:
class CustomRenderer extends ImageRenderer {
public function __construct() {
parent::__construct(
new RendererStyle(400),
new CustomImageBackEnd()
);
}
}
Eye Patterns:
Override default eye shapes (finder patterns) by extending \BaconQrCode\Renderer\Eye\Eye:
class CustomEye extends SimpleCircleEye {
protected function drawEye(): void {
// Custom drawing logic
}
}
Color Management:
Extend \BaconQrCode\Color\Color for custom color spaces or conversions.
RendererStyle:
$style = new RendererStyle(500); // 500px
$style->setMargin(1);
LOW. Use HIGH for noisy environments:
$style->setErrorCorrectionLevel(\BaconQrCode\Writer\ErrorCorrectionLevel::HIGH);
Writer once and reuse for multiple generations:
$writer = new Writer(); // Reuse across requests
How can I help you explore Laravel packages today?