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

特别注意需要引入 库文  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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用WebRTC实现点对点实时音视频通信的技术详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebRTC实现点对点实时音视频通信的技术详解 使用WebRTC实现点对点实时音视频通信的技术详解 使用WebRTC实现点对点实时音视频…

执行flink sql连接clickhouse库

手把手教学&#xff0c;flink connector打通clickhouse大数据库&#xff0c;通过下发flink sql&#xff0c;来使用ck。 组件版本jdk1.8flink1.17.2clickhouse23.12.2.59 1.背景 flink官方不支持clickhouse连接器&#xff0c;工作中难免会用到。 2.方案 利用GitHub大佬提供…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

基于Java Springboot宠物猫售卖管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况&#xff0c;一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…

数据结构查找-哈希表(开发地址法+线性探测法)+(创建+查找+删除代码)+(C语言代码)

#include<stdlib.h> #include<stdio.h> #include<stdbool.h> #define NULLKEY -1//单元为空 #define DELKEY -2//单元内容被删除 #define M 20 typedef struct {int key;//关键字int count;//统计哈希冲突探测次数 }HashTable; //插入到哈希表 void InsertHT…

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…

【电子设计】按键LED控制与FreeRTOS

1. 安装Keilv5 打开野火资料,寻找软件包 解压后得到的信息 百度网盘 请输入提取码 提取码:gfpp 安装526或者533版本都可以 下载需要的 F1、F4、F7、H7 名字的 DFP pack 芯片包 安装完 keil 后直接双击安装 注册操作,解压注册文件夹后根据里面的图示步骤操作 打开说明 STM…

vue3【实战】切换白天黑夜(暗黑模式)【组件封装】DarkMode.vue

效果预览 原理解析 切换为暗黑模式时&#xff0c;会在 html 标签上添加样式类 dark导入 ElementPlus 的暗黑模式样式后&#xff0c; ElementPlus 组件会自动响应暗黑模式自定义组件需用 UnoCSS 的 dark: 语法自定义暗黑模式的样式 代码实现 技术方案 vue3 vite ElementPlus …

基于单片机的多功能环保宠物窝设计

本设计基于单片机设计的多功能环保宠物窝&#xff0c;利用温湿度传感器、压力传感模块、气味传感模块、红外测温传感器、通信模块、显示模块、清扫部件等&#xff0c;使其能够实现自动检测并调节温湿度、补充宠物食物、检测宠物体温健康并出现异常时进行报警、自动清扫消毒宠物…

MySql结合element-plus pagination的分页查询

实现效果如下&#xff1a; 重点&#xff1a;使用mysql查询的limit和offset 原生SQL写法&#xff1a; select c.id as deptid,c.name as department,position,a.name staffname,2024-11 as shijian ,CASE WHEN b.shijian IS NULL THEN no ELSE yes END AS submit from fa_wecom…

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时&#xff0c;可以在计算属性中使用forEach方法 1.语法&#xff1a;集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景&#xff1a;例如下面…

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

前端页面自适应等比例缩放 Flexible+rem方案

在移动互联网时代&#xff0c;随着智能手机和平板电脑的普及&#xff0c;前端开发者面临的一个重要挑战是如何让网页在不同尺寸和分辨率的设备上都能良好地显示。为了应对这一挑战&#xff0c;阿里巴巴的前端团队开发了 flexible.js&#xff0c;旨在提供一种简单有效的解决方案…

记录一下在原有的接口中增加文件上传☞@RequestPart

首先&#xff0c;咱声明一下&#xff1a; RequestBody和 MultipartFile 不可以 同时使用&#xff01;&#xff01;&#xff01; 因为这两者预期的请求内容类型不同。RequestBody 预期请求的 Content-Type 是 application/json 或 application/xml&#xff0c;而 MultipartFile …

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

【qt】控件2

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…

Idea中创建和联系MySQL等数据库

备注&#xff1a;电脑中要已下好自己需要的MySQL数据库软件 MySQL社区版下载链接&#xff1a; https://dev.mysql.com/downloads/installer/ 优点&#xff1a; 1.相比与在命令行中管理数据库&#xff0c;idea提供了图形化管理&#xff0c;简单明了&#xff1b; 2.便于与后端…

【Unity】网格系统:物体使用网格坐标定位

需求分析 前面物体放置在地板上都是地板任意位置放置&#xff0c;本节开始对物体放置的位置做限制。 建立网格&#xff0c;网格可以设置起始世界坐标、单元格大小和规格&#xff1b;单元格中包括内部物体的信息&#xff1b;物体的位置通过网格的坐标确定&#xff1b;单元格中…