Imprimir bitmap monocromático na EPSON T20

<< Click to Display Table of Contents >>

Navigation:  Outros >

Imprimir bitmap monocromático na EPSON T20

Previous pageReturn to chapter overviewNext page

Este código mostra como conectar na EPSON TERMICA T20 e enviar uma string e um bitmap monocromático (eu usei um bitmap 50x50 para este teste).

 

using System;

using System.Collections;

using System.Drawing;

using System.IO;

using System.IO.Ports;

using System.Text;

 

namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {

            SerialPort ComPort = new SerialPort("COM1", 115200);

            ComPort.Open();

            ComPort.WriteLine("TESTE!!!");

            ComPort.Write(GetLogo());

            ComPort.Close();

        }

 

        static public string GetLogo()

        {

            string logo = "";

            if (!File.Exists(@"s:\bitmap.bmp"))

                return null;

            BitmapData data = GetBitmapData(@"s:\bitmap.bmp");

            BitArray dots = data.Dots;

            byte[] width = BitConverter.GetBytes(data.Width);

 

            int offset = 0;

            MemoryStream stream = new MemoryStream();

            BinaryWriter bw = new BinaryWriter(stream);

 

            bw.Write((char)0x1B);

            bw.Write('@');

 

            bw.Write((char)0x1B);

            bw.Write('3');

            bw.Write((byte)24);

 

            while (offset < data.Height)

            {

                bw.Write((char)0x1B);

                bw.Write('*');         // bit-image mode

                bw.Write((byte)33);    // 24-dot double-density

                bw.Write(width[0]);  // width low byte

                bw.Write(width[1]);  // width high byte

 

                for (int x = 0; x < data.Width; ++x)

                {

                    for (int k = 0; k < 3; ++k)

                    {

                        byte slice = 0;

                        for (int b = 0; b < 8; ++b)

                        {

                            int y = (((offset / 8) + k) * 8) + b;

                            // Calculate the location of the pixel we want in the bit array.

                            // It'll be at (y * width) + x.

                            int i = (y * data.Width) + x;

 

                            // If the image is shorter than 24 dots, pad with zero.

                            bool v = false;

                            if (i < dots.Length)

                            {

                                v = dots[i];

                            }

                            slice |= (byte)((v ? 1 : 0) << (7 - b));

                        }

 

                        bw.Write(slice);

                    }

                }

                offset += 24;

                bw.Write((char)0x0A);

            }

            // Restore the line spacing to the default of 30 dots.

            bw.Write((char)0x1B);

            bw.Write('3');

            bw.Write((byte)30);

 

            bw.Flush();

            byte[] bytes = stream.ToArray();

            return logo + Encoding.Default.GetString(bytes);

        }

 

        public static BitmapData GetBitmapData(string bmpFileName)

        {

            using (var bitmap = (Bitmap)Bitmap.FromFile(bmpFileName))

            {

                var threshold = 127;

                var index = 0;

                double multiplier = 570; // this depends on your printer model. for Beiyang you should use 1000

                double scale = (double)(multiplier / (double)bitmap.Width);

                int xheight = (int)(bitmap.Height * scale);

                int xwidth = (int)(bitmap.Width * scale);

                var dimensions = xwidth * xheight;

                var dots = new BitArray(dimensions);

 

                for (var y = 0; y < xheight; y++)

                {

                    for (var x = 0; x < xwidth; x++)

                    {

                        var _x = (int)(x / scale);

                        var _y = (int)(y / scale);

                        var color = bitmap.GetPixel(_x, _y);

                        var luminance = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);

                        dots[index] = (luminance < threshold);

                        index++;

                    }

                }

 

                return new BitmapData()

                {

                    Dots = dots,

                    Height = (int)(bitmap.Height * scale),

                    Width = (int)(bitmap.Width * scale)

                };

            }

        }

    }

 

    public class BitmapData

    {

        public BitArray Dots

        {

            get;

            set;

        }

 

        public int Height

        {

            get;

            set;

        }

 

        public int Width

        {

            get;

            set;

        }

    }

}