代码之家  ›  专栏  ›  技术社区  ›  ilker unal

如何使用ZXing创建条形码图像。Net和ImageSharp输入。Net Core 2.0

  •  6
  • ilker unal  · 技术社区  · 7 年前

    我正在尝试生成条形码图像。当我使用以下代码时,我可以创建 base64 字符串,但它给出了一个空白图像。我检查的内容不是空白或空白。

    有代码使用 CoreCompat.System.Drawing 但我无法让它工作,因为我在OS X环境中工作。

    我做错什么了吗?

    代码:

      [HtmlTargetElement("barcode")] 
      public class BarcodeHelper: TagHelper { 
          public override void Process(TagHelperContext context, TagHelperOutput output) { 
              var content = context.AllAttributes["content"].Value.ToString(); 
              var alt = context.AllAttributes["alt"].Value.ToString(); 
              var width = 250;  
              var height = 250;
              var margin = 0; 
              var barcodeWriter = new ZXing.BarcodeWriterPixelData { 
                  Format = ZXing.BarcodeFormat.CODE_128, 
                      Options = new QrCodeEncodingOptions { 
                          Height = height, Width = width, Margin = margin 
                      } 
              }; 
    
              var pixelData = barcodeWriter.Write(content); 
    
              using (var image = Image.LoadPixelData<Rgba32>(pixelData.Pixels, width, height))
              {
                  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", string.Format("data:image/png;base64,{0}", image.ToBase64String(ImageFormats.Png))); 
              }
          } 
      } 
    

    下面是一些代码片段。他们可以编写内容并轻松地将结果数据转换为 基本64 一串但是当我打电话的时候 BarcodeWriter 它需要一个类型 <TOutput> 我不知道该送什么。我正在使用 ZXing.Net 0.16.2.

              var writer = BarcodeWriter // BarcodeWriter without <TOutput> is missing. There is BarcodeWriter<TOutput> I can call.
              {
                  Format = BarcodeFormat.CODE_128 
              }
    
              var result = writer.write("content");
    
    1 回复  |  直到 4 年前
        1
  •  9
  •   Michael    7 年前

    当前版本(0.16.2)的像素数据渲染器使用了错误的alpha通道值。整个条形码是透明的。 此外,对于我的ImageSharp版本,我必须删除以下部分 "data:image/png;base64,{0}", 因为 image.ToBase64String 已包含此项。

    完成修改代码:

      [HtmlTargetElement("barcode")] 
      public class BarcodeHelper: TagHelper { 
          public override void Process(TagHelperContext context, TagHelperOutput output) { 
              var content = context.AllAttributes["content"].Value.ToString(); 
              var alt = context.AllAttributes["alt"].Value.ToString(); 
              var width = 250;  
              var height = 250;
              var margin = 0; 
              var barcodeWriter = new ZXing.BarcodeWriterPixelData { 
                  Format = ZXing.BarcodeFormat.CODE_128, 
                  Options = new EncodingOptions { 
                      Height = height, Width = width, Margin = margin 
                  },
                  Renderer = new PixelDataRenderer {
                      Foreground = new PixelDataRenderer.Color(unchecked((int)0xFF000000)),
                      Background = new PixelDataRenderer.Color(unchecked((int)0xFFFFFFFF)),
                  }
              }; 
    
              var pixelData = barcodeWriter.Write(content); 
    
              using (var image = Image.LoadPixelData<Rgba32>(pixelData.Pixels, width, height))
              {
                  output.TagName = "img"; 
                  output.Attributes.Clear(); 
                  output.Attributes.Add("width", pixelData.Width); 
                  output.Attributes.Add("height", pixelData.Height); 
                  output.Attributes.Add("alt", alt); 
                  output.Attributes.Add("src", string.Format( image.ToBase64String(ImageFormats.Png))); 
              }
          } 
      } 
    

    也可以使用ImageSharp绑定包(ZXing.Net.Bindings.ImageSharp)。

      [HtmlTargetElement("barcode")] 
      public class BarcodeHelper: TagHelper { 
          public override void Process(TagHelperContext context, TagHelperOutput output) { 
              var content = context.AllAttributes["content"].Value.ToString(); 
              var alt = context.AllAttributes["alt"].Value.ToString(); 
              var width = 250;  
              var height = 250;
              var margin = 0; 
              var barcodeWriter = new ZXing.ImageSharp.BarcodeWriter<Rgba32> { 
                  Format = ZXing.BarcodeFormat.CODE_128, 
                  Options = new EncodingOptions { 
                      Height = height, Width = width, Margin = margin 
                  }
              }; 
    
              using (var image = barcodeWriter.Write(content))
              {
                  output.TagName = "img"; 
                  output.Attributes.Clear(); 
                  output.Attributes.Add("width", image.Width); 
                  output.Attributes.Add("height", image.Height); 
                  output.Attributes.Add("alt", alt); 
                  output.Attributes.Add("src", string.Format( image.ToBase64String(ImageFormats.Png))); 
              }
          } 
      } 
    
    推荐文章