Merge pull request #3 from CellCS/bug/svg-issue

Bug/svg issue
This commit is contained in:
Alex Spataru
2025-06-05 10:53:57 -05:00
committed by GitHub
+44 -5
View File
@@ -113,15 +113,54 @@ QString QrCodeGenerator::toSvgString(const qrcodegen::QrCode &qr,
* @param size The image size to generate. * @param size The image size to generate.
* @return QImage representing the QR code. * @return QImage representing the QR code.
*/ */
// QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode,
// quint16 border, quint16 size) const
// {
// QString svg = toSvgString(qrCode, border);
// QSvgRenderer render(svg.toUtf8());
// QImage image(size, size, QImage::Format_Mono);
// image.fill(Qt::white);
// QPainter painter(&image);
// painter.setRenderHint(QPainter::Antialiasing);
// render.render(&painter);
// return image;
// }
// QR code image is being rendered from SVG output, not directly from bitmaps or
// matrices QSvgRenderer has internal limits on path complexity or buffer size —
// hitting those leads to the truncation warning.
// If the generated SVG string is too large or malformed, the QSvgRenderer will
// throw warnings.
// like: W : qt.svg: Invalid path data; path truncated.
QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode, QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode,
quint16 border, quint16 size) const quint16 border, quint16 size) const
{ {
QString svg = toSvgString(qrCode, border); const int qrSize = qrCode.getSize();
QSvgRenderer render(svg.toUtf8()); const int totalSize = qrSize + 2 * border;
QImage image(size, size, QImage::Format_Mono); // Calculate scaling factor to fit requested size
const int pixelSize = size / totalSize;
const int imageSize = pixelSize * totalSize;
// Create the output image
QImage image(imageSize, imageSize, QImage::Format_RGB32);
image.fill(Qt::white); image.fill(Qt::white);
QPainter painter(&image); QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing); painter.setBrush(Qt::black);
render.render(&painter); painter.setPen(Qt::NoPen);
// Draw each QR module (black square)
for (int y = 0; y < qrSize; ++y)
{
for (int x = 0; x < qrSize; ++x)
{
if (qrCode.getModule(x, y))
{
int xPos = (x + border) * pixelSize;
int yPos = (y + border) * pixelSize;
painter.drawRect(xPos, yPos, pixelSize, pixelSize);
}
}
}
return image; return image;
} }