簡體   English   中英

需要一種在WPF C#VS2017中使用大小為1英寸的DevExpress輸出QR代碼的方法

[英]Need a way to output QR Code using DevExpress that is 1 inch in size in WPF C# VS2017

我正在Windows 10和VS 2017上使用DevExpress 18.1作為WPF應用程序。 另外,我正在使用DevExpress BarCode類。 我正在嘗試創建尺寸為1英寸的QR碼,但是如果不使用Photoshop之類的工具來縮小輸出,就無法做到。 我認為我在此過程中一定會缺少一些東西。 下面是使用的代碼:

using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Windows;
using DevExpress.BarCodes;


namespace WpfBarcode01
{        
  public partial class MainWindow : Window
  {        
    public MainWindow()
    {
      InitializeComponent();
    }

    private void Btn_1_Click(object sender, RoutedEventArgs e)
    {
    BarCode barCode = new BarCode();
      barCode.Symbology = Symbology.QRCode;
      barCode.CodeText = 
      "Alexander Johnathon Stevenson JR;Senior Software Developer;alexanderjohnathonstevensonjr@somesamplewebsite.com;20180709-08:00:00;9993334444;Los Angeles;CA;USA;ABC Company";
      barCode.BackColor = Color.White;
      barCode.ForeColor = Color.Black;
      barCode.RotationAngle = 0;
      barCode.CodeBinaryData = Encoding.Default.GetBytes(barCode.CodeText);
      barCode.Options.QRCode.Version = QRCodeVersion.Version5;
      barCode.Options.QRCode.CompactionMode = QRCodeCompactionMode.Byte;
      barCode.Options.QRCode.ErrorLevel = QRCodeErrorLevel.H;
      barCode.Options.QRCode.ShowCodeText = false;
      barCode.DpiX = 100;
      barCode.DpiY = 100;
      barCode.AutoSize = false;
      barCode.Unit = GraphicsUnit.Millimeter;
      barCode.ImageWidth = (float)70;
      barCode.ImageHeight = (float)70;        
      barCode.BarCodeImage.Save("d1.png", System.Drawing.Imaging.ImageFormat.Png);

      Process.Start("d1.png");
    }
  }
}

運行此程序時,將創建一個QR碼,手持掃描器可以在紙上和屏幕上進行掃描。 問題是它的尺寸約為2.76英寸。 我想要一個大約1英寸的文件,所以最終將.png文件導入到Photoshop中,並將圖像尺寸減小到1英寸。 當圖像現在變得足夠小以進行標簽或文檔打印時,此方法起作用。 如果有人必須為幾百個QR代碼執行此工作,則此工作流似乎太耗時。

我為ImageWidth和ImageHeight嘗試了不同的值,為DpiX和DPiY嘗試了不同的值,但是沒有運氣。 我試圖將GraphicsUnit更改為Inches,但是該選項似乎不起作用,因為我總是得到非常不規則尺寸的圖像。 因此,我最終以1英寸= 25.4毫米為基礎使用了GraphicsUnit的Millimeter選項。 如果我使用的ImageWidth或ImageHeight值小於65,則QR Code框將被裁剪,並且對掃描無效。

還有什么我可以做的,以使輸出為1英寸並且仍然有效嗎? 還是在DevExpress中有一些圖形庫調用,我可以像Photoshop那樣調用以將.png文件減小到1英寸? 提前致謝。

====================================

更新2018年7月9日

根據下面的PepitoSH的建議鏈接,我能夠找到一個在代碼更新中添加到此處的解決方案。 此代碼將生成一個1英寸的.png QRCode文件,該文件是從原始尺寸2.76英寸調整的大小。

using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Text;
using System.Windows;
using DevExpress.BarCodes;

