适用于.NET的ZXing条码扫描器

时间:2016-02-02 10:14:05

标签: c# barcode zxing barcode-scanner

我正在尝试使用此库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。我在这做错了什么? 以下是示例图片:

enter image description here

1 个答案:

答案 0 :(得分:1)

我终于完全重启,因为没有按预期工作。

我实现了以下算法:如果解码器没有读取条形码,请将图像拆分为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\6.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;
    }
}