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