Как создать изображение штрих-кода с помощью XZing.Net и ImageSharp в.Net Core 2.0

Я пытаюсь создать изображение штрих-кода. Когда я использую следующий код, я могу создать 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))); 
          }
      } 
  } 

Ниже приведены некоторые фрагменты кода. Они могут писать контент и легко преобразовывать данные результатов в base64 строка. Но когда я звоню 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 ответ

Решение

Текущая версия (0.16.2) средства визуализации данных пикселей использует неправильное значение альфа-канала. Весь штрих-код прозрачен. Дополнительно с моей версией 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))); 
          }
      } 
  } 
Другие вопросы по тегам