菜鸟驿站二维码/一维码 取件识别功能

news/2024/11/22 23:45:11/

特别注意需要引入 库文  ZXing

可跳转:

记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
using System.Drawing; 
using ZXing;
using System.Diagnostics;
using ImageMagick;
using System.IO;namespace ZXing1
{class Program{static void Main(string[] args){// 创建一个 Stopwatch 实例Stopwatch stopwatch = new Stopwatch();// 启动计时stopwatch.Start();GetSN();// 获取总用时TimeSpan timeElapsed = stopwatch.Elapsed;Console.WriteLine($"视觉识别总用时: {timeElapsed.TotalSeconds} S");Console.Read();}static List<string> CheckRETURN = new List<string>();public static void GetSN(){string outLab = Environment.CurrentDirectory + "\\WIN_1.jpg";string SnRetu = Getlab(outLab);Console.WriteLine(SnRetu);}public static void Caijian(string inputPath, string outputPath, int x, int y, int width, int height){// 加载原始图片using (Bitmap originalBitmap = new Bitmap(inputPath)){//Bitmap rotatedBitmap = RotateImage(originalBitmap, 90);//根据需求旋转90// 定义裁剪区域(x, y, width, height)Rectangle cropArea = new Rectangle(x, y, width, height); // 修改这些值以适应你的需求// 创建裁剪后的图片using (Bitmap croppedBitmap = CropImage(originalBitmap, cropArea)){// 保存裁剪后的图片croppedBitmap.Save(outputPath);//blackwrit(outputPath, outputPath);}}}static Bitmap CropImage(Bitmap source, Rectangle cropArea){// 确保裁剪区域在源图像范围内if (cropArea.X < 0 || cropArea.Y < 0 || cropArea.Right > source.Width || cropArea.Bottom > source.Height){throw new ArgumentException("裁剪区域超出了图像边界");}Bitmap croppedImage = new Bitmap(cropArea.Width, cropArea.Height);using (Graphics g = Graphics.FromImage(croppedImage)){g.DrawImage(source, new Rectangle(0, 0, cropArea.Width, cropArea.Height),cropArea, GraphicsUnit.Pixel);}return croppedImage;}public static string Getlab(string imagePath){var barcodeBitmap = (Bitmap)System.Drawing.Image.FromFile(imagePath);var barcodeReader = new BarcodeReader{Options = new ZXing.Common.DecodingOptions{// 支持多种条形码格式,包括二维码PossibleFormats = new List<BarcodeFormat>{BarcodeFormat.CODE_128, BarcodeFormat.CODE_39, BarcodeFormat.EAN_13,BarcodeFormat.EAN_8, BarcodeFormat.UPC_A, BarcodeFormat.UPC_E,BarcodeFormat.QR_CODE, BarcodeFormat.DATA_MATRIX}}};var result = barcodeReader.DecodeMultiple(barcodeBitmap);string strlab = string.Empty;if (result != null){strlab = result[0].ToString();int op = 0;foreach (var item in result){Console.WriteLine("识别内容: " + item.Text);DrawBarcodeRectangle(barcodeBitmap, item);op++;}Console.WriteLine($"共识别条码:{op}个");}else{strlab = "FAIL";Console.WriteLine("未能识别内容");}Console.WriteLine("========================模板识别========================");return strlab;}public static void DrawBarcodeRectangle(Bitmap frame, ZXing.Result result){// 获取条码位置的四个角点var points = result.ResultPoints;using (Graphics g = Graphics.FromImage(frame)){Pen pen = new Pen(Color.Green, 10); // 设置绘制矩形的颜色和宽度if (points.Length == 2){// 对于只检测到两个点的情况(例如一维条码),画一条线g.DrawLine(pen, new PointF(points[0].X, points[0].Y), new PointF(points[1].X, points[1].Y));float x = Math.Min(points[0].X, points[1].X);float y = Math.Min(points[0].Y, points[1].Y);g.DrawString(result.Text, new Font("Arial", 32, FontStyle.Bold), new SolidBrush(Color.Red), x,y);  // 将文字显示在矩形框的上方}else if (points.Length >= 4){// 如果有四个点,画出矩形框g.DrawPolygon(pen, new PointF[]{new PointF(points[0].X, points[0].Y),new PointF(points[1].X, points[1].Y),new PointF(points[2].X, points[2].Y),new PointF(points[3].X, points[3].Y)});}}// 显示结果图像ShowImage(frame);}// 用画图工具显示图片public static void ShowImage(Bitmap image){// 使用 System.Windows.Forms.PictureBox 或者你喜好的方法来显示图像using (var form = new System.Windows.Forms.Form()){form.Text = "Barcode Detected";var pictureBox = new System.Windows.Forms.PictureBox{Image = image,Dock = System.Windows.Forms.DockStyle.Fill,SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage};form.Controls.Add(pictureBox);form.ShowDialog();}}}
}

使用效果:

如果对条码不知道裁剪的方法如何使用可阅读我的另一篇文章:

c# 视觉识别图片文字_c# 识别二维码-CSDN博客


http://www.ppmy.cn/news/1548688.html

相关文章

虚拟化表格(Virtualized Table)性能优化

文章目录 功能介绍一开始的代码领导让我们分析一下开始优化如何监听事件和传参&#xff1f;定位操作栏更加优化 功能介绍 菜鸟最近做的一个功能如下&#xff1a; 后端返回两个很大的数组&#xff0c;例如&#xff1a;数组a 1w条&#xff0c;数组b 2w条&#xff0c;然后要操作b…

项目技术栈-解决方案-web3去中心化

web3去中心化 Web3 DApp区块链:钱包:智能合约:UI:ETH系开发技能树DeFi应用 去中心化金融P2P 去中心化网络参考Web3 DApp 区块链: 以以太坊(Ethereum)为主流,也包括Solana、Aptos等其他非EVM链。 区块链本身是软件,需要运行在一系列节点上,这些节点组成P2P网络或者半…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…

Linux光标快捷键

左右移动光标 Ctrl B&#xff1a;光标向左移动一个字符Ctrl F&#xff1a;光标向右移动一个字符 上下移动光标 Ctrl P&#xff1a;光标向上移动一行&#xff08;等同于上箭头键&#xff09;Ctrl N&#xff1a;光标向下移动一行&#xff08;等同于下箭头键&#xff09; 词…

Node.js 安装与开发环境配置全指南

**标题&#xff1a;Node.js 安装与开发环境配置全指南** --- ### 一、Node.js 简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;用于构建高效、可扩展的网络应用程序。它以事件驱动、非阻塞 I/O 为特性&#xff0c;非常适合构建实时应用程序&am…

【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读

文章目录 前言1. jcxz 指令1.1 什么是jcxz指令1.2 如何操作 2. loop 指令2.1 什么是loop指令2.2 如何操作 3. 根据位移进行转移的意义3.1 为什么&#xff1f;3.2 举例说明 4. 编译器对转移位移超界的检测结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构…

C++ —— 剑斩旧我 破茧成蝶—C++11

江河入海&#xff0c;知识涌动&#xff0c;这是我参与江海计划的第2篇。 目录 1. C11的发展历史 2. 列表初始化 2.1 C98传统的{} 2.2 C11中的{} 2.3 C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期…

深入浅出学算法005-数7

任务内容 Description 逢年过节&#xff0c;三五好友&#xff0c;相约小聚&#xff0c;酒过三旬&#xff0c;围桌数七。 “数七”是一个酒 桌上玩的小游戏。就是按照顺序&#xff0c;某人报一个10以下的数字&#xff0c;然后后面的人依 次在原来的数字上加1&#xff0c;并喊出来…