namespace WpfBarcode01
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {

    public MainWindow()
    {
      InitializeComponent();
    }

    private void Btn_1_Click(object sender, RoutedEventArgs e)
    {
    BarCode barCode = new BarCode();
      barCode.Symbology = Symbology.QRCode;
      barCode.CodeText = 
      "Alexander Johnathon Stevenson JR;Senior Software Developer;alexanderjohnathonstevensonjr@somesamplewebsite.com;20180709-08:00:00;9993334444;Los Angeles;CA;USA;ABC Company";
      barCode.BackColor = Color.White;
      barCode.ForeColor = Color.Black;
      barCode.RotationAngle = 0;
      barCode.CodeBinaryData = Encoding.Default.GetBytes(barCode.CodeText);
      barCode.Options.QRCode.Version = QRCodeVersion.Version5;
      barCode.Options.QRCode.CompactionMode = QRCodeCompactionMode.Byte;
      barCode.Options.QRCode.ErrorLevel = QRCodeErrorLevel.H;
      barCode.Options.QRCode.ShowCodeText = false;
      barCode.Dpi = 200;
      barCode.AutoSize = false; //needs to be off if specifying unit and widths
      barCode.Unit = GraphicsUnit.Millimeter;  // Note: 1 inch = 25.4 Millimeters    
      barCode.ImageWidth = 70F;
      barCode.ImageHeight = 70F;

      Bitmap bitmap = ResizeImage(barCode.BarCodeImage, 200, 200);

      bitmap.Save("QRCode.png");

      Process.Start("QRCode.png");
    }


    public static Bitmap ResizeImage(Image originalImage, int newWidthInPixels, int newHeightInPixels)
    {
      var destRect  = new Rectangle(0, 0, newWidthInPixels, newHeightInPixels);
      var destImage = new Bitmap(newWidthInPixels, newHeightInPixels);

      destImage.SetResolution(originalImage.HorizontalResolution, originalImage.VerticalResolution);

      using (var graphics = Graphics.FromImage(destImage))
      {
        graphics.CompositingMode    = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode      = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode    = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
          wrapMode.SetWrapMode(WrapMode.TileFlipXY);
          graphics.DrawImage(originalImage, destRect, 0, 0, originalImage.Width, originalImage.Height, GraphicsUnit.Pixel, wrapMode);
        }
      }

      return destImage;
    }
  }
}

更新2018年7月9日

基於PepitoSH的建議鏈接,我能夠找到一個在代碼更新中添加到此處的解決方案。 此代碼將生成一個1英寸的.png QRCode文件,該文件是從原始尺寸2.76英寸調整的大小。

using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Text;
using System.Windows;
using DevExpress.BarCodes;

namespace WpfBarcode01
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {

    public MainWindow()
    {
      InitializeComponent();
    }

    private void Btn_1_Click(object sender, RoutedEventArgs e)
    {
    BarCode barCode = new BarCode();
      barCode.Symbology = Symbology.QRCode;
      barCode.CodeText = 
      "Alexander Johnathon Stevenson JR;Senior Software Developer;alexanderjohnathonstevensonjr@somesamplewebsite.com;20180709-08:00:00;9993334444;Los Angeles;CA;USA;ABC Company";
      barCode.BackColor = Color.White;
      barCode.ForeColor = Color.Black;
      barCode.RotationAngle = 0;
      barCode.CodeBinaryData = Encoding.Default.GetBytes(barCode.CodeText);
      barCode.Options.QRCode.Version = QRCodeVersion.Version5;
      barCode.Options.QRCode.CompactionMode = QRCodeCompactionMode.Byte;
      barCode.Options.QRCode.ErrorLevel = QRCodeErrorLevel.H;
      barCode.Options.QRCode.ShowCodeText = false;
      barCode.Dpi = 200;
      barCode.AutoSize = false; //needs to be off if specifying unit and widths
      barCode.Unit = GraphicsUnit.Millimeter;  // Note: 1 inch = 25.4 Millimeters    
      barCode.ImageWidth = 70F;
      barCode.ImageHeight = 70F;

      Bitmap bitmap = ResizeImage(barCode.BarCodeImage, 200, 200);

      bitmap.Save("QRCode.png");

      Process.Start("QRCode.png");
    }


    public static Bitmap ResizeImage(Image originalImage, int newWidthInPixels, int newHeightInPixels)
    {
      var destRect  = new Rectangle(0, 0, newWidthInPixels, newHeightInPixels);
      var destImage = new Bitmap(newWidthInPixels, newHeightInPixels);

      destImage.SetResolution(originalImage.HorizontalResolution, originalImage.VerticalResolution);

      using (var graphics = Graphics.FromImage(destImage))
      {
        graphics.CompositingMode    = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode      = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode    = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
          wrapMode.SetWrapMode(WrapMode.TileFlipXY);
          graphics.DrawImage(originalImage, destRect, 0, 0, originalImage.Width, originalImage.Height, GraphicsUnit.Pixel, wrapMode);
        }
      }

      return destImage;
    }
  }
}

暫無
暫無

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

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