一个二维码矢量绘制方法的记录

本文介绍了如何在C#中使用DataMatrix.net和Zxing.Net库来创建高保真的二维码,重点在于通过像素点绘制避免失真。代码示例展示了如何使用这两个库的接口生成二维码的点阵,并将其转换为图形进行绘制,以适应缩放和打印需求。同时,文章提到了在绘制过程中可能遇到的卡顿问题,并给出了一种可能的解决方案。
摘要由CSDN通过智能技术生成

使用第三方的开源二维码生成工具:DataMatrix.net 以及 Zxing.Net

一、基本思路

普遍情况,网络上已有的例子,一般情况都是生成Bitmap位图的方式,该方式在放大、缩小、打印的情况下,会出现失真。

要求不失真的情况下,可以使用考虑矢量格式SVG。但是C#处理这种格式貌似有点难度,且需要第三方库的支持,比较麻烦。

所以保真基本思路是:用像素点的方式直接绘制。

遇到的问题:拖动,或者生成的时候,会有卡顿。

二、DataMatrix.net DMCode的绘制方法

DmtxImageEncoder.EncodeRawData 这个方法,提供了一个可以获取DMCode点阵数组的接口。

一个代码参考:

private void Refresh_DMCode(Graphics g,float Scaling)
{
	this.panel1.Controls.Clear();
	this.panel1.Refresh();

	DmtxImageEncoder Die = new DmtxImageEncoder();
	DataMatrix.net.DmtxImageEncoderOptions option = new DmtxImageEncoderOptions();
	option.SizeIdx = DmtxSymbolSize.DmtxSymbol32x32;//形状
	option.MarginSize = 0;//边距
	option.ModuleSize = 2;//点阵大小

	bool[,] datas = Die.EncodeRawData("W1234567890.09877654321##$340000PP.END", option);

	SolidBrush mybrush = new SolidBrush(Color.Black);

	int row_count = datas.GetLength(0); // 行数
	int col_count = datas.GetLength(1); // 列数

	// 计算每个像素块大小
	int pix_width = (int)((width / col_count)* Scaling);
	int pix_height = (int)((height / row_count)* Scaling);

	for (int i = 0; i < row_count; i++)
	{
		for (int j = 0; j < col_count; j++)
		{
			// 画二维码,纵向
			// 计算起始XY
			int x = i * pix_width;
			int y = j * pix_height;
			if (datas[i, j] == true)
			{
				g.FillRectangle(mybrush, start_x + x, start_y + y, pix_width, pix_height);
			}
		}
	}
}

三、Zxing.net QRCode的绘制方法

BarcodeWriter.Encode 方法,提供了一个获取像素级别点阵数组的接口。

一个代码参考:

private void Refresh_QRCode(Graphics g, float Scaling)
{
	this.panel1.Controls.Clear();
	this.panel1.Refresh();

	BarcodeWriter writer = new BarcodeWriter();
	writer.Format = BarcodeFormat.QR_CODE;

	QrCodeEncodingOptions options = new QrCodeEncodingOptions()
	{
		DisableECI = true,
		CharacterSet = "UTF-8",
		Width = (int)(width* Scaling),
		Height = (int)(height * Scaling),
		Margin = 0,
		QrVersion = 2,
	};

	options.ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H;

	writer.Options = options;

	BitMatrix bm = writer.Encode("1234567899999");

	for (int i = 0; i < bm.Height; i++)
	{
		BitArray ba = bm.getRow(i, null);

		for (int j = 0; j < ba.Size; j++)
		{
			//datas[i, j] = bm[i, j];
			if (ba[j])
			{
				//rects[bm.Height * i + j] = new Rectangle(j + RelativeY, i + RelativeX, 1, 1);
				g.FillRectangle(Brushes.Black, j + start_x, i + start_y, 1, 1);
			}
		}
	}
}

参考:

​​​​​​C# GDI+绘制一维条码打印模糊的解决办法_weixin_33881140的博客-CSDN博客

一个gitee:

COMTest: 一个 二维码 放大、缩小、的例子

补充DMCode改善:

// 计算每个像素块大小
double pix_width = this.Width*1.0 / col_count*1.0;
double pix_height = this.Height * 1.0 / row_count * 1.0;

for (int i = 0; i < row_count; i++)
{
    for (int j = 0; j < col_count; j++)
    {
        // 画二维码,纵向
        // 计算起始XY
        float x = (float)Math.Round(i * pix_width,1);
        float y = (float)Math.Round(j * pix_height,1);
        if (datas[i, j] == true)
        {
            g.FillRectangle(mybrush_black, RelativeX + x, RelativeY + y,(int)Math.Ceiling(pix_width), (int)Math.Ceiling(pix_height));
        }
        else
        {
            g.FillRectangle(mybrush_white, RelativeX + x, RelativeY + y, (int)Math.Ceiling(pix_width), (int)Math.Ceiling(pix_height));
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值