ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。而ZXing.Net是ZXing的端口之一。
nuget安装SqlSugarCore
这里还需要做一个配制文件,用于保存一个配制信息,如数据库等等
安装Microsoft.Extensions.Configuration,用于读取配制文件,这是一个接口
安装Microsoft.Extensions.Configuration.Json
Config.json
JSON{
"ConnectionString": "Server=127.0.0.1;Database=bzscada;Max Pool Size=50;Min Pool Size=5;Uid=sa;Pwd=123" // 库连接字符串
}
Conifg.cs配制保存类
C#public class Config
{
public static string connectionString { get; set; } = "";
}
我们在窗口启动时加载配制
C#static void Main()
{
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddJsonFile("config.json", true, true);
IConfigurationRoot root = builder.Build();
Config.connectionString = root["ConnectionString"] ?? "";
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new FrmMain());
}
Repository.cs一个仓库类,用于数据库操作
C#public class Repository<T>:SimpleClient<T> where T : class,new()
{
public Repository(ISqlSugarClient context) : base(context)
{
base.Context = new SqlSugarClient(new ConnectionConfig
{
ConnectionString=Config.connectionString,
DbType=DbType.SqlServer,
IsAutoCloseConnection=true
});
}
}
实体类wms_inventory
C#public class wms_inventory
{
[SqlSugar.SugarColumn(IsPrimaryKey =true)]
public Guid id { get; set; }
public string asn_no { get; set; }
public string part_no { get; set; }
public int qty { get; set; }
public string box_no{get;set;}
public string rack_no { get; set; }
}
服务类inventoryService
C#public class inventoryService : Repository<wms_inventory>
{
public inventoryService()
{
}
public async Task<List<wms_inventory>> Get()
{
return await base.AsQueryable().Take(100).ToListAsync();
}
}
列表
C#List<ListViewItem> CacheSource = new List<ListViewItem>();
C#public void Init()
{
lsvMain.Columns.Add("asn_no");
lsvMain.Columns.Add("part_no");
lsvMain.Columns.Add("qty");
lsvMain.Columns.Add("box_no");
lsvMain.Columns.Add("rack_no");
}
C#private void LoadItems()
{
lsvMain.Items.Clear();
lsvMain.GridLines = true;
lsvMain.FullRowSelect = true;
lsvMain.View = View.Details;
lsvMain.Scrollable = true;
lsvMain.MultiSelect = false;
lsvMain.HeaderStyle = ColumnHeaderStyle.Clickable;
lsvMain.Visible = true;
lsvMain.VirtualListSize = CacheSource.Count;
lsvMain.VirtualMode = true;
lsvMain.RetrieveVirtualItem += LsvMain_RetrieveVirtualItem; //虚模式加载
}
C#private void LsvMain_RetrieveVirtualItem(object? sender, RetrieveVirtualItemEventArgs e)
{
if (this.CacheSource == null || this.CacheSource.Count == 0)
{
return;
}
e.Item = this.CacheSource[e.ItemIndex];
if (e.ItemIndex == this.CacheSource.Count)
{
this.CacheSource = null;
}
}
C#private async void btnLoad_Click(object sender, EventArgs e)
{
inventoryService inventory = new inventoryService();
var lst = await inventory.Get();
foreach (var item in lst)
{
ListViewItem it = new ListViewItem();
it.Text = item.asn_no;
it.SubItems.Add(item.part_no);
it.SubItems.Add(item.qty.ToString());
it.SubItems.Add(item.box_no);
it.SubItems.Add(item.rack_no);
CacheSource.Add(it);
}
LoadItems();
}
lsvMain_ItemSelectionChanged 事件
C#private List<ListViewItem> FindSelectedAll()
{
List<ListViewItem> r = new List<ListViewItem>();
foreach (int item in lsvMain.SelectedIndices)
{
r.Add(CacheSource[item]);
}
return r;
}
C#List<ListViewItem> selected = FindSelectedAll();
string codeType = "QR_CODE";
BarcodeFormat codeformat = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), codeType);
ZXing.BarcodeWriter<Rgba32> writer = new ZXing.BarcodeWriter<Rgba32>();
QrCodeEncodingOptions qr = new QrCodeEncodingOptions()
{
CharacterSet = "UTF-8",
ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H,
Height = picPartNo.Width,
Width = picPartNo.Height,
Margin = 0//默认应该是1
};
writer.Options = qr;
writer.Format = codeformat;
var image = writer.WriteAsImageSharp<Rgba32>(selected[0].SubItems[1].Text);
var ms = new MemoryStream();
await image.SaveAsync(ms, new PngEncoder());
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
picPartNo.Image= img;
C#List<ListViewItem> selected = FindSelectedAll();
BarcodeWriter writer = new BarcodeWriter();
writer.Options = new ZXing.Common.EncodingOptions
{
Width = picPartNo.Width,
Height = picPartNo.Height,
Margin = 0,
};
writer.Format = BarcodeFormat.QR_CODE;
Bitmap bitmap = writer.WriteAsBitmap(selected[0].SubItems[1].Text);
picPartNo.Image = bitmap;
code128码条
C#writer.Options = new ZXing.Common.EncodingOptions
{
Width = picQty.Width,
Height = picQty.Height,
Margin = 0,
};
writer.Format = BarcodeFormat.CODE_128;
Bitmap bitmap2 = writer.WriteAsBitmap(selected[0].SubItems[2].Text);
picQty.Image = bitmap2;
条码读取
C#BarcodeReader barcodeReader = new BarcodeReader();
OpenFileDialog dialog=new OpenFileDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
System.Drawing.Image img = Bitmap.FromFile(dialog.FileName);
var ret= barcodeReader.Decode((Bitmap)img);
MessageBox.Show(ret.Text);
}
将条码保存到图片
C#private void picQty_Click(object sender, EventArgs e)
{
SaveFileDialog saveFile = new SaveFileDialog();
if (saveFile.ShowDialog() == DialogResult.OK) {
picQty.Image.Save(saveFile.FileName);
}
}
在条码基础上重画
C#Graphics g = picCode.CreateGraphics();
g.Clear(Color.White);
g.DrawImage(bitmap1, 0, 0);
g.DrawString(selected[0].SubItems[1].Text, new Font("宋体", 14)
, new SolidBrush(Color.Red), new PointF(0, bitmap1.Height)
);
Font f = new Font("宋体", 36);
string measureString = selected[0].SubItems[2].Text;
SizeF stringSize = new SizeF();
stringSize =g.MeasureString(measureString, f);
g.DrawString(selected[0].SubItems[2].Text, f
, new SolidBrush(Color.Blue), new PointF(bitmap1.Width
, (bitmap1.Height- stringSize.Height)/ 2)
);
C#private async void lsvMain_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
List<ListViewItem> selected = FindSelectedAll();
string codeType = "QR_CODE";
BarcodeFormat codeFormat = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), codeType);
//GDI+
ZXing.BarcodeWriter<Rgba32> writer = new BarcodeWriter<Rgba32>();
QrCodeEncodingOptions qr = new QrCodeEncodingOptions()
{
CharacterSet = "UTF-8",
ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H,
Height = pic1.Height,
Width = pic1.Width,
Margin = 0
};
writer.Options = qr;
writer.Format = codeFormat;
var image = writer
.WriteAsImageSharp<Rgba32>(selected[0].SubItems[1].Text);
var ms = new MemoryStream();
await image.SaveAsync(ms, new PngEncoder());
var pubimg = Image.FromStream(ms);
pic1.Image = pubimg;
BarcodeWriter writer1 = new BarcodeWriter();
writer.Options = new ZXing.Common.EncodingOptions
{
Width = pic2.Width,
Height = pic2.Height,
Margin = 0,
};
writer.Format = BarcodeFormat.CODE_128;
Bitmap bitmap2 = writer.WriteAsBitmap(selected[0].SubItems[2].Text);
pic2.Image = bitmap2;
Bitmap bitmap3 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bitmap3);
g.Clear(Color.White);
g.DrawImage(pubimg, 0, 0);
g.DrawString(selected[0].SubItems[1].Text
, new Font("宋体", 14)
, new SolidBrush(Color.Red)
, new PointF(0, pubimg.Height));
Font f = new Font("宋体", 36);
string measureString = selected[0].SubItems[2].Text;
SizeF stringSize = new SizeF();
stringSize = g.MeasureString(measureString, f);
g.DrawString(selected[0].SubItems[2].Text, f
, new SolidBrush(Color.Blue), new PointF(pubimg.Width
, (pubimg.Height - stringSize.Height) / 2)
);
pictureBox1.Image = bitmap3;
}
C#private void btnPrint_Click(object sender, EventArgs e)
{
PrintDocument document = new PrintDocument();
document.DefaultPageSettings.PrinterSettings
.PrinterName = "Microsoft Print to PDF";
PaperSize psz = new PaperSize();
psz.RawKind = 0;// Printing.PaperKind.Custom此枚举的值是0
psz.Width = 350;
psz.Height = 350;
document.DefaultPageSettings.PaperSize = psz; //设置纸张大小
document.PrintPage += Document_PrintPage;
document.Print();
}
private void Document_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawImage(pictureBox1.Image,new Point(0,0));
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!