4

言語: VB .NET2010Winフォーム

範囲: カスタムラベルをゼブラプリンターに印刷することを目的としたラベル印刷プログラムを開発しました。ラベル全体を画像として印刷しようとしたときに、プリンタからの明瞭さに問題があったため、ラベルから配列にすべてのテキストを保存し、ラベルをクリアして、残った画像をプリンタに送信しようとしています。保存された配列に基づいて新しいテキストをオーバーレイします。この結果は、画像ではなくテキストをプリンタに送信することを目的としています。

問題: 結果のラベルは、希望どおりにテキストに対して非常に明確ですが、印刷方法の位置合わせに問題がありました。テストでは、元の画像を表示し、その上にオーバーレイテキストを表示します。このテキストに完全に揃えるか、適切な範囲内で閉じる必要があります。これを行うと、結果としてそれらは整列されません。

テスト:

    Dim g2 As Graphics
    g2 = Form1.PictureBox2.CreateGraphics
    g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
    g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    g2.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    g2.Clear(Color.White)

    g2.DrawImage(largeimage, New Point(0, 0))

    Dim myBrush As Brush
    Dim i As Integer = 0
    Do Until i = label_array.Count - 1
        myBrush = New SolidBrush(label_array(i).ForeColor)
        g2.DrawString(label_array(i).Text, label_array(i).Font, myBrush, label_array(i).Location)
        i = i + 1
    Loop

印刷方法では、上記の方法を使用して、オーバーレイと画像を画像ボックスに出力しました。これを行うとき、しかし、それは機能します...

    e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    e.Graphics.Clear(Color.White)

    e.Graphics.DrawImage(largeimage, New Point(0, 0))

    i = 0
    Do Until i = label_array.Count - 1
        myBrush = New SolidBrush(label_array(i).ForeColor)
        e.Graphics.DrawString(label_array(i).Text, label_array(i).Font, myBrush, label_array(i).Location)
        i = i + 1
    Loop

..上記の印刷グラフィックにそれを行うと、ミスアライメントが発生します。

何でもやってみますので、どんなアイデアでも大歓迎です。印刷グラフィックは、私が気付いていない通常のグラフィックから追加の何かをしていると思います。


TextRenderer.DrawTextがDrawStringと比較して結果を改善することに気づきました。ただし、これを使用すると、結果は元のスケーリング係数から未知のスケーリング係数でスケーリングされているように見えます...

以下は、元のオーバーレイの上に作成されたオーバーレイです。 ここに画像の説明を入力してください

4

2 に答える 2

2

Graphics.DrawString()でよく知られている問題を再発見していますが、これは正確ではありません。この問題の最もグラフィックなデモンストレーションは、次のサンプルWinformsフォームです。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", 
            this.Font, Brushes.Black, 0, 0);
    }
}

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

ここに画像の説明を入力してください

文字の間隔が突然変化する文字列の部分に、魔法の量が重なることはありません。GDI +は、解像度に依存しないテキストレンダリングをMicrosoftが初めて試みたものであり、うまく機能しませんでした。それは良い関係にあり、WPFは2回目の試みであり、ファジー出力のために多くのフレークを取得しました。.NET 2.0 for Winformsで修正された方法と同様の方法で解決されたため、TextRenderer.DrawText()を使用して常にテキストをウィンドウにレンダリングする必要があります。レンダリングされたテキストをスムーズに拡大縮小しようとはしませんが、常にピクセルグリッドに合わせることが優先されます。.NET 4で追加された、 WPFの理想的なレンダリングモードとディスプレイレンダリングモードについても同じことが言えます。

あなたのアプローチには他にも重大な問題があります。テキストのレンダリング方法はプリンターにはかなり不適切です。ズームインするとピクセルが表示されることがわかります。SysInternalsのZoomItユーティリティはそのために適しています。右側の図の文字aを拡大しました。

ここに画像の説明を入力してください

文字の形のフリンジにある赤みがかった青みがかったピクセルに注意してください。これはClearTypeと呼ばれるアンチエイリアシング技術であり、LCDモニターの知覚解像度を向上させます。LCDパネルでのみ機能し、同じストライプパターンを持たないプリンタでは機能しません紙の上では、文字は色付きのフリンジでぼやけて見えます。Zebraプリンタはカラー印刷をサポートしていないため、それほど悪くはありませんが。

これらは、解像度がかなり低いデバイスであるモニターへのテキストのレンダリングに固有のアーティファクトです。ピクセルグリッドフィッティングとClearTypeは、テキストを適切に見せるためのトリックです。一般的なモニターの1インチあたりのピクセル数は約120ピクセル以下です。これは、Appleが「網膜」ディスプレイを推進することでようやく改善されているとはいえ。高解像度モニターに出資している会社で、彼らは伝統的に「理想的な」モードでテキストをレンダリングしていました。

これらのレンダリングトリックは、はるかに高い解像度のデバイスであるプリンタにはまったく不適切です。1インチあたり600ピクセルが一般的で、モニターよりも簡単に5倍優れています。ピクチャーボックスをプリンターに描画することにより、プリンターに直接描画するときに得られる改善を事実上無駄にしています。それらの違いは非常に重要であり、肉眼で簡単に確認できます。600 dpiでテキストをレンダリングすると、テキストははるかに美しく鮮明に見えます。元々120dpiでレンダリングされ、プリンター用に拡大されたテキストは、「ぼろぼろ」で粗く見えます。

プリンタに描画するには、常にPrintDocumentクラスを使用してください。

于 2013-03-02T23:45:42.473 に答える
1

ずっと前に、私はラベルをZebraプリンターに印刷するためのアプリケーションを書いたので、多分私は助けることができます。当時は、ZPL2 APIしかなく、印刷されたテキストと単純なグラフィックだけで、この画像はありませんでした。ともかく...

私の疑いは、それがスケーリングの問題であるということです。それはあなたの元の画像がぼやけている理由を説明するかもしれません-おそらくプリンターはラベルに合うようにそれを自動的に拡大縮小しようとしていて、それの悪い仕事をしていますか?そしてもちろん、それは上記の結果のラベルを説明します。

上記のコードについて私が驚いたのは、Graphicsオブジェクトを取得する方法です。1つは絵の箱から来ています。もう1つはおそらくプリンタからのものです。Graphicsオブジェクトはデバイスに依存することに注意してください。つまり、そのプロパティとその印刷方法は、特定のコントロール(コントロールごとにスケーリングが異なる場合があります)に印刷するのか、特定のプリンターに印刷するのかによって異なります。

既存のコードを使用してレーザープリンターに印刷してみましたか?結果を見るのは面白いかもしれません。ScaleTransformなどのグラフィックスプロパティも参照してください。

于 2013-02-28T17:52:11.727 に答える