Files
barcodeManager/LibShapes/Core/Shape/ShapeBarcode.cs
2026-01-24 08:45:54 +08:00

163 lines
5.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Io.Github.Kerwinxu.LibShapes.Core.Converter;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
using ZXing.QrCode.Internal;
using ZXing.Rendering;
namespace Io.Github.Kerwinxu.LibShapes.Core.Shape
{
public class ShapeBarcode : ShapeVar
{
/// <summary>
/// 构造函数
/// </summary>
public ShapeBarcode()
{
QrCodeErrorLevel = "容错7%"; // 默认这个
Encoding = "CODE_39"; // 默认编码
StaticText = "690123456789"; // 默认数字
isIncludeLabel = true; // 默认包含标签。
IsFill = true;
Font = new Font("Arial", 8); // 默认的字体
}
#region
/// <summary>
/// qr二维码的容错率
/// </summary>
[TypeConverter(typeof(QrCodeErrorCorrectionLevelConverter)), DescriptionAttribute("QR Code编码的容错率"), DisplayName("QR Code容错率"), CategoryAttribute("条形码设置")]
public string QrCodeErrorLevel { get; set; }
/// <summary>
/// 编码类型
/// </summary>
[TypeConverter(typeof(BarcodeEncodingConverter)), DescriptionAttribute("编码"), DisplayName("编码"), CategoryAttribute("条形码设置")]
public string Encoding { get; set; }
/// <summary>
/// 字体
/// </summary>
[DescriptionAttribute("请注意,这个字体是打印机上实际的字体,在界面上不会放大缩小。"), DisplayName("字体"), CategoryAttribute("字体")]
public Font Font { get; set; }
[DescriptionAttribute("是否包含标签"), DisplayName("包含标签"), CategoryAttribute("条形码设置")]
public bool isIncludeLabel { get; set; }
#endregion
public override ShapeEle DeepClone()
{
// 这里用json的方式
string json = JsonConvert.SerializeObject(this);
return JsonConvert.DeserializeObject<ShapeBarcode>(json);
//throw new NotImplementedException();
}
public override void Draw(Graphics g, Matrix matrix)
{
// 请注意,我这个算法是有瑕疵的,
// 这个角度实际上应该是最小内接矩形的角度,
// 这个是个小项目,应用场景是简单的图形操作,
// 如果群组里套图形加上群组有角度,会产生偏差。
// 1.0首先取得没有变换前的坐标
var path = GetGraphicsPath(matrix);
var rect = path.GetBounds(); // 外接矩形,如果是内接矩形是最准的。
// 这里需要将尺寸单位更改一下我的画布是mm而这个zxing估计是像素吧
var rect2 = new Rectangle()
{
//X = (int)(rect.X / 25.4 * g.DpiX),
//Y = (int)(rect.Y / 25.4 * g.DpiY),
Width = (int)(rect.Width / 25.4 * g.DpiX),
Height = (int)(rect.Height / 25.4 * g.DpiX),
};
// 我这里改成一开始就是1比1
// 中心点的坐标
var centerPoint = new PointF()
{
X = rect.X + rect.Width / 2,
Y = rect.Y + rect.Height / 2
};
// 2. 取得条形码图像
BarcodeWriter writer = new BarcodeWriter() {
Renderer = new BitmapRenderer() {
DpiX = g.DpiX,
DpiY = g.DpiY,
TextFont = this.Font,
}
};
writer.Format = BarcodeEncodingConverter.dictBarcode[Encoding]; // 编码
EncodingOptions options = new EncodingOptions()
{
Width = rect2.Width, // 图像的宽和高
Height = rect2.Height,
PureBarcode = !isIncludeLabel, // 是否包括标签。
Margin = 2,
};
if (Encoding == "QR_CODE")
{
options = new QrCodeEncodingOptions() {
Width = (int)rect2.Width, // 图像的宽和高
Height = (int)rect2.Height,
PureBarcode = !isIncludeLabel, // 是否包括标签。
Margin = 2,
ErrorCorrection=QrCodeErrorCorrectionLevelConverter.level[QrCodeErrorLevel],
};
}
writer.Options = options;
var text = getText();
if (string.IsNullOrEmpty(text))
{
// 如果没有,就话一个矩形吧。就什么都不做。
}
else
{
var bitmap = writer.Write(text); // 生成条形码图像。
if (bitmap != null)
{
// 3. 转换。
Matrix matrix1 = new Matrix();
matrix1.RotateAt(this.Angle, centerPoint);
g.Transform = matrix1; // 应用这个变换。
// 4.
g.DrawImage(bitmap, rect.X, rect.Y, rect.Width, rect.Height);
//5.
g.ResetTransform(); // 取消这个变换
}
}
//base.Draw(g, matrix);
}
public override GraphicsPath GetGraphicsPathWithAngle()
{
// 这个直接是返回父类的,
return base.GetGraphicsPathWithAngle();
}
}
}