using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; namespace Barcoded { /// /// Linear (one-dimensional) barcode. /// public class LinearBarcode { private bool _barcodeValueChanged; /// /// Barcode symbology. /// public Symbology Symbology { get; } private string _barcodeValue; /// /// Value to encode. /// public string BarcodeValue { get => _barcodeValue; set { _barcodeValue = value; _barcodeValueChanged = true; } } private Image _image; /// /// Barcode image. /// public Image Image { get { UpdateBarcode(); return _image; } } private LinearVectors _vectors; /// /// Barcode vectors. /// public LinearVectors Vectors { get { UpdateBarcode(); return _vectors; } } /// /// Minimum point width for the given encoding value. /// public int MinimumPointWidth { get { Encoder.Generate(BarcodeValue); return Encoder.LinearEncoding.MinimumWidth; } } public string ZplEncode { get { Encoder.Generate(BarcodeValue); return Encoder.ZplEncode; } } /// /// Barcode symbology encoder. /// public LinearEncoder Encoder { get; } /// /// Creates a barcode image from the declared value and desired symbology. /// /// Barcode value string. /// Barcode symbology string. /// public LinearBarcode(string barcodeValue, string symbology) : this(barcodeValue, GetSymbology(symbology)) { } /// /// Creates a barcode image from the declared value and desired symbology. /// /// Barcode value string. /// Barcode symbology /// public LinearBarcode(string barcodeValue, Symbology symbology) { BarcodeValue = barcodeValue ?? throw new ArgumentNullException(nameof(barcodeValue)); Symbology = symbology; switch (symbology) { case Symbology.Code128ABC: Encoder = new Code128Encoder(symbology); break; case Symbology.Code128BAC: Encoder = new Code128Encoder(symbology); break; case Symbology.Code128AB: Encoder = new Code128Encoder(symbology); break; case Symbology.Code128BA: Encoder = new Code128Encoder(symbology); break; case Symbology.GS1128: Encoder = new Code128Encoder(symbology); break; case Symbology.Code39: Encoder = new Code39Encoder(symbology); break; case Symbology.Code39C: Encoder = new Code39Encoder(symbology); break; case Symbology.Code39Full: Encoder = new Code39Encoder(symbology); break; case Symbology.Code39FullC: Encoder = new Code39Encoder(symbology); break; case Symbology.I2of5: Encoder = new Interleaved2Of5Encoder(symbology); break; case Symbology.I2of5C: Encoder = new Interleaved2Of5Encoder(symbology); break; case Symbology.Ean13: Encoder = new Ean138Encoder(symbology); break; case Symbology.UpcA: Encoder = new Ean138Encoder(symbology); break; case Symbology.Ean8: Encoder = new Ean138Encoder(symbology); break; default: Encoder = new Code128Encoder(Symbology.Code128BAC); break; } } /// /// Get a list of available barcode symbologies. /// /// Returns barcode symbology text list. public static List GetSymbologies() { List symbologies = Enum.GetValues(typeof(Symbology)) .Cast() .Select(v => v.ToString()) .ToList(); return symbologies; } /// /// Get a list of available human readable text positions. /// /// Returns human readable text list. public static List GetHumanReadablePositions() { List humanReadablePositions = Enum.GetValues(typeof(HumanReadablePosition)) .Cast() .Select(v => v.ToString()) .ToList(); return humanReadablePositions; } /// /// Returns the symbology from the given name. /// /// Symbology name. /// Symbology. private static Symbology GetSymbology(string symbology) { symbology = symbology ?? ""; switch (symbology.ToUpper()) { case "CODE128ABC": return Symbology.Code128ABC; case "CODE128BAC": return Symbology.Code128BAC; case "CODE128AB": return Symbology.Code128AB; case "CODE128BA": return Symbology.Code128BA; case "GS1128": return Symbology.GS1128; case "CODE39": return Symbology.Code39; case "CODE39C": return Symbology.Code39C; case "CODE39FULL": return Symbology.Code39Full; case "CODE39FULLC": return Symbology.Code39FullC; case "I2OF5": return Symbology.I2of5; case "I2OF5C": return Symbology.I2of5C; case "EAN13": return Symbology.Ean13; case "UPCA": return Symbology.UpcA; case "EAN8": return Symbology.Ean8; default: return Symbology.Code128BAC; } } /// /// Provides a byte array version of the barcode image in the declared format for saving to file. /// /// Codec for the image format to be saved. /// Byte array of the barcode image. /// /// public byte[] SaveImage(string codec) { Encoder.CodecName = codec ?? throw new NullReferenceException(nameof(codec)); if (string.IsNullOrWhiteSpace(BarcodeValue)) { throw new InvalidOperationException("No BarcodeValue set"); } MemoryStream imageMemoryStream = Encoder.GetImage(BarcodeValue); _image = Image.FromStream(imageMemoryStream); _vectors = new LinearVectors(Encoder); _barcodeValueChanged = false; return imageMemoryStream.ToArray(); } /// /// Checks if any barcode settings have changed since the last call and creates a new barcode if they have. /// /// private void UpdateBarcode() { //Check that barcode value is not an empty string. if (string.IsNullOrWhiteSpace(BarcodeValue)) { throw new InvalidOperationException("No BarcodeValue set"); } if (_barcodeValueChanged | Encoder.PropertyChanged) { MemoryStream imageMemoryStream = Encoder.GetImage(BarcodeValue); _image = Image.FromStream(imageMemoryStream); _vectors = new LinearVectors(Encoder); _barcodeValueChanged = false; } } public Image Rotate(Image img,int rotation) { switch (rotation) { case 90: { img.RotateFlip(RotateFlipType.Rotate90FlipNone); break; } case 180: { img.RotateFlip(RotateFlipType.Rotate180FlipNone); break; } case 270: { img.RotateFlip(RotateFlipType.Rotate270FlipNone); break; } } return img; } } }