C#条码识别的解决方案(ZBar)
简介
主流的识别库主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR码检测和解码功能。本文使用的是ZBar,同等条件下ZBar识别率更高,图片和部分代码参考在C#中使用ZBar识别条形码。
使用ZBar
通过NuGet安装ZBar,必须使用1.0.0版本,最新的1.0.2版本无法自动生成相关的dll并且使用不了1.0.0版的dll。
库默认支持netcoreapp3.1,在.NET6环境下也能正常使用,正常情况下输出目录会自动生成lib文件夹和dll文件。
注:ZBar 1.0.0在x86平台下可正常运行,但Debug会报错,建议使用x64或AnyCPU。
条码识别:
/// <summary>
/// 条码识别
/// </summary>
static List<ZBar.Symbol> ScanBarCode(string filename)
{
var bitmap = (Bitmap)Image.FromFile(filename);
bitmap = MakeGrayscale3(bitmap);
List<ZBar.Symbol> result = new List<ZBar.Symbol>();
using (var scanner = new ZBar.ImageScanner())
{
var symbols = scanner.Scan(bitmap);
if (symbols != null && symbols.Count > 0)
{
result.AddRange(symbols);
}
}
return result;
}
/// <summary>
/// 处理图片灰度
/// </summary>
static Bitmap MakeGrayscale3(Bitmap original)
{
//create a blank bitmap the same size as original
Bitmap newBitmap = new Bitmap(original.Width, original.Height);
//get a graphics object from the new image
Graphics g = Graphics.FromImage(newBitmap);
//create the grayscale ColorMatrix
System.Drawing.Imaging.ColorMatrix colorMatrix = new System.Drawing.Imaging.ColorMatrix(
new float[][]
{
new float[] {.3f, .3f, .3f, 0, 0},
new float[] {.59f, .59f, .59f, 0, 0},
new float[] {.11f, .11f, .11f, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 0, 1}
});
//create some image attributes
ImageAttributes attributes = new ImageAttributes();
//set the color matrix attribute
attributes.SetColorMatrix(colorMatrix);
//draw the original image on the new image
//using the grayscale color matrix
g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
//dispose the Graphics object
g.Dispose();
return newBitmap;
}
使用方法:
Console.WriteLine(ZBar.ZBar.Version);
var symbols = ScanBarCode("426301-20160127111209879-611759974.jpg");
string result = string.Empty;
symbols.ForEach(s => Console.WriteLine($"条码类型:{s.Type} 条码内容:{s.Data} 条码质量:{s.Quality}"));
Console.ReadKey();
扩展:其它条码识别库
在C#平台下还有一个ThoughtWorks.QRCode库也支持条码解析,具体效果还没有测试。原始代码最后的版本是在2015年,后面的版本只是将库做了个标准版,按自己的需求选择版本:
- ThoughtWorks.QRCode:原始版本,最后更新时间2015年。
- ThoughtWorks.QRCode.Standard(推荐使用):netstandard2.0版本,修复bug,增加了自动QRCodeVersion功能。
- ThoughtWorks.QRCode.Core:netstandard2.0版本,功能未修复变更。
识别库使用方法参考:C#使用zxing,zbar,thoughtworkQRcode解析二维码,附源代码。
扩展:开源扫码软件
推荐一个C# WPF 原生开发的在电脑上识别条码的工具软件QrCodeScanner,功能如下:
- 支持四种模式:截图识别 + 摄像头识别 + 本地图片识别 + 作为扫描枪使用
- 支持Zbar和Zxing两种主流引擎
- 支持多码同扫
- 支持Material Design缤纷主题色与暗黑模式
- 独创的扫描枪模式

