none
文字をDrawImageで印刷すると汚くなる? RRS feed

  • 質問

  • たら男110と申します。

    文字の印刷について
    ご存知の方がいらっしゃいましたら教えてください。

    PrintDocumentを用いた印刷を行っております。
    下記ソースを参照頂ければ話が早いかと思いますが、
    Graphicsオブジェクトを一度Bitmapオブジェクトとしたあとに
    DrawImageで印刷を行うと指定した文字が汚くなって印刷されてしまいます。

    ちなみにその下にはDrawStringで文字を印刷させていますが
    こちらのほうはきれいに印刷されております。

    DrawImageで印刷した場合はどうしても汚くなってしまうものなのでしょうか?

    DrawImageを用いてきれいに印刷する方法はないのでしょうか?

    宜しくお願い致します。



    以下サンプルのコードになります。
    namespace WindowsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
    
                Graphics g = e.Graphics;
    
                //長さの単位をピクセルにする
                g.PageUnit = GraphicsUnit.Pixel;
    
                Bitmap backBuffer = new Bitmap((int)2300, (int)2500, g);
                // 裏画面に描画
                Graphics backG = Graphics.FromImage(backBuffer);
                backG.PageUnit = GraphicsUnit.Pixel;
    
                //文字列を描く
                backG.DrawString("文字列を印刷します。",
                        new Font("MS ゴシック", 10), Brushes.Black, 0, 0);
    
                g.DrawImage(backBuffer, 0, 0);
    
                backG.Dispose();
    
                g.DrawString("文字列を印刷します。",
                        new Font("MS ゴシック", 10), Brushes.Black, 0, 24);
    
    
                //このページで終了
                e.HasMorePages = false;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                printDocument1.Print();
            }
        }
    }

    2009年6月1日 12:33

回答

  • > DrawImageで印刷した場合はどうしても汚くなってしまうものなのでしょうか?

    汚いとは具体的にどんな感じなんでしょうか?

    多分に主観的な判断になるとは思いますが、自分が試した限りでは少なくとも印刷結果が
    汚いということはなかったです。プリンターの違いによるのかもしれません。

    プリンターの違いによるのかもしれません。ちなみに自分が試しに印刷に使ったプリンタ
    はエプソンの EP-901A です。フォントサイズが 10 ですと、DrawImage で描いたほうが
    若干太めに印刷されますが、汚いということはなかったです。フォントサイズを 30 ぐら
    いにして印刷すると見た目は全く変わらずきれいに印刷されます。

    • 回答としてマーク sk7474 2009年6月24日 9:13
    2009年6月1日 14:34
  • Graphics.FromImageで作ったGraphicsと、PrintPageで渡されるGraphicsはdpiが異なるのでは?
    推測として、前者が荒く、後者が細かく描画できるため、荒い状態の1枚絵に描いた文字列をそのまま細かく描画できる所に載せても汚いままということになるのではないかと。


    ところで、印刷において、なぜバックバッファを使っておられるのでしょうか?
    何らかの理由があるのでしょうか?
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年6月24日 9:12
    2009年6月1日 14:54
    モデレータ
  • > Office2003についてくるtifに出力できるプリンター(Microsoft Office Document Image Writer)へ
    > 出力して、tif画像を開いて拡大すると、細かく歯抜けな感じのイメージになります。

    同じようにやってみましたが、backG.DrawString("文字列を印刷します。"... で描いた文字が「細かく歯
    抜けな感じのイメージ」になることはなかったです。

    元のイメージを InterpolationMode などを利用して補間しながら拡大または縮小しているということはな
    いですか? そうすると拡大してみると歯抜けのようになっているということはあるかもしれませんが。

    • 回答としてマーク sk7474 2009年6月24日 9:12
    2009年6月2日 14:32

すべての返信

  • > DrawImageで印刷した場合はどうしても汚くなってしまうものなのでしょうか?

    汚いとは具体的にどんな感じなんでしょうか?

    多分に主観的な判断になるとは思いますが、自分が試した限りでは少なくとも印刷結果が
    汚いということはなかったです。プリンターの違いによるのかもしれません。

    プリンターの違いによるのかもしれません。ちなみに自分が試しに印刷に使ったプリンタ
    はエプソンの EP-901A です。フォントサイズが 10 ですと、DrawImage で描いたほうが
    若干太めに印刷されますが、汚いということはなかったです。フォントサイズを 30 ぐら
    いにして印刷すると見た目は全く変わらずきれいに印刷されます。

    • 回答としてマーク sk7474 2009年6月24日 9:13
    2009年6月1日 14:34
  • Graphics.FromImageで作ったGraphicsと、PrintPageで渡されるGraphicsはdpiが異なるのでは?
    推測として、前者が荒く、後者が細かく描画できるため、荒い状態の1枚絵に描いた文字列をそのまま細かく描画できる所に載せても汚いままということになるのではないかと。


    ところで、印刷において、なぜバックバッファを使っておられるのでしょうか?
    何らかの理由があるのでしょうか?
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年6月24日 9:12
    2009年6月1日 14:54
    モデレータ
  • SurferOnWwwさん
    とりあえず、複数のプリンタで試してみましたが、プリンターによって汚くなり方は、違いますが
    やはり汚くなります。

    どんな漢字化というと、ざらついた感じになります。
    Office2003についてくるtifに出力できるプリンター(Microsoft Office Document Image Writer)へ出力して、
    tif画像を開いて拡大すると、細かく歯抜けな感じのイメージになります。

    線の部分が



    こうなるべきところが



    こんな感じになります


    Azuleanさん
    dpiは、同じになっていると思います。
    BitmapのコンストラクタにGraphicsを渡しています。
    (これって、CompatibleDCと同じようないめーじだとおもっていたのですが・・・・)

    一応、DipX、DipYともに同じことをかくにんしています。

    なぜバックバッファで行っているかということについてなのですが、実際には、文字でなく
    グラフを印刷したいと思っています。
    すでに、Bitmapクラスにグラフを描画して渡してもらっている部分があるので、それを
    描画して印刷が完成になる予定でした。。。

    でも、ざらざらで使い物にならない状態ですw
    2009年6月2日 0:25
  • > Office2003についてくるtifに出力できるプリンター(Microsoft Office Document Image Writer)へ
    > 出力して、tif画像を開いて拡大すると、細かく歯抜けな感じのイメージになります。

    同じようにやってみましたが、backG.DrawString("文字列を印刷します。"... で描いた文字が「細かく歯
    抜けな感じのイメージ」になることはなかったです。

    元のイメージを InterpolationMode などを利用して補間しながら拡大または縮小しているということはな
    いですか? そうすると拡大してみると歯抜けのようになっているということはあるかもしれませんが。

    • 回答としてマーク sk7474 2009年6月24日 9:12
    2009年6月2日 14:32
  • こんにちは。中川俊輔です。
    SurferOnWwwさん、Azuleanさん、詳しいアドバイスや検証ありがとうございます。

    たら男110さん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?問題解決の糸口はつかめましたか?

    有用な情報と思われたため、勝手ながらSurferOnWwwさん、Azuleanさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年6月24日 9:18