适用于 .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;
    }
}