PCLラスターカラーグラフィックがゆがんでいます。コードが含まれています:私は何が欠けていますか?
-
08-07-2019 - |
質問
次の関数は、カラーラスターイメージをPCL-5プリンターに印刷します。この機能は、粒子の粗い2色印刷を除いて、完全に機能する2色(1bpp)印刷機能を採用したものです。問題は、次のように画像の右側からページの端まで伸びる大きな黒いバーが画像に現れることです:
IMAGE#########################################
IMAGE#########AREA COMPLETELY BLACK###########
IMAGE#########################################
画像自体は完璧に見えますが、それ以外は完璧です。
さまざまなPCL-to-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)
}
解決
コードにはいくつかの問題があります。まず、カーソルの位置コードが間違っています。次のようになります。
"\u001b*p{0:d}x1:d}Y", 1000, 1000
これは次と同等です:
<esc>*p1000x1000Y
持っていたもの:
<esc>*p1000x*p1000Y
PCLコマンドを結合する場合、同じパラメーター化された値とグループを一致させてから、値+パラメーター化された文字+値+パラメーター化された文字などを追加します。 。
画像を定義するときも、幅と&amp;を指定することをお勧めします。小数点以下の高さ、これはページ上の画像(* 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));
他の推奨事項は、このすべてをファイルに書き込み(エンコードを監視)、少数のPCLビューアーのいずれかを使用してデータを表示するか、常に印刷することです。時間を節約し、1つまたは2つの森林を節約してください。すべて試してみましたが、89ドルを使って pclWorks を購入することをお勧めします。また、多くのPCLを実行する場合は、完全なSDKもあります。すべてのPCLをハードコーディングするので、これは使用しませんが、見栄えはよくなります。
回転に関しては、一部のデバイスで問題が発生しました。jpgを最初に(original.RotateFlip)回転してから書き出すことができます。
今日はあまり時間がありませんが、私のコメントが役に立つことを願っています。月曜日または火曜日にコードをテストし、それを操作してコメントを投稿できます。
PCLは標準ですが、メーカーからメーカー、デバイスからデバイスへのサポートは問題であり、大きく異なる可能性があることに注意してください。基本的なことをするとき、ほとんどのデバイスは大丈夫なようです。ただし、マクロや複雑なグラフィックスを使用する場合、違いが見つかります。