0

我尝试将 UIImage 转换为字节(NSData),然后将其转换为十六进制字符串,但没有用。它只打印一个黑条而不是图像。我想将 UIImage 转换为 PCX 格式,但找不到好的教程。让我知道一种用斑马打印机打印 UIImage 的方法。

注意:仅 CPCL 语言

尝试以下方法

方法一:

-(void)PrintImage
{
    NSData *data = UIImagePNGRepresentation(image);
    NSString* hex = [self hexRepresentationWithSpaces_AS:NO data:data];
    NSMutableString * str = [NSMutableString new];
    [str appendString:@"! 0 200 200 210 1\r\nEG 40 80 0 0\n"];
    [str appendString:hex];
    [str appendString:@"\r\nPRINT\r\n"];
    //Sending this command to Zebra Printer
}

方法二:

-(void)PrintImage
{
    id<ZebraPrinter,NSObject> printer = [ZebraPrinterFactory getInstance:connection error:&error];

    id<GraphicsUtil, NSObject> graphicsUtil = [printer getGraphicsUtil];
    [graphicsUtil storeImage:@"1234.jpg" withImage:[image CGIImage] withWidth:-1 andWithHeight:-1 error:&error];

    //What ever the format I send it stores in GRF file but the CPCL command accepts only .PCX file to print stored image

    NSString str = @"\n! 0 200 200 500 1 \nPCX 0 30 !<1234.PCX \nPRINT\n";
    //Sending this command to Zebra Printer
}

其他方法

-(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces data:(NSData *)data
{
const unsigned char* bytes = (const unsigned char*)[data bytes];
NSUInteger nbBytes = [data length];
//If spaces is true, insert a space every this many input bytes (twice this many output characters).
static const NSUInteger spaceEveryThisManyBytes = 4UL;
//If spaces is true, insert a line-break instead of a space every this many spaces.
static const NSUInteger lineBreakEveryThisManySpaces = 4UL;
const NSUInteger lineBreakEveryThisManyBytes = spaceEveryThisManyBytes * lineBreakEveryThisManySpaces;
NSUInteger strLen = 2*nbBytes + (spaces ? nbBytes/spaceEveryThisManyBytes : 0);

NSMutableString* hex = [[NSMutableString alloc] initWithCapacity:strLen];
for(NSUInteger i=0; i<nbBytes; ) {
    [hex appendFormat:@"%02X", bytes[i]];
    //We need to increment here so that the every-n-bytes computations are right.
    ++i;

    if (spaces) {
        if (i % lineBreakEveryThisManyBytes == 0) [hex appendString:@"\n"];
        else if (i % spaceEveryThisManyBytes == 0) [hex appendString:@" "];
    }
}
return hex;
}
4

1 回答 1

0

您可以使用 Zebra 的 iOS SDK 打印图像。它支持iMZ320。您将使用相同的逻辑从 UIImage(或特别是从 UIImage 中的CGImageRef )中提取数据并通过printImage命令将其发送到打印机。

SDK:http ://www.zebra.com/us/en/products-services/software/link-os/link-os-sdk.html

如果您无法使用 SDK,则需要自己解析 UIImage 中的图像数据,并使用 CPCL 命令EG(或其变体之一)将其包装。您可以在此处的第 7 页第 7 部分找到 CPCL 图形命令:http ://www.zebra.com/content/dam/zebra/manuals/en-us/printer/cpcl-pm-en.pdf 。如果你已经做了这么多,也许你可以发布你的代码,有人可以告诉你哪里出错了。

2014 年 7 月 27 日更新

既然你已经发布了一些代码,我有几个想法。

  1. 存储图像后,尝试使用 SDK 方法“printImage”。没有理由自己发送 CPCL 命令,因为 SDK 应该为您处理它。SDK 应该为您管理整个 PCX 与 JPG 的事情。注意:您应该只在打印机上存储一次图像,无需多次调用 storeImage。虽然存储额外的时间不会破坏任何东西,但它是不必要的并且会减慢您的日常生活!

  2. 打印机支持多种语言(ZPL、CPCL、行打印等)。如果我没记错的话,打印机可能总是接受 CPCL 命令,但仍处于 ZPL 模式。没有把握。无论如何,值得检查打印机认为它是什么语言。您可以使用以下查询进行询问:

    !U1 getvar "device.languages"

    [注意在该命令之后应该有一个换行符或回车]

于 2014-07-24T17:10:38.037 回答