需求是希望通过ipad和iPhone连接局域网内的打印机打印餐馆小票,而小票中需要包含logo图片和二维码。我用的打印机是xprinter,根据开发文档提示,打印位图的命令是“ESC*mnLnHd1...dk”

ASCII码 ESC * m nL nH d1...dk

十六进制 1B 2A m nL nH d1...dk

十进制 27 42 m nL nH d1...dk

取值范围 m = 0, 1, 32, 33

0 <= nL <= 255

0 <= nH <= 3

0 <= d <= 255

具体的参数解释可以查看对应打印机型号的开发文档,这里主要记录一些重要的点。有个问题就是在打印透明背景图片的时候仍然会出现乱码,把背景换成白色就正常了,暂时还没想到其它的解决办法,图片尺寸过大也会出现乱码

当前的项目是swift和objc结合使用的,因为对objc还不是太熟,swift开发也更快一点。打印机部分原理很简单,把数据直接用socket发送给打印机就可以了。

打印部分的代码:

<span style="white-space:pre">  </span>    let escBmp: Array<UInt8> = [27, 42, 33, 44, 1]<span style="white-space:pre">   </span>//切换到位图模式的命令let invoiceTitleImg: UIImage? = common.UIImageFromName("invoice_title") //获取图片if invoiceTitleImg != nil {for (var i = 0; i < (Int(invoiceTitleImg!.size.height) / 24) + 1; i++) {//settingclient!.send(data: getArrayUInt8("\t   "))<span style="white-space:pre">   </span>//打印的图片默认说靠左边,这里是设置的居中,文档中暂时没有找到居中部分的命令,只能先将就这样用着var psplite: Array<UInt8> = [27, 51, 0]client!.send(data: escBmp)var data: Array<UInt8> = [0x1B, 0x33, 0x00]<span style="white-space:pre">    </span>//使用的图片是24点双密度data[0] = 0x00data[1] = 0x00data[2] = 0x00//loopfor (var j = 0; j < Int(invoiceTitleImg!.size.width); j++) {for (var k = 0; k < 24; k++) {if ((i * 24) + k) < Int(invoiceTitleImg!.size.height) {let point: CGPoint = CGPoint(x: j, y: ((i * 24) + k))let index = 4*((invoiceTitleImg!.size.width * round(point.y)) + round(point.x))let red = getRed(titleBitmap!, index: Int(index))if red == 0 {data[k / 8] += Byte(128 >> (k % 8))}//println(red)}}client!.send(data: data)data[0] = 0x00data[1] = 0x00data[2] = 0x00}client!.send(data: _p_space)}}

获取位图信息的代码,代码从网上找的

+(unsigned char *) getBitmapFromUIImage:(UIImage *)image {CGImageRef imageRef = image.CGImage;CGContextRef context = [self newBitmapRGBA8ContextFromImage:imageRef];if (!context) {return NULL;}size_t width = CGImageGetWidth(imageRef);size_t height = CGImageGetHeight(imageRef);CGRect rect = CGRectMake(0, 0, width, height);CGContextDrawImage(context, rect, imageRef);unsigned char *bitmapData = (unsigned char *)CGBitmapContextGetData(context);size_t bytesPerRow = CGBitmapContextGetBytesPerRow(context);size_t bufferLength = bytesPerRow * height;unsigned char *newBitmap = NULL;if (bitmapData) {newBitmap = (unsigned char *)malloc(sizeof(unsigned char) * bytesPerRow * height);if (newBitmap) {for (int i = 0; i < bufferLength; ++i) {newBitmap[i] = bitmapData[i];}}free(bitmapData);}CGContextRelease(context);return newBitmap;
}+(CGContextRef) newBitmapRGBA8ContextFromImage:(CGImageRef) image {CGContextRef context = NULL;CGColorSpaceRef colorSpace;uint32_t *bitmapData;size_t bitsPerPixel = 32;size_t bitsPerComponent = 8;size_t bytesPerPixel = bitsPerPixel / bitsPerComponent;size_t width = CGImageGetWidth(image);size_t height = CGImageGetHeight(image);size_t bytesPerRow = width * bytesPerPixel;size_t bufferLength = bytesPerRow * height;colorSpace = CGColorSpaceCreateDeviceRGB();if (!colorSpace) {return NULL;}bitmapData = (uint32_t *)malloc(bufferLength);if (!bitmapData) {CGColorSpaceRelease(colorSpace);return NULL;}context = CGBitmapContextCreate(bitmapData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);if (!context) {free(bitmapData);}CGColorSpaceRelease(colorSpace);return context;
}

