Search code examples
c#zxingqr-code

Add text from QR Code next to generated PNG


I have made an application which generates me a QR Code in a PNG image, but now I have to insert the text from QR Code next to the QR Code image.

I don't have any experience using ZXing Library but I'm thinking that it may contain an option for this...

Example: enter image description here

Code:

namespace QR_Code_with_WFA
{
    public void CreateQRImage(string inputData)
    {
        if (inputData.Trim() == String.Empty)
        {
            System.Windows.Forms.MessageBox.Show("Data must not be empty.");
        }

        BarcodeWriter qrcoder = new ZXing.BarcodeWriter
        {
            Format = BarcodeFormat.QR_CODE,
            Options = new ZXing.QrCode.QrCodeEncodingOptions
            {
                ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H,
                Height = 250,
                Width = 250
            }
        };

        string tempFileName = System.IO.Path.GetTempPath() + inputData + ".png";

        Image image;
        String data = inputData;
        var result = qrcoder.Write(inputData);
        image = new Bitmap(result);
        image.Save(tempFileName);

        System.Diagnostics.Process.Start(tempFileName);
    }
}

Solution

  • Well, ZXing.BarcodeWriter.Options has property PureBarcode, which will put source text into generated image when set to false.

    Unfortunately it has no effect when format of barcode is BarcodeFormat.QR_CODE (and it is by design).

    But you can draw your text manually after you've generated barcode image:

    var result = qrcoder.Write(inputData);
    
    using (var g = Graphics.FromImage(result))
    using (var font = new Font(FontFamily.GenericMonospace, 12))
    using (var brush = new SolidBrush(Color.Black))
    using(var format = new StringFormat(){Alignment = StringAlignment.Center})
    {
        int margin = 5, textHeight = 20;
    
        var rect = new RectangleF(margin, result.Height - textHeight,
                                  result.Width - 2 * margin, textHeight);
    
        g.DrawString(inputData, font, brush, rect, format);
    }
    
    result.Save(tempFileName);
    

    Note you can select your own font size and fontfamily which will better suite your goals.

    Update:

    In the case you're trying to place text to the right from image - you have to "extend" to the right your generated image first, and then draw text:

    var result = qrcoder.Write(inputData);
    
    int textWidth = 200, textHeight = 20;
    // creating new bitmap having imcreased width
    var img = new Bitmap(result.Width + textWidth, result.Height);
    
    using (var g = Graphics.FromImage(img))
    using (var font = new Font(FontFamily.GenericMonospace, 12))
    using (var brush = new SolidBrush(Color.Black))
    using (var bgBrush = new SolidBrush(Color.White))
    using (var format = new StringFormat() { Alignment = StringAlignment.Near })
    {
        // filling background with white color
        g.FillRectangle(bgBrush, 0, 0, img.Width, img.Height);
        // drawing your generated image over new one
        g.DrawImage(result, new Point(0,0));
        // drawing text
        g.DrawString(inputData, font, brush,  result.Width, (result.Height - textHeight) / 2, format);
    }
    
    img.Save(tempFileName);