3

次の関数は、カラー ラスター イメージを PCL-5 プリンターに印刷します。この関数は、粒子の粗い 2 色印刷を除いて、完全に機能する 2 色 (1bpp) 印刷機能から適応されました。問題は、次のように、画像の右側からページの端まで大きな黒いバーが表示されることです。

  IMAGE#########################################
  IMAGE#########AREA COMPLETELY BLACK###########
  IMAGE#########################################

それ以外の場合、画像自体は完璧に見えます。

さまざまな PCL から PDF への変換ツールで画像がまったく表示されないため、何かを行うのを忘れているように思えます。適切なリセット (\u001bE\u001b%-12345X) が前に送信され、ページ フィードが後に送信されました。

そこにPCLの専門家はいますか?私は PCL 5 Color テクニカル リファレンス マニュアルを手に入れました。しかし、この最後のことは私を夢中にさせています。

*編集: どのコマンドが問題を引き起こしているかはわかりましたが、その理由はわかりません:

  stream("\u001b*r0F"); 

これにより、ページに合わせて画像が回転したままになります (縦、横)。これを削除すると、問題はなくなります。事前にビットマップを回転させることで補正できますが、何が原因なのか知りたいです!

   static void PrintImage()
    {
        // Get an image into memory
        Image original = Image.FromFile("c:\\temp\\test.jpg");
        Bitmap newBitmap = new Bitmap(original, original.Width, original.Height);

        stream(String.Format("\u001b*p{0:d}x*p{1:d}Y", 1000, 1000));// Set cursor.
        stream("\u001b*t300R");                                     // 300 DPI
        stream(String.Format("\u001b*r{0:d}T", original.Height));   // Height
        stream(String.Format("\u001b*r{0:d}S", original.Width));    // Width

        stream("\u001b*r3U");      // 8-bit color palette
        stream("\u001b*r0F");      // Follow logical page layout (landscape, portrait, etc..)
        // Set palette depth, 3 bytes per pixel RGB
        stream("\u001b*v6W\u0000\u0003\u0000\u0008\u0008\u0008");  
        stream("\u001b*r1A");      // Start raster graphics
        stream("\u001b*b0M");      // Compression 0 = None, 1 = Run Length Encoding

        // Not fast, but fast enough.  
        List<byte> colors = new List<byte>();
        for (int y2 = 0; y2 < original.Height; y2++)
        {
            colors.Clear();
            for (int x2 = 0; x2 < original.Width; x2++)
            {
                Color c = newBitmap.GetPixel(x2, y2);
                colors.Add(c.R);
                colors.Add(c.G);
                colors.Add(c.B);
            }

            stream(String.Format("\u001b*b{0}W", colors.Count));     // Length of data to send
            streamBytes(colors.ToArray());                           // Binary data
        }
        stream("\u001b*rB");   // End raster graphics  (also tried *rC -- no effect)
    }
4

1 に答える 1

4

コードにはいくつかの問題があります。まず、カーソル位置コードが正しくありません。次のように表示されます。

"\u001b*p{0:d}x1:d}Y", 1000, 1000

これは次のようになります。

<esc>*p1000x1000Y

持っていた:

<esc>*p1000x*p1000Y

PCL コマンドを結合するときは、同じパラメーター化された値とグループを一致させ、値 + パラメーター化された文字 + 値 + パラメーター化された文字などを追加するだけです。最後のパラメーター化された文字は、PCL コマンドの終わりを示す大文字であることを確認してください。

また、画像を定義するときは、幅と高さをデシポイントで指定することをお勧めします。これは、ページ上の画像 (*r3A) のスケーリングに役立つため、これを追加します (解像度コマンドが適切な場所である必要がある直後)。 :

Int32 deciHeight = original.Height / (int)original.HorizontalResolution * 720;
Int32 deciWidth = original.Width / (int)original.VerticalResolution * 720;
stream("\u001b*t{0:d}h{1:d}V", deciHeight, deciWidth));

もう 1 つの推奨事項は、これらすべてをファイルに書き込み (エンコーディングに注意してください)、少数の PCL ビューアーの 1 つを使用してデータを表示するのではなく、常に印刷することです。時間を節約し、森林を 1 つまたは 2 つ節約する必要があります。私はそれらすべてを試しましたが、89 ドルを費やして pclWorks を購入することをお勧めします。多くの PCL を実行する場合は、完全な SDK も用意されています。すべての PCL を自分でハードコーディングしているため、これは使用しませんが、見栄えはします。

回転に関しては、一部のデバイスで問題が発生しました。最初に jpg を回転させ (original.RotateFlip)、それから書き出すことができます。

今日はあまり時間がありませんが、私のコメントがお役に立てば幸いです。月曜日か火曜日にあなたのコードをテストして作業し、さらにコメントを投稿できます。

PCL は標準ですが、メーカーごと、およびデバイスごとのサポートは問題であり、大きく異なる可能性があることに注意してください。基本的なことを行う場合、ほとんどのデバイスは問題ないように見えます。ただし、マクロや複雑なグラフィックスを使用すると、違いがわかります。

于 2008-11-22T13:37:13.290 に答える