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