【问题标题】:Xamarin Print Image in bluetooth printerXamarin 在蓝牙打印机中打印图像
【发布时间】:2018-11-14 20:24:19
【问题描述】:

我正在尝试使用 Xamarin 本机 android 从蓝牙打印机 (INTERMEC PB51) 打印。

我已经根据以下链接编写了代码。

How can I print an image on a Bluetooth printer in Android?

我的代码如下。

private static byte[] SELECT_BIT_IMAGE_MODE = { 0x1B, 0x2A, 33, (byte)255, 0 };

如下制作位图。

 Bitmap sigImage = BitmapFactory.DecodeResource(Resources, Resource.Drawable.icn_logo_jpg);

创建蓝牙插座。

  BluetoothSocket socket = null;
            BufferedReader inReader = null;
            BufferedWriter outReader = null;
            string bt_printer = address; //AdminSettings.PrinterMACAddr;
            if (string.IsNullOrEmpty(bt_printer)) bt_printer = "00:13:7B:49:D1:8C";
            BluetoothDevice mmDevice = BluetoothAdapter.DefaultAdapter.GetRemoteDevice(bt_printer);
            UUID applicationUUID = UUID.FromString("00001101-0000-1000-8000-00805F9B34FB");
            socket = mmDevice.CreateRfcommSocketToServiceRecord(applicationUUID);
            socket.Connect();

调用方法

 PrintImage(bitMap, socket);

创建的打印方法

 public void PrintImage(Bitmap bitmap, BluetoothSocket _socket)
    {
        try
        {
            if (!_socket.IsConnected)
            {
                _socket.Connect();
            }

            MemoryStream stream = new MemoryStream();

            //IMAGE
            byte[] imageData = ImageToByte2(bitmap);
            stream.Write(imageData, 0, imageData.Length);
            stream.Write(SELECT_BIT_IMAGE_MODE, 0, SELECT_BIT_IMAGE_MODE.Length);
            var bytes = stream.ToArray();
            _socket.OutputStream.Write(bytes, 0, bytes.Length);
            // Java.Lang.Thread.Sleep(2000);

            //END IMAGE
            Java.Lang.Thread.Sleep(2000);
        }
        catch (Exception ex)
        {
            throw new Exception("Unable to print. Please re-configure the printer and try again!");
        }
    }


 public static byte[] ImageToByte2(Bitmap bitmap)
    {
        MemoryStream stream = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
        byte[] bitmapData = stream.ToArray();
        return bitmapData;
    }

但得到的标志打印如下图。

【问题讨论】:

  • 我也有同样的问题
  • 你好 Rakesh 你解决了这个问题。我也面临同样的问题。
  • 您好,我已经从名为 bar 投标的第三方应用程序生成了图像打印代码,我将此代码作为 .prn 文件保存在解决方案的资产文件夹中,然后我发送到打印机,它得到了工作。
  • 你好 Rakesh 你能给我一些代码吗
  • 嗨@Rakesh,你能帮忙吗?我有类似的问题,无法打印图像。请帮帮我。

标签: c# xamarin xamarin.forms xamarin.android bluetooth-printing


【解决方案1】:
  1. Intermec PB51 可以设置多种不同的打印机语言; IPL、指纹、直接协议、ZSim、DSim、CSim 和 ESC/P。所以首先你必须知道你正在处理哪种打印机语言。 { 0x1B, 0x2A, 33, (byte)255, 0 } 是 ESC/P 的命令,所以打印机必须是 ESC/P 模式。

  2. 看起来您正在向打印机发送 PNG 图像数据。我只在 ESC/P 模式下使用过 Intermec PB51,在 ESC/P 下,图像必须转换为 1 位图像字节数组(每个打印机“像素”一位)。

【讨论】:

  • 你能提到四种不同的打印机语言吗?
  • @ryan-motal 用我在手册中找到的打印机语言更新了答案。
  • 感谢@emilsteen 的更新,我的打印机也使用ESC/P 型号,您是否在字节数组之前将位图转换为十六进制?在这种情况下,你能教我你的方法吗?提前致谢。
  • @ryan-motal 您从图像中获取位并将它们转换为位数组。如果您的图像是灰色的(每隔一个点设置一次),您将获得位数组 0b01010101,这是要发送到打印机的字节,即 0x55。那么如何将图像转换为位数组是棘手的部分。我使用 ImageSharp 可以读取每个像素,但可能有更好的方法。
  • 你的源代码上传到github了吗?如果是这样,我可以看到吗?这对我有很大帮助。我尝试了很多方法,似乎没有任何效果。
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2016-06-23
  • 2011-07-05
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多