123 lines
4.2 KiB
C#
123 lines
4.2 KiB
C#
using ESCPOS_NET.Emitters.BaseCommandValues;
|
|
using ESCPOS_NET.Utilities;
|
|
using SixLabors.ImageSharp;
|
|
|
|
namespace ESCPOS_NET.Emitters
|
|
{
|
|
public abstract partial class BaseCommandEmitter : ICommandEmitter
|
|
{
|
|
private byte[] GetImageHeader(int commandLength)
|
|
{
|
|
byte[] lengths = new byte[4];
|
|
int i = 0;
|
|
while (commandLength > 0)
|
|
{
|
|
lengths[i] = (byte)(commandLength & 0xFF);
|
|
commandLength >>= 8;
|
|
i++;
|
|
}
|
|
|
|
if (i >= 3)
|
|
{
|
|
return new byte[] { Cmd.GS, Images.ImageCmd8, Images.ImageCmdL, lengths[0], lengths[1], lengths[2], lengths[3] };
|
|
}
|
|
else
|
|
{
|
|
return new byte[] { Cmd.GS, Images.ImageCmdParen, Images.ImageCmdL, lengths[0], lengths[1] };
|
|
}
|
|
}
|
|
|
|
/* Image Commands */
|
|
public virtual byte[] SetImageDensity(bool isHiDPI)
|
|
{
|
|
ByteArrayBuilder builder = new ByteArrayBuilder();
|
|
byte dpiSetting = isHiDPI ? (byte)0x33 : (byte)0x32; // TODO: is this right??
|
|
byte[] baseCommand = new byte[] { 0x30, 0x31, dpiSetting, dpiSetting };
|
|
builder.Append(GetImageHeader(baseCommand.Length));
|
|
builder.Append(baseCommand);
|
|
return builder.ToArray();
|
|
}
|
|
|
|
public virtual byte[] BufferImage(byte[] image, int maxWidth = -1, bool isLegacy = false, int color = 1)
|
|
{
|
|
ByteArrayBuilder imageCommand = new ByteArrayBuilder();
|
|
|
|
byte colorByte;
|
|
switch (color)
|
|
{
|
|
case 2:
|
|
colorByte = 0x32;
|
|
break;
|
|
case 3:
|
|
colorByte = 0x33;
|
|
break;
|
|
default:
|
|
colorByte = 0x31;
|
|
break;
|
|
}
|
|
|
|
int width;
|
|
int height;
|
|
byte[] imageData;
|
|
using (var img = Image.Load(image))
|
|
{
|
|
imageData = img.ToSingleBitPixelByteArray(maxWidth: maxWidth == -1 ? (int?)null : maxWidth);
|
|
height = img.Height;
|
|
width = img.Width;
|
|
}
|
|
|
|
byte heightL = (byte)height;
|
|
byte heightH = (byte)(height >> 8);
|
|
|
|
if (isLegacy)
|
|
{
|
|
var byteWidth = (width + 7 & -8) / 8;
|
|
byte widthL = (byte)byteWidth;
|
|
byte widthH = (byte)(byteWidth >> 8);
|
|
imageCommand.Append(new byte[] { Cmd.GS, Images.ImageCmdLegacy, 0x30, 0x00, widthL, widthH, heightL, heightH });
|
|
}
|
|
else
|
|
{
|
|
byte widthL = (byte)width;
|
|
byte widthH = (byte)(width >> 8);
|
|
imageCommand.Append(new byte[] { 0x30, 0x70, 0x30, 0x01, 0x01, colorByte, widthL, widthH, heightL, heightH });
|
|
}
|
|
|
|
imageCommand.Append(imageData);
|
|
|
|
// Load image to print buffer
|
|
ByteArrayBuilder response = new ByteArrayBuilder();
|
|
byte[] imageCommandBytes = imageCommand.ToArray();
|
|
if (!isLegacy)
|
|
{
|
|
response.Append(GetImageHeader(imageCommandBytes.Length));
|
|
}
|
|
|
|
response.Append(imageCommandBytes);
|
|
return response.ToArray();
|
|
}
|
|
|
|
public virtual byte[] WriteImageFromBuffer()
|
|
{
|
|
// Print image that's already buffered.
|
|
ByteArrayBuilder response = new ByteArrayBuilder();
|
|
byte[] printCommandBytes = new byte[] { 0x30, 0x32 };
|
|
response.Append(GetImageHeader(printCommandBytes.Length));
|
|
response.Append(printCommandBytes);
|
|
return response.ToArray();
|
|
}
|
|
|
|
public virtual byte[] PrintImage(byte[] image, bool isHiDPI, bool isLegacy = false, int maxWidth = -1, int color = 1)
|
|
{
|
|
if (isLegacy)
|
|
{
|
|
return ByteSplicer.Combine(BufferImage(image, maxWidth, isLegacy));
|
|
}
|
|
else
|
|
{
|
|
return ByteSplicer.Combine(SetImageDensity(isHiDPI), BufferImage(image, maxWidth, isLegacy, color), WriteImageFromBuffer());
|
|
}
|
|
}
|
|
}
|
|
}
|