在C#中使用ZBar识别条形码
标签:reac using line mes wim code class zxing aging
目录:
一.识别库
二.从一张图片中提取多个条形码
三.注意事项
从博客园学了很多,本着分享的目的,希望后来者遇到类似问题时,不必重复造轮子,早点下班回家^-^。
一.识别库
目前主流的识别库主要有ZXing.NET和ZBar,这里我使用的是ZBar,ZXing.NET也试过,同等条件下,识别率不高。
ZBar相关类库包括:libzbar.dll,libzbar-cil.dll,libiconv-2.dll;
很奇怪为什么不能直接引用libzbar.dll,实际使用时引用的是libzbar-cil.dll,libiconv-2.dll是libzbar-cil.dll用来映射libzbar.dll的。
ZBar识别库包含在源码中,文末可直接下载。
二.从一张图片中提取多个条形码
先上截图:
需要提取条形码的图片:
识别结果
主要代码:
///
/// 条码识别
///
private void ScanBarCode(string fileName)
{
DateTime now = DateTime.Now;
Image primaryImage = Image.FromFile(fileName);
Bitmap pImg = MakeGrayscale3((Bitmap)primaryImage);
using (ZBar.ImageScanner scanner = new ZBar.ImageScanner())
{
scanner.SetConfiguration(ZBar.SymbolType.None, ZBar.Config.Enable, 0);
scanner.SetConfiguration(ZBar.SymbolType.CODE39, ZBar.Config.Enable, 1);
scanner.SetConfiguration(ZBar.SymbolType.CODE128, ZBar.Config.Enable, 1);
List symbols = new List();
symbols = scanner.Scan((Image)pImg);
if (symbols != null && symbols.Count > 0)
{
string result = string.Empty;
symbols.ForEach(s => result += "条码内容:" + s.Data + " 条码质量:" + s.Quality + Environment.NewLine);
MessageBox.Show(result);
}
}
}
///
/// 处理图片灰度
///
///
///
public 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;
}
三.注意事项
如果条码识别率不高,考虑是图片的DPI不够。我的项目初期使用的是500万像素的高拍仪,拍出来的图片识别率始终不高,DPI为96。后来更换为800万像素的高拍仪,DPI为120,识别率从60%直接上升到95%+。当然,也需要对图片做一些裁剪。另外,灰度处理是必须的,可减少拍摄照片时反光引起的识别率不高问题。
在C#中使用ZBar识别条形码
标签:reac using line mes wim code class zxing aging
原文地址:http://www.cnblogs.com/w2206/p/7755656.html
评论