Пример #1
0
        internal static MemoryStream DrawImageMemoryStream(LinearEncoder linearEncoder)
        {
            MemoryStream memoryStream = new MemoryStream();

            Draw(ref memoryStream, linearEncoder);
            return(memoryStream);
        }
Пример #2
0
        /// <summary>
        /// Creates the label value image element.
        /// </summary>
        /// <param name="linearEncoder"></param>
        /// <param name="quietzone"></param>
        /// <returns>The generated label value image inside an ImageElement object.</returns>
        internal static ImageElement GetHumanReadableImageCentered(LinearEncoder linearEncoder, int quietzone)
        {
            // Create an empty ImageElement
            ImageElement humanReadableElement = new ImageElement();

            // If the human readable position is set to hidden, return the empty ImageElement
            if (linearEncoder.HumanReadablePosition == HumanReadablePosition.Hidden)
            {
                return(humanReadableElement);
            }

            // If the human readable is set to a visible position, but has no value, take the barcode value
            if (string.IsNullOrWhiteSpace(linearEncoder.HumanReadableValue))
            {
                linearEncoder.HumanReadableValue = linearEncoder.EncodedValue;
            }

            // Calculate the barcode image width from the minimum width multiplied by the x-dimension
            int barcodeWidth = linearEncoder.LinearEncoding.MinimumWidth * linearEncoder.XDimension;

            // Get the original human readable font size, so we can compare with the size after adjusting to fir barcode width
            int humanReadableFontSizeOriginal = (int)linearEncoder.HumanReadableFont.Size;

            // Adjust the human readable font size so that the value does not exceed the width of the barcode image
            linearEncoder.HumanReadableFont = ImageHelpers.GetSizedFontForWidth(linearEncoder.HumanReadableValue, barcodeWidth, linearEncoder.Dpi, linearEncoder.HumanReadableFont);

            // Set the human readable font size changed flag, if size different from original
            if (humanReadableFontSizeOriginal != (int)linearEncoder.HumanReadableFont.Size)
            {
                linearEncoder.HumanReadableFontSizeChanged = true;
            }

            // Measure the value label text size, based on the font provided
            SizeF labelTextSize = ImageHelpers.GetStringElementSize(linearEncoder.HumanReadableValue, linearEncoder.HumanReadableFont, linearEncoder.Dpi);

            // Create a new bitmap image for the label value text based on the calculated dimensions
            humanReadableElement.UpdateImage(new Bitmap((int)Math.Ceiling(labelTextSize.Width), (int)Math.Ceiling(labelTextSize.Height)));
            humanReadableElement.Image.SetResolution(linearEncoder.Dpi, linearEncoder.Dpi);

            // Create a new graphics to draw on the barcode image
            Graphics labelValueGraphics = Graphics.FromImage(humanReadableElement.Image);

            labelValueGraphics.FillRectangle(Brushes.White, 1, 1, humanReadableElement.Image.Width, humanReadableElement.Image.Height);
            labelValueGraphics.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            labelValueGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            labelValueGraphics.PixelOffsetMode   = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            labelValueGraphics.DrawString(linearEncoder.HumanReadableValue, linearEncoder.HumanReadableFont, Brushes.Black, 1, 1);
            labelValueGraphics.Flush();
            humanReadableElement.Position.XPosition = quietzone + (barcodeWidth - (int)labelTextSize.Width) / 2;

            return(humanReadableElement);
        }
        internal LinearVectors(LinearEncoder encoder)
        {
            Data.Clear();
            Width = encoder.LinearEncoding.MinimumWidth * encoder.XDimension;

            foreach (KeyValuePair <int, LinearSymbol> symbol in encoder.LinearEncoding.Symbols)
            {
                foreach (KeyValuePair <int, LinearModule> module in symbol.Value.Pattern)
                {
                    LinearModule newModule = new LinearModule(module.Value.ModuleType, module.Value.Width * encoder.XDimension);
                    Data.Add(Data.Count, newModule);
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Creates the barcode image element.
        /// </summary>
        /// <param name="linearEncoder"></param>
        /// <param name="quietzone"></param>
        /// <returns>The generated barcode image inside an ImageElement object.</returns>
        internal static ImageElement GetBarcodeImage(LinearEncoder linearEncoder, int quietzone)
        {
            // Set the encoding image width from the minimum width multiplied by the x-dimension
            int barcodeImageWidth = linearEncoder.LinearEncoding.MinimumWidth * linearEncoder.XDimension;

            // Create a new bitmap image for the barcode based on the calculated dimensions
            ImageElement barcodeElement = new ImageElement(new Bitmap(barcodeImageWidth, linearEncoder.BarcodeHeight));

            barcodeElement.Image.SetResolution(linearEncoder.Dpi, linearEncoder.Dpi);

            //Create a new graphics to draw on the barcode image
            Graphics barcodeGraphics = Graphics.FromImage(barcodeElement.Image);

            int xPosition = 0;
            int yPosition = 0;

            barcodeGraphics.FillRectangle(Brushes.White, xPosition, yPosition, barcodeElement.Image.Width, barcodeElement.Image.Height);

            // Loop through each encoded symbol and convert to bars based on selected symbology
            for (int symbol = 0; symbol <= linearEncoder.LinearEncoding.Symbols.Count - 1; symbol++)
            {
                LinearPattern symbolPattern = linearEncoder.LinearEncoding.Symbols[symbol].Pattern;

                // Build the barcode symbol and insert
                for (int module = 0; module <= symbolPattern.Count - 1; module++)
                {
                    switch (symbolPattern[module].ModuleType)
                    {
                    case ModuleType.Bar:     // Bar
                        int barWidth = symbolPattern[module].Width * linearEncoder.XDimension;
                        barcodeGraphics.FillRectangle(Brushes.Black, xPosition, yPosition, barWidth, linearEncoder.BarcodeHeight);
                        xPosition += barWidth;
                        barcodeGraphics.Flush();
                        break;

                    case ModuleType.Space:     // Space
                        int spaceWidth = symbolPattern[module].Width * linearEncoder.XDimension;
                        xPosition += spaceWidth;
                        break;
                    }
                }
            }

            barcodeElement.Position.XPosition = quietzone;
            return(barcodeElement);
        }
Пример #5
0
        private static void Draw(ref MemoryStream memoryStream, LinearEncoder linearEncoder)
        {
            int xDimensionOriginal = linearEncoder.XDimension;

            // Adjust x-dimension to match target width (if set)
            linearEncoder.XDimension = Math.Max(linearEncoder.XDimension, GetXDimensionForTargetWidth(linearEncoder.TargetWidth, linearEncoder.LinearEncoding.MinimumWidth));

            // Ensure the x-dimension selected doesn't result in a width that exceeds maximum allowable.
            linearEncoder.XDimension = Math.Min(linearEncoder.XDimension, GetXDimensionForTargetWidth(MaximumPixelWidth, linearEncoder.LinearEncoding.MinimumWidth));

            switch (linearEncoder.Symbology)
            {
            case Symbology.Ean13:
                linearEncoder.Quietzone = true;
                linearEncoder.SetHumanReadablePosition("Embedded");
                linearEncoder.HumanReadableSymbolAligned = true;
                break;

            case Symbology.UpcA:
                linearEncoder.Quietzone = true;
                linearEncoder.SetHumanReadablePosition("Embedded");
                linearEncoder.HumanReadableSymbolAligned = true;
                break;

            case Symbology.Ean8:
                linearEncoder.Quietzone = true;
                linearEncoder.SetHumanReadablePosition("Embedded");
                linearEncoder.HumanReadableSymbolAligned = true;
                break;
            }

            int quietzone = 0;

            if (linearEncoder.Quietzone)
            {
                quietzone = Math.Max(20 * linearEncoder.XDimension, linearEncoder.Dpi / 4) / 2;
            }

            // Create each of the image elements.
            ImageElement encodingTextImage = GetEncodingImage(linearEncoder, quietzone);
            ImageElement barcodeImage      = GetBarcodeImage(linearEncoder, quietzone);

            linearEncoder.BarcodeWidth = barcodeImage.Size.Width;

            ImageElement humanReadableImage = linearEncoder.HumanReadableSymbolAligned ? GetHumanReadableImageSymbolAligned(linearEncoder, quietzone) : GetHumanReadableImageCentered(linearEncoder, quietzone);

            // Adjust each element position, dependent on label text visibility and position.
            switch (linearEncoder.HumanReadablePosition)
            {
            case HumanReadablePosition.Above:         //Label above the barcode
                barcodeImage.Position.YPosition      += humanReadableImage.Size.Height;
                encodingTextImage.Position.YPosition += humanReadableImage.Size.Height + barcodeImage.Size.Height;
                break;

            case HumanReadablePosition.Embedded:         //Embedded the barcode
                barcodeImage.Position.YPosition       += encodingTextImage.Size.Height;
                humanReadableImage.Position.YPosition += encodingTextImage.Size.Height + barcodeImage.Size.Height - (humanReadableImage.Size.Height / 2);
                break;

            default:        //Label below the barcode
                barcodeImage.Position.YPosition       += encodingTextImage.Size.Height;
                humanReadableImage.Position.YPosition += encodingTextImage.Size.Height + barcodeImage.Size.Height;
                break;
            }

            // Set the required image height by adding the barcode height to the encoding text or value label text heights (if visible)
            int imageHeight = barcodeImage.Size.Height + encodingTextImage.Size.Height + humanReadableImage.Size.Height;

            // Reduce the image height if human readable position is embedded
            if (linearEncoder.HumanReadablePosition == HumanReadablePosition.Embedded)
            {
                imageHeight -= (humanReadableImage.Size.Height / 2);
            }

            // Set the required image width by taking the greater of the barcode width and value label text width (if used).
            int imageWidth = Math.Max(barcodeImage.Size.Width + (quietzone * 2), humanReadableImage.Size.Width);

            // Create the combined image.
            Bitmap combinedImage = new Bitmap(imageWidth, imageHeight);

            combinedImage.SetResolution(linearEncoder.Dpi, linearEncoder.Dpi);
            Graphics combinedGraphics = Graphics.FromImage(combinedImage);

            // Add each element to the combined image.
            combinedGraphics.FillRectangle(Brushes.White, 0, 0, combinedImage.Width, combinedImage.Height);
            combinedGraphics.DrawImageUnscaled(barcodeImage.Image, barcodeImage.Position.XPosition, barcodeImage.Position.YPosition);
            combinedGraphics.DrawImageUnscaled(encodingTextImage.Image, encodingTextImage.Position.XPosition, encodingTextImage.Position.YPosition);
            combinedGraphics.DrawImageUnscaled(humanReadableImage.Image, humanReadableImage.Position.XPosition, humanReadableImage.Position.YPosition);

            // Save the image to the memory stream.
            EncoderParameters encodingParams = new EncoderParameters(1)
            {
                Param = { [0] = new EncoderParameter(Encoder.Quality, 100L) }
            };

            combinedImage.Save(memoryStream, linearEncoder.ImageCodec, encodingParams);

            // Set flag if xdimension was changed.
            if (linearEncoder.XDimension != xDimensionOriginal)
            {
                linearEncoder.XDimensionChanged = true;
            }

            // Dispose of the objects we won't need any more.
            barcodeImage.Image.Dispose();
            humanReadableImage.Image.Dispose();
            encodingTextImage.Image.Dispose();
            combinedGraphics.Dispose();
            combinedImage.Dispose();

            linearEncoder.ResetPropertyChanged();
        }
Пример #6
0
        /// <summary>
        /// Creates the encoding text image element.
        /// </summary>
        /// <param name="linearEncoder"></param>
        /// <param name="quietzone"></param>
        /// <returns>The generated encoding text image inside an ImageElement object.</returns>
        internal static ImageElement GetEncodingImage(LinearEncoder linearEncoder, int quietzone)
        {
            // Create an empty ImageElement
            ImageElement encodingTextElement = new ImageElement();

            // Return the empty ImageElement if encoding not visible
            if (linearEncoder.ShowEncoding == false)
            {
                return(encodingTextElement);
            }

            // Setup the font for encoding with initial value "A" to assist calculating encoding element height later.
            Font encodeCharFont = ImageHelpers.GetSizedFontForWidth(1, linearEncoder.LinearEncoding.GetWidestSymbol() * linearEncoder.XDimension, linearEncoder.Dpi, new Font(linearEncoder.EncodingFontFamily, 8), false);

            // Set the text size so that we can get the encoding element height later.
            SizeF encodingTextSize = ImageHelpers.GetStringElementSize("A", encodeCharFont, linearEncoder.Dpi);

            // Set the encoding image width from the minimum width multiplied by the x-dimension.
            int encodingImageWidth = linearEncoder.LinearEncoding.MinimumWidth * linearEncoder.XDimension;

            //Create a new bitmap image for the encoding text based on the calculated dimensions.
            encodingTextElement.UpdateImage(new Bitmap(encodingImageWidth, (int)Math.Ceiling(encodingTextSize.Height)));
            encodingTextElement.Image.SetResolution(linearEncoder.Dpi, linearEncoder.Dpi);

            // Create a new graphics to draw on the encoded text image.
            Graphics encodingTextGraphics = Graphics.FromImage(encodingTextElement.Image);

            encodingTextGraphics.FillRectangle(Brushes.White, 0, 0, encodingImageWidth, (int)Math.Ceiling(encodingTextSize.Height));

            int xPosition = 0;
            int yPosition = 0;

            Pen encodePen = new Pen(Brushes.Black, 1);

            for (int symbol = 0; symbol <= linearEncoder.LinearEncoding.Symbols.Count - 1; symbol++)
            {
                string encodeCharacter = linearEncoder.LinearEncoding.Symbols[symbol].Character;
                encodeCharFont = ImageHelpers.GetSizedFontForWidth(encodeCharacter.Length, linearEncoder.LinearEncoding.Symbols[symbol].Width * linearEncoder.XDimension, linearEncoder.Dpi, new Font(linearEncoder.EncodingFontFamily, 8), false);

                int symbolWidth = linearEncoder.LinearEncoding.Symbols[symbol].Width;
                //string SymbolPattern = coded.SymbolPattern[symbol];

                Brush encodeBrush;
                if (linearEncoder.LinearEncoding.Symbols[symbol].CharacterType == 1)
                {
                    encodingTextGraphics.FillRectangle(Brushes.Black, xPosition, yPosition, symbolWidth * linearEncoder.XDimension, encodingTextElement.Image.Height);
                    encodeBrush = Brushes.White;
                }
                else
                {
                    encodingTextGraphics.DrawRectangle(encodePen, xPosition, yPosition, (symbolWidth * linearEncoder.XDimension) - 1, encodingTextElement.Image.Height - 1);
                    encodeBrush = Brushes.Black;
                }

                encodingTextGraphics.DrawString(encodeCharacter, encodeCharFont, encodeBrush, xPosition, yPosition);

                xPosition += symbolWidth * linearEncoder.XDimension;
            }

            encodeCharFont.Dispose();
            encodingTextGraphics.Dispose();
            encodePen.Dispose();
            encodingTextElement.Position.XPosition = quietzone;

            return(encodingTextElement);
        }
Пример #7
0
        /// <summary>
        /// Creates the label value image element.
        /// </summary>
        /// <param name="linearEncoder"></param>
        /// <param name="quietzone"></param>
        /// <returns>The generated label value image inside an ImageElement object.</returns>
        internal static ImageElement GetHumanReadableImageSymbolAligned(LinearEncoder linearEncoder, int quietzone)
        {
            // Create an empty ImageElement
            ImageElement humanReadableElement = new ImageElement();

            // If the human readable position is set to hidden, return the empty ImageElement
            if (linearEncoder.HumanReadablePosition == HumanReadablePosition.Hidden)
            {
                return(humanReadableElement);
            }

            // Setup the label font with initial value "A" to assist calculating label element height later
            Font humanReadableFont = ImageHelpers.GetSizedFontForWidth(1, linearEncoder.LinearEncoding.GetWidestSymbol() * linearEncoder.XDimension, linearEncoder.Dpi, linearEncoder.HumanReadableFont);

            // Set the text size so that we can get the encoding element height later
            SizeF humanReadableSize = ImageHelpers.GetStringElementSize("W", humanReadableFont, linearEncoder.Dpi);

            int prefixWidth = linearEncoder.LinearEncoding.HumanReadablePrefix?.Length * (int)humanReadableSize.Width ?? 0;
            int suffixWidth = linearEncoder.LinearEncoding.HumanReadableSuffix?.Length * (int)humanReadableSize.Width ?? 0;

            // Set the encoding image width from the minimum width multiplied by the x-dimension
            int humanReadableImageWidth = linearEncoder.LinearEncoding.MinimumWidth * linearEncoder.XDimension + prefixWidth + suffixWidth;

            //Create a new bitmap image for the encoding text based on the calculated dimensions
            humanReadableElement.UpdateImage(new Bitmap(humanReadableImageWidth, (int)Math.Ceiling(humanReadableSize.Height)));
            humanReadableElement.Image.SetResolution(linearEncoder.Dpi, linearEncoder.Dpi);

            // Create a new graphics to draw on the encoded text image
            Graphics humanReadableGraphics = Graphics.FromImage(humanReadableElement.Image);

            int xPosition = 0;
            int yPosition = 0;

            StringFormat humanReadableFormat = new StringFormat
            {
                Alignment = StringAlignment.Center
            };

            RectangleF humanReadableRectangle;

            // Add any human readable prefix
            if (linearEncoder.LinearEncoding.HumanReadablePrefix != null)
            {
                humanReadableRectangle = new RectangleF(xPosition, yPosition, prefixWidth, humanReadableElement.Image.Height);
                humanReadableGraphics.FillRectangle(Brushes.White, humanReadableRectangle);
                humanReadableGraphics.DrawString(linearEncoder.LinearEncoding.HumanReadablePrefix, humanReadableFont, Brushes.Black, humanReadableRectangle, humanReadableFormat);
                xPosition += prefixWidth;
            }

            for (int symbol = 0; symbol <= linearEncoder.LinearEncoding.Symbols.Count - 1; symbol++)
            {
                string humanReadableCharacter     = linearEncoder.LinearEncoding.Symbols[symbol].Character;
                Font   humanReadableCharacterFont = ImageHelpers.GetSizedFontForWidth(humanReadableCharacter.Length, linearEncoder.LinearEncoding.Symbols[symbol].Width * linearEncoder.XDimension, linearEncoder.Dpi, linearEncoder.HumanReadableFont);

                int symbolWidth = linearEncoder.LinearEncoding.Symbols[symbol].Width;

                if (linearEncoder.LinearEncoding.Symbols[symbol].CharacterType == 0)
                {
                    humanReadableRectangle = new RectangleF(xPosition, yPosition, symbolWidth * linearEncoder.XDimension, humanReadableElement.Image.Height);
                    humanReadableGraphics.FillRectangle(Brushes.White, humanReadableRectangle);
                    humanReadableGraphics.DrawString(humanReadableCharacter, humanReadableCharacterFont, Brushes.Black, humanReadableRectangle, humanReadableFormat);
                }

                xPosition += symbolWidth * linearEncoder.XDimension;
            }

            // Add any human readable suffix
            if (linearEncoder.LinearEncoding.HumanReadableSuffix != null)
            {
                humanReadableRectangle = new RectangleF(xPosition, yPosition, suffixWidth, humanReadableElement.Image.Height);
                humanReadableGraphics.FillRectangle(Brushes.White, humanReadableRectangle);
                humanReadableGraphics.DrawString(linearEncoder.LinearEncoding.HumanReadableSuffix, humanReadableFont, Brushes.Black, humanReadableRectangle, humanReadableFormat);
            }

            humanReadableFont.Dispose();
            humanReadableGraphics.Dispose();
            humanReadableElement.Position.XPosition = quietzone - prefixWidth;

            return(humanReadableElement);
        }