将自定义图像或文本添加到 ZXing.Net 生成的二维码
Add custom image or text to QR code generated by ZXing.Net
我用ZXing.Net库生成二维码图片-
在我的顶部 class:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
我的方法:
protected void UpdateQRSource(String address)
{
QRCodeWriter qrcode = new QRCodeWriter();
BarcodeWriter barcodeWriter = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new EncodingOptions
{
Width = 300,
Height = 300,
Margin = 4
}
};
using (Bitmap bitmap = barcodeWriter.Write(address))
{
IntPtr hbmp = bitmap.GetHbitmap();
try
{
BitmapSource source = Imaging.CreateBitmapSourceFromHBitmap(
hbmp,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
qrImage.Source = source; // set WPF image source
}
finally
{
DeleteObject(hbmp);
}
}
}
请告诉我如何在 QR 码中间添加短文本字符串或自定义图像 - 类似于下面的 Wikipedia visual QR code:
更新:
在 QR 码中嵌入自定义徽标(不破坏后者!)似乎不是一项微不足道的任务,正如科学出版物 QR Images: Optimized Image Embedding in QR Codes 所示...
但我仍然想知道我是否可以生成一个二维码(如上面的源代码),然后用自定义文本或徽标覆盖它,然后通过 ZXing.Net 再次验证生成的图像。
由于您从 ZXing 中获得了位图,因此您可以使用标准的 C# 技术来绘制文本。有关详细信息,请参阅此答案:
c# write text on bitmap
为了后代,这里有一些无耻的复制代码:
Bitmap bmp = //from ZXing;
RectangleF rectf = new RectangleF(70, 90, 90, 50);
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.DrawString("yourText", new Font("Tahoma",8), Brushes.Black, rectf);
g.Flush();
开始吧(您可以使用任何徽标):
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using ZXing;
using ZXing.QrCode.Internal;
using ZXing.Rendering;
namespace Test
{
public partial class Form1 : Form
{
private string imagePath = @"YourPath";
private string url = @"https://en.WIKIPEDIA.ORG/";
private int size = 400;
public Form1()
{
InitializeComponent();
pictureBox1.Image = GenerateQR(size, size, url);
pictureBox1.Height = size;
pictureBox1.Width = size;
Console.WriteLine(checkQR(new Bitmap(pictureBox1.Image)));
}
public bool checkQR(Bitmap QrCode)
{
var reader = new BarcodeReader();
var result = reader.Decode(QrCode);
if (result == null)
return false;
return result.Text == url;
}
public Bitmap GenerateQR(int width, int height, string text)
{
var bw = new ZXing.BarcodeWriter();
var encOptions = new ZXing.Common.EncodingOptions
{
Width = width,
Height = height,
Margin = 0,
PureBarcode = false
};
encOptions.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
bw.Renderer = new BitmapRenderer();
bw.Options = encOptions;
bw.Format = ZXing.BarcodeFormat.QR_CODE;
Bitmap bm = bw.Write(text);
Bitmap overlay = new Bitmap(imagePath);
int deltaHeigth = bm.Height - overlay.Height;
int deltaWidth = bm.Width - overlay.Width;
Graphics g = Graphics.FromImage(bm);
g.DrawImage(overlay, new Point(deltaWidth/2,deltaHeigth/2));
return bm;
}
}
结果:
并且输出:
True
我用ZXing.Net库生成二维码图片-
在我的顶部 class:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
我的方法:
protected void UpdateQRSource(String address)
{
QRCodeWriter qrcode = new QRCodeWriter();
BarcodeWriter barcodeWriter = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new EncodingOptions
{
Width = 300,
Height = 300,
Margin = 4
}
};
using (Bitmap bitmap = barcodeWriter.Write(address))
{
IntPtr hbmp = bitmap.GetHbitmap();
try
{
BitmapSource source = Imaging.CreateBitmapSourceFromHBitmap(
hbmp,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
qrImage.Source = source; // set WPF image source
}
finally
{
DeleteObject(hbmp);
}
}
}
请告诉我如何在 QR 码中间添加短文本字符串或自定义图像 - 类似于下面的 Wikipedia visual QR code:
更新:
在 QR 码中嵌入自定义徽标(不破坏后者!)似乎不是一项微不足道的任务,正如科学出版物 QR Images: Optimized Image Embedding in QR Codes 所示...
但我仍然想知道我是否可以生成一个二维码(如上面的源代码),然后用自定义文本或徽标覆盖它,然后通过 ZXing.Net 再次验证生成的图像。
由于您从 ZXing 中获得了位图,因此您可以使用标准的 C# 技术来绘制文本。有关详细信息,请参阅此答案:
c# write text on bitmap
为了后代,这里有一些无耻的复制代码:
Bitmap bmp = //from ZXing;
RectangleF rectf = new RectangleF(70, 90, 90, 50);
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.DrawString("yourText", new Font("Tahoma",8), Brushes.Black, rectf);
g.Flush();
开始吧(您可以使用任何徽标):
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using ZXing;
using ZXing.QrCode.Internal;
using ZXing.Rendering;
namespace Test
{
public partial class Form1 : Form
{
private string imagePath = @"YourPath";
private string url = @"https://en.WIKIPEDIA.ORG/";
private int size = 400;
public Form1()
{
InitializeComponent();
pictureBox1.Image = GenerateQR(size, size, url);
pictureBox1.Height = size;
pictureBox1.Width = size;
Console.WriteLine(checkQR(new Bitmap(pictureBox1.Image)));
}
public bool checkQR(Bitmap QrCode)
{
var reader = new BarcodeReader();
var result = reader.Decode(QrCode);
if (result == null)
return false;
return result.Text == url;
}
public Bitmap GenerateQR(int width, int height, string text)
{
var bw = new ZXing.BarcodeWriter();
var encOptions = new ZXing.Common.EncodingOptions
{
Width = width,
Height = height,
Margin = 0,
PureBarcode = false
};
encOptions.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
bw.Renderer = new BitmapRenderer();
bw.Options = encOptions;
bw.Format = ZXing.BarcodeFormat.QR_CODE;
Bitmap bm = bw.Write(text);
Bitmap overlay = new Bitmap(imagePath);
int deltaHeigth = bm.Height - overlay.Height;
int deltaWidth = bm.Width - overlay.Width;
Graphics g = Graphics.FromImage(bm);
g.DrawImage(overlay, new Point(deltaWidth/2,deltaHeigth/2));
return bm;
}
}
结果:
并且输出:
True