163 lines
5.8 KiB
C#
163 lines
5.8 KiB
C#
|
|
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();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|