3

参照リンク:

  1. https://lh4.googleusercontent.com/-ceLtiOLVtME/UMBL1yf4RpI/AAAAAAAAAD0/itid5KibW_I/s1015/Doc1.png

  2. https://lh6.googleusercontent.com/-nrphBDA6sjk/UMA_Ukh7ZSI/AAAAAAAAADY/LwjkgobOaBg/s846/MappingTable.png

更新しました

現在、LockBits を使用して画像変換を変更しましたが、失敗しました。誰でも私に何か提案をすることができますか?

    /// <summary>
    /// Orginal command Format in Decimal:
    /// 29[GS], 40[(], 76[L], pL, PH, 48(m), 67[fn], 48[a], kc1, kc2, b, xL, xH, yL, yH, c, [d1 -- dk]
    /// pL = Lower bit of sum of parameters (m to dk) = 11(m to c) + last bit of image
    /// pH = Higher bit of sum of parameters (m to dk) = 11(m to c) + last bit of image
    /// kc = Key Code of NVRam, kc1 = first bit of key code, kc2 = second bit of key code. P.S.: The key code will be hardcode H1.
    /// b = number of colors = 1
    /// xL & xH = Lower bit of image width, e.g. Width = 128 = 0x0080 then xL = 0x80, xH = 0x00
    /// </summary>
    /// <param name="pLogo"></param>
    public void LoadImageToPrinter(Bitmap pLogo)
    {
        BitmapData oBmpData = pLogo.LockBits(new Rectangle(0, 0, pLogo.Width, pLogo.Height), ImageLockMode.ReadOnly, pLogo.PixelFormat);

        //The list contains all the commands in Decimal format
        List<int> oCommandList = new List<int>();

        //k = (int((xL + xH × 256) + 7)/8) × (yL + yH × 256)

        string HexValueOfX = pLogo.Width.ToString("X4");
        string HexValueOfY = pLogo.Height.ToString("X4");

        //k
        int oExpectedImageByteCount = Math.Abs(oBmpData.Stride) * pLogo.Height;

        //Total bit used for parameters
        int oTotalParameterBitCount = 11 + oExpectedImageByteCount;

        //The hex value for the oTotalParameterBitCount
        string oTotalParameterBitCountInHex = oTotalParameterBitCount.ToString("X4").PadLeft(4, '0');

        //GS, (, L
        oCommandList.AddRange(new int[] { 29, 40, 76 });

        //pL
        oCommandList.Add(GetLowerHexValue(oTotalParameterBitCountInHex));

        //pH
        oCommandList.Add(GetHigherHexValue(oTotalParameterBitCountInHex));

        //m,  fn, a,  kc1, kc2, b
        oCommandList.AddRange(new int[] { 48, 67, 48, (int)'H', (int)'1', 1 });

        //xL, xH
        oCommandList.AddRange(new int[] { GetLowerHexValue(HexValueOfX), GetHigherHexValue(HexValueOfX) });

        //yL, yH, c
        oCommandList.AddRange(new int[] { GetLowerHexValue(HexValueOfY), GetHigherHexValue(HexValueOfY), 49 });

        //Append the image bit to the List
        byte[] oImageByte = new byte[oExpectedImageByteCount];
        IntPtr oPtr = oBmpData.Scan0;
        Marshal.Copy(oPtr, oImageByte, 0, oExpectedImageByteCount);
        pLogo.UnlockBits(oBmpData);

        //Clear NVRam
        mThermalPrinterLibrary.Write(new int[] { 29, 40, 76, 5, 0, 48, 65, 67, 76, 82 }.IntArrayToCharString());

        //Store graphics data
        mThermalPrinterLibrary.Write(oCommandList.ToArray().IntArrayToCharString());
        mThermalPrinterLibrary.Write(oImageByte);

        //Print the graphics data
        mThermalPrinterLibrary.Write(new int[] { 29, 40, 76, 6, 0, 48, 69, (int)'H', (int)'1', 1, 1 }.IntArrayToCharString());        
}
4

1 に答える 1

5

