簡體   English   中英

用 ImageSharp 替換 System.Drawing for Barcode .net core 6

[英]Replacing System.Drawing with ImageSharp for Barcode .net core 6

當我們升級到 .net core 6 時,我們正在重寫我們的一些代碼庫。 我們在 AspNet Core 中有一個標簽助手,它可以生成條形碼。 目前使用 System.Drawing 和 ZXing。

TagHelper 舊版本使用 System.Drawing - 工作(頂部條形碼)

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())}");
    }
}

使用 ImageSharp 的 TagHelper 新版本 - 幾乎可以工作但不完全正確(底部條形碼)

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)}");
} 

問題如前所述,第二個條形碼在末尾略有不同,似乎延伸了最后一個條形碼。

我錯過了什么?

結果

這是 ZXing.Net 綁定到 ImageSharp 的渲染器實現中的錯誤。 https://github.com/micjahn/ZXing.Net/issues/422在最新的nuget package的綁定中修復。 https://www.nuget.org/packages/ZXing.Net.Bindings.ImageSharp/ https://www.nuget.org/packages/ZXing.Net.Bindings.ImageSharp.V2/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM