各位大侠,大虾 
请教一下,如何使用Delphi语言使Zebra能够打印图片,网上相关的文章很少,且我不是很懂 
(相关文章 
http://blog.csdn.net/superjoel/archive/2006/11/09/1375507.aspx )不知道怎么将加载的图片转变为相应的16进制代码文件或者是其压缩代码文件是否能提供相应的DEMO?thank you

解决方案 »

  1.   

    不是那种16进制,是Zebra打印机认识的图形代码文本文件,
    打印的内容要么黑,要么白,这样,每个点状态用一个bit来表示就行了(0是白,1是黑)。一个字节可以表示8个点。这个字节的高低4bit分别代表2个数字,用16进制就是0-F,而编码最终是将每个字节的两个数用ASCII码来显示,即字符的‘0’到‘F’。因为一个字节只能显示一个ASCII字符,所以编好的码需要2倍图形字节的长度。举个例子来说,一个图形只有8个点,前4个为白,后4个为黑,则第一步编码出来为一个字节,字节的8位是00001111,再编码成16进制的ASCII码后,成为2个字节,即字符‘0’‘F’。
    相关文章内容
    这是我最终的使用方法,也是上面提到的scum的方法,原理其实和3一样。只是这里把要打印的标签统一按HEX图形编码,再打印。绝对的灵活,效果也好,使用并口速度也没问题。好吧,开始。
    我们已有的绘图软件是一个类似微软Visio的绘图软件。它可以任意插入图片,图形,文字并设定各种格式。在用户使用Zebra打印时,我先在内存中打印成Bitmap,然后针对这个Bitmap进行编码,编码后使用ZPL命令发给打印机进行打印。
    内存Bitmap
    这个是打印的基础,使用Window GDI就好了。有一点需要说明,我生成的Bitmap是24-bit,96DPI(dot per inch)的,Z4M Plus一般使用8dpm(dot per mm),如果换算一下就是203DPI,这也是Z4M Plus的规格(当然也有300DPI的规格)。这样的话,Bitmap的分辨率只有打印机的一半,所以,你如果想打印大小合适的话,你的Bitmap大小应该是打印大小的两倍。记住这点,这是我琢磨了很久才想通的。只有这样,图像的每个dot才可以和打印机的每个dot对应起来,这样,你就可以精确的控制打印机每个打出来的点了。
    图形的HEX编码
    在这里卡了一天,ZPL里写的比较清楚,但是它是针对以毫米为单位的图形的,而我们在内存中的Bitmap是像素pixel,即dot。因为只是黑白打印,所以每个点的状态其实就是2种,要么黑,要么白,这样,每个点状态用一个bit来表示就行了(0是白,1是黑)。一个字节可以表示8个点。这个字节的高低4bit分别代表2个数字,用16进制就是0-F,而编码最终是将每个字节的两个数用ASCII码来显示,即字符的‘0’到‘F’。因为一个字节只能显示一个ASCII字符,所以编好的码需要2倍图形字节的长度。举个例子来说,一个图形只有8个点,前4个为白,后4个为黑,则第一步编码出来为一个字节,字节的8位是00001111,再编码成16进制的ASCII码后,成为2个字节,即字符‘0’‘F’。
    打印
    编码完成后,按照ZPL中的格式,发送~DG命令下载图形编码至Zebra机,然后使用^XG打印就行了。举体语法可以参考ZPL。计算总字节数和行字节数的方法可以参考ZPL,上面提到的scum的Blog,这里有些问题。按照他的算法,图片长度有时会超出界限,所以打印机会报错。
    进阶问题
    因为打印机打印的顺序的关系,按正常图形编码打印出来的内容是上下颠倒的,需要先将内存Bitmap上下颠倒后编码。
    黑白阈值问题,一个点的RGB值可以是黑RGB(0,0,0)和白RGB(255,255,255)之间的任意数,对于一个彩色的像素点,它的颜色打出来到底是白还是黑呢?这里可以多做一些文章,对于文字部分,我取了较大的阈值,而对于图形部分,取了较小的阈值,这样打出来的效果好一些。
     
    上面是我这次使用Zebra打印及开发的心得,我觉得这是一种较完美的解决方法。罗罗嗦嗦写了这么多,希望对大家有所帮助。所有代码使用VC编写,由于涉及公司制度,代码不便公开。各位同好有问题可以发邮件给我[email protected]。也希望能有人想出更好的解决方案。
    2006-11-9
      
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/superjoel/archive/2006/11/09/1375507.aspx
      

  2.   

    Zebra打印机,一般用于打印标签,使用Label Matrix 32,插入图片到标签中,然后用Delphi调用,Label Matrix 32的命令行打印程序就可以打出图片。不要上面那么复杂的处理。有需要,可以留言给我。我最近刚开发了一个类似的软件。
      

  3.   

    不是有自带的控件TPrintDialog 吗
    一个例子
    var
      strect:Trect;    //定义打印输出矩形框的大小
      temhi,temwd:integer;
    begin
      if DIGPrint.execute then
      begin
        temhi:=imgpic.picture.height;
        temwd:=imgpic.picture.width;
        while (temhi = printer.pageheight div 2)and
               //将图形放大到打印页面的1/2大小
              (temwd = printer.pagewidth div 2)   do
        begin
          temhi:=temhi+temhi;
          temwd:=temwd+temwd;
        end;
        with strect do    //定义图形在页面上的中心位置输出
        begin
          left := (printer.pagewidth -temwd) div 2;
          top := (printer.pageheight-temhi) div 2;
          right := left+temwd;
          bottom := top+temhi;
        end;
        with printer do
        begin
          begindoc;
          canvas.stretchdraw(strect,imgpic.picture.graphic);
          enddoc;
        end;
      end;
    end;