获取像素信息是从位图byte字节中获取的

    private func getRed(point: UnsafeMutablePointer<UInt8>, index: Int) -> UInt8{let red = point[index]//println(red)return red}

*在打印中文的时候碰到点问题,使用utf8编码点字节打印出来说乱码,之后中文档中才看到应该用gb2312,而swift中也没有对应的方法可以直接转换编码的。

utf8对英文使用8位(一个字节)进行编码,而对中文说用24位(3个字节)编码,所以打印的时候只有中文才会出现乱码情况。

NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

2000年的gb18030是取代gbk1.0的正式国家标准,该标准收录了27484个汉子,同时还收录来藏文,蒙文,维吾尔文等主要的少数民族文字

iOS 热敏打印机打印位图相关推荐

  1. Android 热敏打印机打印二维码(转载)

    一.打印机的型号 RP-POS80S或RP-POS80P或RP-POS80CS或RP-POS80CP打印机 高速热敏打印机 打印方式:直接热敏打印 打印密度:640点/行 打印纸宽:80mm 有效打印 ...

  2. 对#Hello,2015征文#+Android 热敏打印机打印二维码(图片)博客的尝试

    原博客链接 #Hello,2015征文#+Android 热敏打印机打印二维码 昨天晚上说抽时间来写一篇关于Android 热敏打印机打印二维码和图片的文章,所幸在下班之前把它给写了,和大家分享吧.我 ...

  3. 热敏打印机打印二维码图片

    http://blog.csdn.net/sdvch/article/details/45079375 最近研究热敏打印机打印二维码,用到了北洋OPOS二次开发包DLL,借鉴该代码:http://ww ...

  4. 发票打印JAVA是什么_如何使用蓝牙热敏打印机打印发票收据

    我必须使用热敏打印机打印发票收据 . 我用Zjiang Thermal printer打印收据 . 他们还提供了manual&demo项目 . 在演示项目中,他们使用libray " ...

  5. iOS Bluetooth 打印小票

    效果图如下 非常感谢 Haley_Wong 的帮助 文章 http://www.jianshu.com/p/90cc08d11b5a github 地址 https://github.com/Hale ...

  6. 转:C#并口热敏小票打印机打印位图

    最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: [html] view plain copy class ...

  7. Android手机蓝牙连接热敏打印机 打印票据

    手机蓝牙连接热敏打印机 打印票据 话不多说上代码: 项目地址:可直接作为项目依赖 引用 allprojects {repositories {...maven { url 'https://jitpa ...

  8. C#并口热敏小票打印机打印位图

    C#并口热敏小票打印机打印位图 原文:C#并口热敏小票打印机打印位图 最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要 ...

  9. Caysn打印机IOS平台打印开发包、接口说明文档及示例程序_20170717

    打印机开发包,接口说明文档,打印示例程序下载地址:Caysn打印机IOS开发包.接口说明文档.打印示例程序_20170717 Framework版本要求:IOS8  Framework架构:armv7 ...

  10. Caysn打印机IOS平台打印开发包及示例程序_20170610

    打印机开发包,接口说明文档,打印示例程序:Caysn打印机IOS开发包.文档.示例程序_20170610 系统要求:IOS8 CPU架构:armv7 armv7s arm64 说明文档:(压缩包里有附 ...

最新文章

  1. Xilinx zynq的资料获取总结
  2. 图像五值化与基于三值图像的车牌识别(1)
  3. 函数用计算机代码,用main函数传参做简单的计算器的代码
  4. tensorflow_yolo-v3 Intel Realsense 视频流处理模块 opencv.videocapture()
  5. js 操作select和option
  6. uni-app 微信小程序自定义radio样式
  7. Google 's Gmail
  8. va_list函数族应用
  9. 计算机桌面变色怎么办,电脑屏幕变色了怎么办
  10. 纺大数学与计算机学院徐涛,数学与统计学院
  11. 优科Ruckus R610 AP刷Unleashed固件
  12. 计算机上的24点游戏怎么玩,掌握基本规律,轻松玩转24点游戏
  13. 选址(重心法、微分法迭代)
  14. 关于--如何查看外网IP地址
  15. 【渝粤题库】陕西师范大学209020 史记研究 作业(专升本)
  16. 无需外设实现电脑远程开机
  17. 直播当道,平台该如何做好内容审核规避风险?
  18. 研究性学习:APP的隐私问题
  19. 离散KL变换原理、实例以及matlab实现
  20. 安信可WIFI模组Hi海思系列固件下载指导

热门文章

  1. ps矩形框的宽高值如何显示像素单位
  2. 一次Nginx 502问题解决
  3. linux画板软件下载,Drawing画图软件
  4. vpay商城系统开发app
  5. 怎么修改打印机服务器权限,Win7如何设置网络打印机管理权限
  6. python 基于金字塔的图像融合
  7. 【渝粤题库】陕西师范大学164210 冲突与沟通管理 作业 (专升本)
  8. 大数据系列 | 阿里云datav数据可视化(使用json文件生成可视化动态图标)
  9. 暴力推导 Beta 函数与 Gamma 函数关系式
  10. VC中的_variant_t和_bstr_t