Valip
Valip

Reputation: 4640

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);
    }
}

Upvotes: 1

Views: 4727

Answers (1)

Andrey Korneyev
Andrey Korneyev

Reputation: 26886

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);

Upvotes: 3

Related Questions