适用于 .NET 的 ZXing 条码扫描器
ZXing barcode scanner for .NET
我正在尝试使用这个库 https://zxingnet.codeplex.com/。
图像已在此站点上成功解码 https://zxing.org/w/decode.jspx,但在我的代码中未成功解码。
以下是我尝试过的两种方法:
BarcodeReader reader = new BarcodeReader { AutoRotate = true, TryHarder = true, TryInverted = true, PossibleFormats = fmts };
Result result = reader.Decode(new Bitmap(@"D:\6.jpg"));
和:
public static byte[] ImageToByte(Bitmap img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
MultiFormatReader m_BarcodeReader = new MultiFormatReader();
var hints = new Dictionary<DecodeHintType, object>();
var fmts = new List<BarcodeFormat>();
fmts.Add(BarcodeFormat.EAN_13);
hints.Add(DecodeHintType.TRY_HARDER_WITHOUT_ROTATION, false);
hints.Add(DecodeHintType.POSSIBLE_FORMATS, fmts);
Result rawResult;
Bitmap image = new Bitmap(@"D:\6.jpg");
RGBLuminanceSource r = new RGBLuminanceSource(ImageToByte(image), image.Width, image.Height);
GlobalHistogramBinarizer x = new
HybridBinarizer(r);
BinaryBitmap bitmap = new BinaryBitmap(x);
try
{
rawResult = m_BarcodeReader.decode(bitmap, hints);
if (rawResult != null)
{
return rawResult.Text;
}
}
catch (ReaderException e)
{
}
两种情况下解码的结果都是null
。我在这里做错了什么?
这是示例图片:
我终于完全重启了,因为它没有按预期工作。
我实现了以下算法:如果解码器不读取条形码,将图像分成 4 份并重新启动。
之后效果很好,我认为这就是您提到的网站的工作方式。太糟糕了,它没有从头开始使用这种方法。
注意:这段代码远非完美,做了很多假设,如果你复制它并按原样使用它,如果你的代码可能会崩溃图片的格式与 OP
提供的格式不同
internal class Program
{
private static readonly List<BarcodeFormat> Fmts = new List<BarcodeFormat> { BarcodeFormat.All_1D };
static void Main(string[] args)
{
Bitmap originalBitmap = new Bitmap(@"C:\Users\me\Desktop.jpg");
Bitmap img = CropImage(originalBitmap, new Rectangle(0 , 0, originalBitmap.Width, originalBitmap.Height));
int width = img.Width;
int heigth = img.Height;
int nbOfFrames = 1;
bool found = false;
while (!found && width > 10 && heigth > 10)
{
if (DecodeImg(img))
{
break;
}
nbOfFrames *= 4;
width /= 2;
heigth /= 2;
var x = 0;
var y = 0;
for (int i = 0; i < nbOfFrames; i++)
{
img.Dispose();
img = new Bitmap(CropImage(originalBitmap, new Rectangle(x, y, width, heigth)));
if (DecodeImg(img))
{
found = true;
}
x += width;
if (x < originalBitmap.Width)
{
continue;
}
x = 0;
y += heigth;
if (y >= originalBitmap.Height)
{
y = 0;
}
}
}
}
public static Bitmap CropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
return bmpImage.Clone(cropArea, PixelFormat.Format24bppRgb);
}
public static bool DecodeImg(Bitmap img)
{
BarcodeReader reader = new BarcodeReader
{
AutoRotate = true,
TryInverted = true,
Options =
{
PossibleFormats = Fmts,
TryHarder = true,
ReturnCodabarStartEnd = true,
PureBarcode = false
}
};
Result result = reader.Decode(img);
if (result != null)
{
Console.WriteLine(result.BarcodeFormat);
Console.WriteLine(result.Text);
return true;
}
Console.Out.WriteLine("Raté");
return false;
}
}
我正在尝试使用这个库 https://zxingnet.codeplex.com/。 图像已在此站点上成功解码 https://zxing.org/w/decode.jspx,但在我的代码中未成功解码。
以下是我尝试过的两种方法:
BarcodeReader reader = new BarcodeReader { AutoRotate = true, TryHarder = true, TryInverted = true, PossibleFormats = fmts };
Result result = reader.Decode(new Bitmap(@"D:\6.jpg"));
和:
public static byte[] ImageToByte(Bitmap img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
MultiFormatReader m_BarcodeReader = new MultiFormatReader();
var hints = new Dictionary<DecodeHintType, object>();
var fmts = new List<BarcodeFormat>();
fmts.Add(BarcodeFormat.EAN_13);
hints.Add(DecodeHintType.TRY_HARDER_WITHOUT_ROTATION, false);
hints.Add(DecodeHintType.POSSIBLE_FORMATS, fmts);
Result rawResult;
Bitmap image = new Bitmap(@"D:\6.jpg");
RGBLuminanceSource r = new RGBLuminanceSource(ImageToByte(image), image.Width, image.Height);
GlobalHistogramBinarizer x = new
HybridBinarizer(r);
BinaryBitmap bitmap = new BinaryBitmap(x);
try
{
rawResult = m_BarcodeReader.decode(bitmap, hints);
if (rawResult != null)
{
return rawResult.Text;
}
}
catch (ReaderException e)
{
}
两种情况下解码的结果都是null
。我在这里做错了什么?
这是示例图片:
我终于完全重启了,因为它没有按预期工作。
我实现了以下算法:如果解码器不读取条形码,将图像分成 4 份并重新启动。
之后效果很好,我认为这就是您提到的网站的工作方式。太糟糕了,它没有从头开始使用这种方法。
注意:这段代码远非完美,做了很多假设,如果你复制它并按原样使用它,如果你的代码可能会崩溃图片的格式与 OP
提供的格式不同internal class Program
{
private static readonly List<BarcodeFormat> Fmts = new List<BarcodeFormat> { BarcodeFormat.All_1D };
static void Main(string[] args)
{
Bitmap originalBitmap = new Bitmap(@"C:\Users\me\Desktop.jpg");
Bitmap img = CropImage(originalBitmap, new Rectangle(0 , 0, originalBitmap.Width, originalBitmap.Height));
int width = img.Width;
int heigth = img.Height;
int nbOfFrames = 1;
bool found = false;
while (!found && width > 10 && heigth > 10)
{
if (DecodeImg(img))
{
break;
}
nbOfFrames *= 4;
width /= 2;
heigth /= 2;
var x = 0;
var y = 0;
for (int i = 0; i < nbOfFrames; i++)
{
img.Dispose();
img = new Bitmap(CropImage(originalBitmap, new Rectangle(x, y, width, heigth)));
if (DecodeImg(img))
{
found = true;
}
x += width;
if (x < originalBitmap.Width)
{
continue;
}
x = 0;
y += heigth;
if (y >= originalBitmap.Height)
{
y = 0;
}
}
}
}
public static Bitmap CropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
return bmpImage.Clone(cropArea, PixelFormat.Format24bppRgb);
}
public static bool DecodeImg(Bitmap img)
{
BarcodeReader reader = new BarcodeReader
{
AutoRotate = true,
TryInverted = true,
Options =
{
PossibleFormats = Fmts,
TryHarder = true,
ReturnCodabarStartEnd = true,
PureBarcode = false
}
};
Result result = reader.Decode(img);
if (result != null)
{
Console.WriteLine(result.BarcodeFormat);
Console.WriteLine(result.Text);
return true;
}
Console.Out.WriteLine("Raté");
return false;
}
}