ZXing-Core中的BitMatrix转换为BitMap

3
我正在使用ZXing-Core(0.14.0.2)创建条形码,它给我一个BitMatrix,但是我没有找到如何从BitMatrix中提取图像部分并将其用作BitMap的文档,以便我可以将其合并到我的大图像中。最终,我想得到的是这样的东西:

White Image With Barcode at the bottom

我目前拥有的代码是:
img = new Bitmap(300, 375);
drawing = Graphics.FromImage(img);
var barCode = new Code128Writer().encode(packageModel.TrackingId.PrintValue, BarcodeFormat.CODE_128, 280, 70);
src = transform **barCode** to **Drawing.Image**
drawing.DrawImage(src, new Rectangle(10, 255, 280, 70));

更新 现在我有了这段代码,但是我遇到了一个错误您必须设置渲染器实例。我不明白为什么接口不能自己实例化这个类。没有可用的文档揭示这应该如何工作。我无法使用Write函数,因为渲染设置为null,但我不知道如何实例化它。

IBarcodeWriterGeneric<Image> barcodeWriterGeneric = new BarcodeWriterGeneric<Image>
{

      Format = BarcodeFormat.CODE_128,
      Options = new EncodingOptions
      {
            Width = 280,
            Height = 70
      },
      Renderer = new PixelData() //HOW DOES THE RENDERER WORK????
};

var test = barcodeWriterGeneric.Write("WORKS");
drawing.DrawImage(test, new Rectangle(10, 255, 280, 70));
2个回答

2
创建一个实现 IBarcodeRenderer<TOut> 接口的渲染器。这个在 iOS 上适用。请注意保留 HTML 标签,不做任何解释。
var writer = new BarcodeWriter<UIImage>()
{
    Format = ZXing.BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Height = height,
        Width = width,
        Margin = 0
    },
    Renderer = new BarcodeRenderer()
};

var image = writer.Write(barcodeValue);



private class BarcodeRenderer : IBarcodeRenderer<UIImage>
{
    public UIImage Render(BitMatrix matrix, ZXing.BarcodeFormat format, string content)
    {
        return RenderMatrix(matrix);
    }

    public UIImage Render(BitMatrix matrix, ZXing.BarcodeFormat format, string content, EncodingOptions options)
    {
        return RenderMatrix(matrix);
    }
}

/// <summary>
/// Renders the bitmatrix.
/// </summary>
private static UIImage RenderMatrix(BitMatrix matrix)
{
    var width = matrix.Width;
    var height = matrix.Height;

    var black = new CGColor(0f, 0f, 0f);
    var white = new CGColor(1.0f, 1.0f, 1.0f);

    UIGraphics.BeginImageContext(new CGSize(width, height));
    var context = UIGraphics.GetCurrentContext();

    for (var x = 0; x < width; x++)
    {
        for (var y = 0; y < height; y++)
        {
            context.SetFillColor(matrix[x, y] ? black : white);
            context.FillRect(new CGRect(x, y, 1, 1));
        }
    }

    var img = UIGraphics.GetImageFromCurrentImageContext();

    UIGraphics.EndImageContext();

    return img;
}

1
据我所见,ZXing-Core分支缺少PixelDataRenderer类。它只包含RawRenderer。你应该切换到原始的ZXing.Net包,当前版本为0.15.0。其中包含条形码编写器类“BarcodeWriterPixelData”,该类执行Renderer属性的必要初始化。下一个版本的ZXing.Net将包含更多专门绑定到其他.Net Core兼容的成像库,如CoreCompat.System.Drawing、ImageSharp、OpenCV等。通过这些绑定,您可以生成除PixelData之外的其他输出格式。

在克隆ZXing-Core存储库后,我得出了同样的结论,即ZXing-Core包中缺少关键类。过去几个小时我一直在苦思冥想。我将尝试使用ZXIng.Net包,但我不确定是否能够在我的Web API核心项目中安装它。感谢您的答案,这证实了我的怀疑。 - Lostaunaum
ZXing.Net的版本0.16.0已经发布。有一种特殊的NuGet包可用,可以直接支持CoreCompat.System.Drawing。 https://www.nuget.org/packages/ZXing.Net.Bindings.CoreCompat.System.Drawing/ 您现在可以使用类ZXing.CoreCompat.System.Drawing.BitmapWriter。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接