'Replacing System.Drawing with ImageSharp for Barcode .net core 6

As we have upgraded to net core 6 we are rewriting some of our code base. We have a tag helper in AspNet Core which generates a barcode. This currently uses System.Drawing and ZXing.

TagHelper Old version using System.Drawing - working (top barcode)

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    var margin = 0;
    var qrCodeWriter = new ZXing.BarcodeWriterPixelData
    {
        Format = ZXing.BarcodeFormat.PDF_417,
        Options = new ZXing.Common.EncodingOptions
        {
            Height = this.Height > 80 ? this.Height : 80,
            Width = this.Width > 400 ? this.Width : 400,
            Margin = margin
        }
    };
    var pixelData = qrCodeWriter.Write(QRCodeContent);
    // creating a bitmap from the raw pixel data; if only black and white colors are used it makes no difference
    // that the pixel data ist BGRA oriented and the bitmap is initialized with RGB
    using (var bitmap = new Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb))
    using (var ms = new MemoryStream())
    {
        var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height),
        System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        try
        {
            // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image
            System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0,
            pixelData.Pixels.Length);
        }
        finally
        {
            bitmap.UnlockBits(bitmapData);
        }
        // save to stream as PNG
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        output.TagName = "img";
        output.Attributes.Clear();
        output.Attributes.Add("width", Width);
        output.Attributes.Add("height", Height);
        output.Attributes.Add("alt", Alt);
        output.Attributes.Add("src",
        $"data:image/png;base64,{Convert.ToBase64String(ms.ToArray())}");
    }
}

TagHelper new version using ImageSharp - almost working but not exactly (bottom barcode)

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    var margin = 0;
    var barcodeWriter = new ZXing.ImageSharp.BarcodeWriter<SixLabors.ImageSharp.PixelFormats.La32>
    {
        Format = ZXing.BarcodeFormat.PDF_417,
        Options = new ZXing.Common.EncodingOptions
        {
            Height = this.Height > 80 ? this.Height : 80,
            Width = this.Width > 400 ? this.Width : 400,
            Margin = margin
        }
    };

    var image = barcodeWriter.Write(QRCodeContent);
    output.TagName = "img";
    output.Attributes.Clear();
    output.Attributes.Add("width", Width);
    output.Attributes.Add("height", Height);
    output.Attributes.Add("alt", Alt);
    output.Attributes.Add("src", $"{image.ToBase64String(PngFormat.Instance)}");
} 

The issue is as mentioned the 2nd barcode is very slightly different at the end seems to extend the last bar.

What am I missing?

Results



Solution 1:[1]

That is a bug in the renderer implementation of the ZXing.Net binding to ImageSharp. https://github.com/micjahn/ZXing.Net/issues/422 It is fixed in the newest nuget package of the bindings. https://www.nuget.org/packages/ZXing.Net.Bindings.ImageSharp/ https://www.nuget.org/packages/ZXing.Net.Bindings.ImageSharp.V2/

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Michael