通过 C# 中的 comport 将位图图像打印到 pos 打印机

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14099239/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 10:39:56  来源:igfitidea点击:

Printing a Bit map image to pos printer via comport in C#

c#

提问by Nasif

I'm directly printing my receipt to the POS printer via serial port in the following way,

我通过以下方式通过串口直接将我的收据打印到POS打印机,

        SerialPort port = new SerialPort("com6", 9100, Parity.None, 8, StopBits.One);
        port.Open();
        port.Write("Some Text");
        port.Close();

My question is how I'm going to print a Bitmap image using the above method? Any help would be grateful.

我的问题是如何使用上述方法打印位图图像?任何帮助将不胜感激。

I have not decided to go with Microsoft POS for.net, because it is slow and takes time to initialize the printer, where clients doesn't like to wait.

我还没有决定使用 Microsoft POS for.net,因为它很慢并且需要时间来初始化打印机,而客户不喜欢等待。

Thanks.

谢谢。

采纳答案by avivklas

This should get you a string from bitmap that you would be able to send to printer:

这应该从位图中获取一个字符串,您可以将其发送到打印机:

    public string GetLogo()
    {
        string logo = "";
        if (!File.Exists(@"C:\bitmap.bmp"))
            return null;
         BitmapData data = GetBitmapData(@"C:\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 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;
        }
    }

回答by Nasif

I have Found another way, Guyz Please spread the word!

我找到了另一种方式,Guyz 请传播这个词!

Step1 :

第1步 :

Download the NV Image Software (nv_image_tool_v3.1.6) and Set the Image to The Printer VIA Comport Do these steps as in the image enter image description here

下载 NV 图像软件 (nv_image_tool_v3.1.6) 并将图像设置到打印机 VIA Comport 按照图像执行这些步骤 在此处输入图片说明

Step 2 : The code to your favourite button:

第 2 步:您最喜欢的按钮的代码:

 private void button1_Click(object sender, EventArgs e)
{
 SerialPort port = new SerialPort("com6", 9100, Parity.None, 8, StopBits.One);
 port.Open();
 ASCIIEncoding ascii = new ASCIIEncoding();
 port.Write(ascii.GetString(new byte[] { 28, 112, 1, 0})); //Printing the Above uploaded Logo
 port.WriteLine("Your Text");
 port.Close();
}

回答by Luca Morelli

may be not useful at this point, but I think that to print directly to a printer you have to find the programming manual and send command escapes.

在这一点上可能没有用,但我认为要直接打印到打印机,您必须找到编程手册并发送命令转义符。

this kind of printers have his own set of commands and so on, to format, rotate text, print barcode, upload and print image and so on.

这种打印机有自己的一套命令等等,可以格式化、旋转文本、打印条码、上传和打印图像等等。

Until you don't know the Language and use it correctly the behavior of the printer may be unpredicatable

除非您不知道语言并正确使用它,否则打​​印机的行为可能是不可预测的