2010-06-15 59 views
1

我無法生成圖像並將其上載到EPL2打印機。用於EPL2 Zebra打印機的圖像(PCX)

對於任何可用的軟件,我都感到很茫然。

我有一個1位文件,我嘗試使用下面的腳本上傳..

setppi.txt

GK"NAMEPCX" 
GK"NAMEPCX" 
GM"NAMEPCX"3042 

,然後上傳與

copy setppi.txt+ppirmt.pcx lpt1/b 

有沒有經驗的人在我撕下剩餘的頭髮之前得到了任何提示?我幾乎可以肯定,這個問題與創建pcx有關,但嘗試過所有的選擇,我不確定下一步。

+1

你有沒有解決這個問題?我被困在試圖做同樣的事情 – fearofawhackplanet 2011-01-04 12:06:48

+0

@fearofawhackplanet我目前正在實施一個POC翻譯SVG到EPL - 你可以找到相關的代碼轉換和發送* .png *文件作爲PCX的打印機:https:// github.com/dittodhole/dotnet-System.Svg.Render.EPL – 2016-05-15 16:29:46

回答

3

這是我發現正確創建PCX方式:

在GIMP,將文件保存爲1位(黑白)BMP。不要選擇PCX,因爲保存的格式不是打印機要求的1-bit PCX!

使用imagemagick的轉換程序將您的BMP轉換爲PCX。

我得到這個問題後遇到的另一個問題是,圖形仍然是腐敗的,這是一個代碼頁問題,所以要小心。

+1

什麼代碼頁問題,你是如何解決它? – Andrioid 2011-06-08 13:46:30

+0

@Android借調...當我嘗試打印圖像時,我只得到一排點。代碼頁問題是什麼? – Michael 2017-03-07 17:41:49

1

有兩種使用EPL2語言輸出PCX圖形的方法。第一個是你的建議之一:

GK"namepcx" 
GK"namepcx" 
GM"namepcx",3042 
..... and here follows monochrome PCX data ... 
..... with 128-bit header and following pixel data 1 bit-per pixel.. 

後,你應該能夠寫這個存儲「namepcx」到打印機的圖像緩衝區通過 GM 但是我花了兩天時間試圖店PCX,但它會永遠不能正確存儲。所以我最終只是使用GW命令將像素數據直接寫入打印機圖像緩衝區。避免「存儲在閃存中」。最初這個通過GM的「閃存」存儲意味着存儲一些圖像(如標誌),這些圖像會在所有標籤上重複出現。因此,您可以存儲一次,然後打印具有相同徽標的10000個標籤。但是,如果從java中冒出來,通常你會在不同的標籤上打印許多不同的圖像。因此,如果您存儲以爲每個標籤刷新新圖像,那麼您將很快「消除」閃存。 (例如,LP 2824打印機的手冊說閃存只有100k個寫週期)。

因此,看起來使用GW將圖像直接寫入圖像緩衝區而不是使用3步GK GM GG可能是更好的解決方案。

0

免責聲明:我目前正在寫一個SVG到EPL-transpiler,可以發現here

我最近面臨着同樣的問題,並與發送GW -command到打印機解決它。

GK的主要區別 - GK - GM - GG是,你不一起發送PCX頭,而是原始二進制數據(據我所知沒有LRE壓縮)。

我使用了以下(非優化/天真)的C#代碼,它大量使用了位移。該算法可以在思想上任何語言來實現,非常簡單:

[NotNull] 
public IEnumerable<byte> GetRawBinaryData([NotNull] Bitmap bitmap, 
              int octetts) 
{ 
    var height = bitmap.Height; 
    var width = bitmap.Width; 

    for (var y = 0; 
     y < height; 
     y++) 
    { 
    for (var octett = 0; 
      octett < octetts; 
      octett++) 
    { 
     var value = (int) byte.MaxValue; 

     for (var i = 0; 
      i < 8; 
      i++) 
     { 
     var x = octett * 8 + i; 
     var bitIndex = 7 - i; 
     if (x < width) 
     { 
      var color = bitmap.GetPixel(x, 
             y); 
      if (color.A > 0x32 
       || color.R > 0x96 && color.G > 0x96 && color.B > 0x96) 
      { 
      value &= ~(1 << bitIndex); 
      } 
     } 
     } 

     yield return (byte) value; 
    } 
    } 
} 

你必須牢記的轉換的事情:

  • 1:白點
  • 0:黑點
  • width必須是8的倍數(因爲我們正在發送字節) - 上面的代碼通過填充來處理此問題
  • 標籤的旋轉/方向!
  • 某個閾值在這裏實現...

我還實施GM - GG,但這將超越這個答案的範圍。相關代碼可在EplCommands.StoreGraphics(bitmap:Bitmap,name:string)中找到。

相關問題