私は何年も前にCでこれを行ってきました。手に入れるコードはありませんが、それは単なるスニペットではありません。これを行うには、次のことを行う必要があります。

  • BMPファイル形式を理解します-ファイルからビットマップを読み取っていると仮定します。

  • ファイルヘッダーなどのCスタイルの定義があるWINGDI.H(Microsoft Windows SDK)を見てください:BITMAPFILEHEADER、BITMAPCOREHEADER、BITMAPINFOHEADER。

  • ヘッダーを処理して、ビットマップが要件を満たしているかどうかを判断します(たとえば、処理を簡素化するために、ビットマップが正確に128 x 98(BITMAPINFOHEADER.biWidth、BITMAPINFOHEADER.biHeight)であり、1つの平面(BITMAPINFOHEADER.biPlanes)を持っていることを主張できます。 = 1)、モノクロ(BITMAPINFOHEADER.biBitCount = 1)、圧縮されていません(BITMAPINFOHEADER.biCompression = 0)。これらの制限は絶対に必要というわけではありませんが、処理が簡素化されます。

  • ピクセル配列を処理し、ESCPOSエスケープシーケンスに必要な形式に変換します。

または、ESCPOSの使用を中止し、代わりにOPOS / UPOS / POS for .NETを使用することもできます。これにより、POS周辺機器にアクセスするための高レベルのAPIが提供れます。自分でフォーマット変換を行います。これを行うには、 EpsonOPOSADKをダウンロードする必要があります。幸運を!

アップデート

そして、EPSONのドキュメントは、地獄のように、何が必要かを理解していません。

エプソンのドキュメントの難しさは何ですか?たぶん、あなたはあなたが理解していないビットについて特定の質問をすることを試みることができます。

更新2

ここにいくつかのポインタがあります:

  • GS(L pL pH m fn [params]:pLとpHは、次のデータの長さをバイト単位で指定する16ビット整数値の下位バイトと上位バイトです(つまり、m fn [params])。

  • fn = 67(NVデータラスター形式の定義)の場合、形式はGS(L pL pH m fn a kc1 kc2 b xL xH yL yH [c d1 ... dk] 1 ... [c d1 ... dk] bここで、m = 48、fn = 67、a=48です。

  • kc1とkc2は、ダウンロードしたデータを印刷するときに識別するために使用されるキーコードです。

  • bは、ダウンロードしたデータの色数を指定します。1はモノクロ、2は2色です。

  • xLおよびxHは、画像のドット(ピクセル)単位の幅を定義する16ビット整数値の下位バイトおよび上位バイトです。

  • yLとyHは、画像のドット(ピクセル)単位の高さを定義する16ビット整数値の下位バイトと上位バイトです。

  • モノクロビットマップの場合、色cとピクセルデータを指定する1つのブロックc d1...dkがあります。カラービットマップの場合、色ごとに1つのブロックc d1...dkがあります。

  • ピクセルデータd1...dkにはkバイトがあり、k =(幅x(高さ+7))/8です。1に設定されたビットは、そのドット(ピクセル)を印刷することを意味します。

上記がエプソンのドキュメントのメモよりも明確であるかどうかはわかりません。あなたが理解していないビットを言わない場合。

更新3

これは、質問に示されているように、幅128 x高さ98のビットマップに基づく例です。簡単にするために、モノクロです。

  • k =(int(width + 7)/ 8)×(height)=(int(128 + 7)/ 8)x 98 = 16 x 98 = 1568バイトのピクセルデータが必要です(ビット=1はドット印刷を意味します) ):d1からd1568

  • 色c=色1=49小数=0x31hex(0x32または0x33の場合もあります)

  • 幅=128= 0x0080、つまりxH = 0x00、xL = 0x80

  • 高さ=98= 0x0062、つまりyH = 0x00、yL = 0x62

  • b=色の数=1

  • キーが「H1」であると想定します。つまり、kc1 ='H'=0x48およびkc2='1' = 0x31

  • param length = m fn a kc1 kc2 b xL xH yL yH cd 1 ... d 1568 = 11 + 1568 = 1579 = 0x062B hexの長さ、つまりpL = 0x2B、pH=0x06。

したがって、送信するデータは次のようになります。

GS(L pL pH m fn a kc1 kc2 b xL xH yL yH cd 1 ... d 1568

16進数:

1D 28 4C 2B 06 30 43 30 48 31 01 80 00 62 00 31 d 1 ... d 1568

于 2012-12-05T08:01:22.190 に答える