none
画像に描画して印刷すると大きさが変わってしまう RRS feed

  • 質問

  • いつも大変お世話になっております。
    今回は.jpegファイルに描画した上で印刷する処理で悩んでいますので質問させていただきました。

    ・前もってあるjpegファイル
    test1.jpg
    2340×1654(ピクセル)
    A4横

    ・出力
    test2.jpg
    2340×1654(ピクセル)
    A4横

    以下のようなソースを記述し、実行しました。
    エラーもでず、円の描画も適切な位置に表示されました。

    Windows フォトビューワで閲覧しても適切のように見え、印刷も適切にでます。
    (test1.jpgをA4横で印刷したのと同じように、test2.jpgも印刷される)

    ところが、PrintDocumentを使ってtest2.jpgを印刷しますと、適切に印刷されません。
    ・全体ではなく、座標(0,0)から途中までしか表示されない。
    ・拡大されている。
    ・A4横には出る。

    描画した結果(test2.jpg)もtest1.jpgと同じように印刷したいのですが、何か間違っているでしょうか?
    ご教示お願い申し上げます。


    *補足
    ・印刷はそれなりに品質が必要。
    ・test1.jpgをそのまま印刷すると問題なし。

    ----------------
      Private Sub Buttun1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttun1.Click  
                '加工前のもの
                Dim imgBefore As Image = Image.FromFile("test1.jpg")

                Dim saveimage As New Bitmap(imgBefore.Width, imgBefore.Height)

                Dim g As Graphics = Graphics.FromImage(saveimage)

                g.DrawImage(imgBefore, 0, 0, imgBefore.Width, imgBefore.Height)

                '//円を描画
                g.DrawEllipse(New Pen(Color.Red, 3), 134, 197, 30, 30)
                g.DrawEllipse(New Pen(Color.Red, 3), 134, 273, 30, 30)

                '//破棄
                g.Dispose()

                'jpgで保存する
                saveimage.Save("test2.jpg", Imaging.ImageFormat.Jpeg)

                '//破棄
                imgBefore.Dispose()
                saveimage.Dispose()

                PrintDocument1.DefaultPageSettings.Landscape = True

                PrintDocument1.Print()

        End Sub

        Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

            Dim mypic As New Bitmap("Test2.jpg")
            e.Graphics.DrawImage(mypic, 0, 0)

        End Sub
    ----------------

    2011年10月14日 6:48

回答

  • まずは、e.Graphics の DpiX, DpiY メンバの値を確認してください。それと、Image(Bitmap)の HorizontalResolution, VirticalResolution を確認します。Graphics.DrawImage(Image, Int32, Int32) の説明には、「元の物理サイズで」と書かれています。描画先と描画したいものの解像度が違うために不都合が起こっているのではないかと推測されます。この場合、Graphics.DrawImage(Image, Rectangle) を使用した方が良いかもしれません。Width, Height は、e.Graphics の描画範囲から指定します(mypic.Width, Height を指定しても結果が変わらないのは当然です)。この時、縦横比を保つように注意してください。
    それから、e.Graphics.PageUnit も確認してください。これは、Graphics のメソッドで扱う数値の単位を指定します。これを間違えるとえらいことになります(過去にえらいことになった)。まぁ、描画先座標が (0, 0) なので、関係ないと思いますが。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2011年11月8日 7:49
    • 回答としてマーク 山本春海 2011年11月10日 8:48
    2011年10月14日 12:56

すべての返信

  • DPI の違いのせいではないでしょうかね。

    DrawImage するときは、Point(相当)だけではなく Rectangle(相当)を渡すようにした方がたいていの場合望ましい結果になると思います。

    要するに、PrintPage イベント内の DrawImage に、width/height も渡してやればいいのではないかと。

    2011年10月14日 7:36
  • ご回答ありがとうごいざます。

      e.Graphics.DrawImage(mypic, 0, 0,mypic.Width,mypic.Height)

    上記をしましたが結果が変わりませんでした。

    >DPI の違いのせいではないでしょうかね。

    調査してみます。。。

     

     

    2011年10月14日 8:28
  • まずは、e.Graphics の DpiX, DpiY メンバの値を確認してください。それと、Image(Bitmap)の HorizontalResolution, VirticalResolution を確認します。Graphics.DrawImage(Image, Int32, Int32) の説明には、「元の物理サイズで」と書かれています。描画先と描画したいものの解像度が違うために不都合が起こっているのではないかと推測されます。この場合、Graphics.DrawImage(Image, Rectangle) を使用した方が良いかもしれません。Width, Height は、e.Graphics の描画範囲から指定します(mypic.Width, Height を指定しても結果が変わらないのは当然です)。この時、縦横比を保つように注意してください。
    それから、e.Graphics.PageUnit も確認してください。これは、Graphics のメソッドで扱う数値の単位を指定します。これを間違えるとえらいことになります(過去にえらいことになった)。まぁ、描画先座標が (0, 0) なので、関係ないと思いますが。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2011年11月8日 7:49
    • 回答としてマーク 山本春海 2011年11月10日 8:48
    2011年10月14日 12:56
  • こんにちは、アースワーム さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    しばらく経ちましたが、その後いかがでしょうか。

    Jitta さんからの情報は参考になるのではないかと思われましたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    Jitta さん、情報ありがとうございます。

    アースワーム さん、現在の状況はいかがでしょうか。情報の更新をしていただけるとうれしいです。

    また、こちらのスレッドをご覧の方で、同じ問題で有効な情報をお持ちの方は是非投稿をお願いいたします。
    よろしくお願いいたします。
                                                                                                        
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年11月10日 8:48
  • 回答としてマーク せず、すみません。

     

    Jittaさんのおっしゃるとおり、解像度を設定したらうまく行きました。

    ありがとうございました。

    2011年11月16日 2:39