0

I am using DevExpress 18.1 on Windows 10 with VS 2017 for a WPF application. Additionally I am using the DevExpress BarCode Class. I am trying to create a QR Code that is 1 inch in size but am unable to do it without using something like Photoshop to shrink the output. I think I must be missing something in the process. Below is the code being used:

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

When this runs, a QR Code is created which a hand held scanner is able to scan both on paper and screen. The problem is it is about 2.76 inches in size. I want one about 1 inch so I end up importing the .png file to Photoshop and reducing the image size to 1 inch. This works as the images now becomes small enough for label or document printing. This workflow though seems too time consuming if someone has to do this for a few hundred QR Codes.

I tried different values for the ImageWidth and ImageHeight as well as different values for DpiX and DPiY but no luck. And I tried to change the GraphicsUnit to Inches but that option does not seem to work as I always get an image of very irregular size. So I ended up using the Millimeter option for GraphicsUnit with a basis that 1 inch = 25.4 millimeters. If I use an ImageWidth or ImageHeight value lower than 65 the QR Code box gets clipped and becomes invalid for scanning.

Is there something else I can do to make the output be 1 inch and still valid? Or perhaps some graphic library call in DevExpress I can call to reduce the .png file to 1 inch like Photoshop does? Thanks in advance.

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

Update July 9, 2018

Based on PepitoSH's suggested link below I was able to find a solution which I have added here in the code update. This code produces a 1 inch .png QRCode file which is a resize from the original that was 2.76 inches.

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;
    }
  }
}
Robertcode
  • 911
  • 1
  • 13
  • 26
  • If it cannot be achieved with the BarCode component to get custom size images, why don't you just resize the resulting image to any pixel size and dpi you wish? – PepitoSh Jul 10 '18 at 02:53
  • @pepitoSh As the description says I was resizing manually with Photoshop after the image was created but I need a programming solution. If there is .Net way to resize then I'd like to hear about it. At this point I'm tempted to purchase the LeadTools SDK for resizing but I want to see if there is another way. – Robertcode Jul 10 '18 at 03:02
  • 1
    Sure there is a way to resize images using c#. e.g. https://stackoverflow.com/questions/1922040/resize-an-image-c-sharp – PepitoSh Jul 10 '18 at 03:06
  • @PepitoSH the link you provided contained a solution I could use. I am updating my original note to include the solution. Thanks – Robertcode Jul 10 '18 at 05:36
  • @Robertcode Can you post your update as a solution and accept it so that this thread is marked as having an accepted answer, people with same issue might not even look at your thread as it is still mark as having no answer. – Roger Leblanc Aug 15 '18 at 00:08

1 Answers1

0

Update July 9, 2018

Based on PepitoSH's suggested link I was able to find a solution which I have added here in the code update. This code produces a 1 inch .png QRCode file which is a resize from the original that was 2.76 inches.

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;
    }
  }
}
Robertcode
  • 911
  • 1
  • 13
  • 26