附件
- 测试项目、开源备份(提取码: f4gp):https://pan.baidu.com/s/1OxpUv-8ApDWznxtSvbbNWg
C#条码识别的解决方案(ZBar)的更多相关文章
- 现场打印智能无线PDA安卓POS 条码识别、打印、数据采集销售开单收银管理软件
现场打印安卓POS 条码识别.打印.数据采集管理软件 案例: 经营日化品牌,从事小型超市和日用品商店的批发配送业务. 公司以前的销售模式:三个业务员负责跑市场,每个人负责一个区域,平均每天每个人要去到 ...
- Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案
Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案
- 物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器
物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器 VX : orihard2014 标签: 条码识别扫码器, 自动分拣读码器, 物流扫码固定式扫描相机, 物流扫码相机
- 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
转自:http://www.2cto.com/database/201503/386267.html 中文显示问号 转自:http://zhidao.baidu.com/link?url=qJDmsa ...
- liunx环境,摄像头无法识别,解决方案
今天无语了,linux14.04系统下,使用罗技c270摄像头.发现插上没有反应,系统版本: lenovo-myc@lenovomyc-Lenovo-Product:~/Downloads$ unam ...
- django models class 不识别问题解决方案
目录 1. 事情起因 2. 排查经过 3. 总结 1. 事情起因 今天在写代码的时候,在django 的models目录中新增了一个pkg.py文件,里面定义了一个class, 在执行 makemig ...
- html2canvas 识别 svg 解决方案
参考: 预览地址 http://jsfiddle.net/bv16o50f/1/ html <div class="visualization"> <svg xm ...
- 在C#中使用ZBar识别条形码
目录: 一.识别库 二.从一张图片中提取多个条形码 三.注意事项 从博客园学了很多,本着分享的目的,希望后来者遇到类似问题时,不必重复造轮子,早点下班回家^-^. 一.识别库 目前主流的识别库主要有Z ...
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...
- C# 条形码识别
目录: 一.识别库 二.从一张图片中提取多个条形码 三.注意事项 从博客园学了很多,本着分享的目的,希望后来者遇到类似问题时,不必重复造轮子,早点下班回家^-^. 一.识别库 目前主流的识别库主要有Z ...
随机推荐
- PXE+Kickstart 自动化部署系统
PXE 预启动执行环境是由Intel开发的技术,可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持PXE技术),主要用于在无人值守安装系统中引导客户端主机安装Linux操作系统. Kic ...
- django批量插入,遇到错误改为逐条插入
为了提升插入数据的效率,通常采用批量插入的方式,当一批数据中有错误数据时,该批次数据报错,都插入失败.如何跳过引起报错的数据,将其他正确的数据插入,实现方式如下代码. data_to_insert = ...
- 在K8S中,节点故障驱逐pod过程时间怎么定义?
在Kubernetes中,节点故障驱逐Pod的过程涉及多个参数和组件的相互作用.以下是该过程的简要概述: 默认设置:在默认配置下,节点故障时,工作负载的调度周期约为6分钟. 关键参数: node-mo ...
- Vite4+Typescript+Vue3+Pinia 从零搭建(2) - ts配置
项目代码同步至码云 weiz-vue3-template 关于tsconfig的配置字段可查看其他文档,如 typeScript tsconfig配置详解 tsconfig.json 文件修改如下: ...
- Vulkan学习苦旅05:马不停蹄地渲染(创建交换链VkSwapchainKHR)
通俗地说,渲染图像就是为图像的每个像素选择合适的颜色.例如,如果图像的分辨率为1920x1080,表示图像中有1920x1080个像素,渲染的过程,就是为每个位置的像素计算出合适的颜色.具体来说,假设 ...
- 看New Bing回答世纪难题:女友和妈妈掉水里先救谁
1.女友和妈妈掉水里先救谁 今天好奇想看看New Bing怎么回答这种世纪难题 结果New Bing非常聪明,反手建议我不要直接回答这个问题,而是换个角度哄女朋友,带着点不甘心,我继续追问它 New ...
- 编译型,解释型,java
编译型:将全部程序翻译为计算机能理解执行的代码 解释型:边运行程序边翻译,解释一点运行一点 java先编译再解释,将java文件编译为class文件,class文件再通过解释器翻译给操作系统运行
- liveness-probe探针和readness-probe
目录 探针 liveness-probe 存活探针 探针的3种方式 1. exec 2. httpGet 3. tcpSocket readness-probe 就绪探针 1. exec 2. htt ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第7章)-- 读书笔记(中)
第 7 章 高级主题 7.2 并发 当两个用户获取同一个资源后,再同时修改该资源,就会导致并发问题 常见实现并发的方法有以下两种: 保守式并发控制,每次修改资源,都锁定资源 开放式并发控制,每次修改资 ...
- 好书推荐之《JAVA编程思想》
名人推荐 真是一本透着编程思想的书. 上面的书让你从微观角度了解 Java,而这本书则可以让你从一个宏观角度了解 Java. 这本书和 Java 核心技术的厚度差不多,但这本书的信息密度比较大. 所以 ...