0

使用 ZBar-Sharp ( https://github.com/jonasfj/zbar-sharp ) ,使用 Image 类中的系统库处理图像,代码如下

================

public Image(System.Drawing.Image image) : this() {

    Byte[] data = new byte[image.Width * image.Height * 3];
    //Convert the image to RBG3
    using(Bitmap bitmap = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb)){
        using(Graphics g = Graphics.FromImage(bitmap)){
            g.PageUnit = GraphicsUnit.Pixel;
            g.DrawImageUnscaled(image, 0, 0);
        }
        // Vertically flip image as we are about to store it as BMP on a memory stream below
        // This way we don't need to worry about BMP being upside-down when copying to byte array
        bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
        using(MemoryStream ms = new MemoryStream()){
        bitmap.Save(ms, ImageFormat.Bmp);
        ms.Seek(54, SeekOrigin.Begin);
        ms.Read(data, 0, data.Length);
        }
    }
    //Set the data
    this.Data = data;
    this.Width = (uint)image.Width;
    this.Height = (uint)image.Height;
    this.Format = FourCC('R', 'G', 'B', '3');
}

================

后来从 Zbar 内部转换为 Y800。

但是,使用这种方法,当我将 ZBar 原生扫描与 99.x% 的正确率进行比较而 .Net 包装器只有 80% 时,扫描精度会受到影响。

由于 ZBar 本身使用图像魔法来处理图像,因此建议使用 imageMagic.Net 来处理图像并传递给 Zbar DLL,而不是使用 .Net 库。

所以我在想 ZBarSharp 里面的 Image 类应该用下面的重载来更新

==================

public Image(string fileName)
: this()
{
MagickImage image = new MagickImage(fileName, settings);

//Set the data
this.Data = image.ToByteArray();
this.Width = (uint)image.Width;
this.Height = (uint)image.Height;
this.Format = FourCC('R', 'G', 'B', '3');
}

==================

但是,我意识到,虽然原始 .Net 库创建了长度约为 5650614 且偏移量为 54 的图像 Byte[] 以在一个特定文件上获得 5650560,但 imageMagic 读取同一文件并生成长度为 15194 的 Byte[],这显着更小,而且来自 imageMagic.Net 的 Byte[] 总是从扫描中得不到任何结果。我已经尝试了许多不同的 imageMagic Read 的密度、格式等设置,但数组长度总是很短,我没有从扫描中得到任何结果。

只是想知道是否有人可以帮助我指出我错过了什么,以便将 imageMagic.Net 用于 .Net 库产生的类似等价物,但质量更好?

谢谢你的建议。

4

0 回答 0