QA@IT

VS2005(.net)で画像の結合→結合した画像の印刷をするには?

6180 PV

初めましてgfcm2912と申します。
質問ですが、VS2005(DB:oracle)で.netのプログラムを作っているのですが、
(横)230mm×(縦)100mmの横長の画像を4個縦に並べてレターサイズで印刷出力したい場合、
どういう風に作ればいいのでしょう?
(4個の画像はPC内のローカルにあると仮定します)

少々ネットで検索して、画像の結合に際して、結合後用の230×400のBitmapと各画像用のBitmapをそれぞれ作って、
Graphicsを用意して、Graphics.DrawImageで結合していく?感じのものは見つけたのですが、
結合してレターサイズに印刷する一連の流れがどうも掴めなくて困っています。

どうか知恵を貸して頂けませんでしょうか?
お願い致します。

↓以下2012/12/26更新

回答してくださいましたShuさんありがとうございました。

                ' 用紙方向を横向きに設定
                'PrintDocument1.DefaultPageSettings.Landscape = True
                ' 用紙方向を縦向きに設定
                PrintDocument1.DefaultPageSettings.Landscape = False

                ' 用紙サイズをレターサイズに設定
                For Each psz As Printing.PaperSize In _
                    PrintDocument1.PrinterSettings.PaperSizes
                    If psz.Kind = Printing.PaperKind.Letter Then
                        'If psz.Kind = Printing.PaperKind.A4 Then
                        PrintDocument1.DefaultPageSettings.PaperSize = psz
                        Exit For
                    End If
                Next




                ' 画像印刷
                PrintDocument1.PrintController = _
                    New Printing.StandardPrintController
                PrintDocument1.Print()

↑ここの辺りは前に掲載した部分とほとんど同じです。

↓結合後の一枚絵は必要なかったのでe.Graphicsに纏めました。

Private Sub PrintDocument1_PrintPage( _
    ByVal sender As System.Object, ByVal e As _
    Printing.PrintPageEventArgs) _
    Handles PrintDocument1.PrintPage
    e.HasMorePages = True

    Select Case ImageCnt
        Case 1
            bmpPrint1 = New Bitmap(strbmpAllPass1)
            e.Graphics.DrawImage(bmpPrint1, bmpWidthPoint, bmpHeightPoint1, bmpWidth, bmpHeight)
            bmpPrint1 = Nothing
        Case 2
            bmpPrint1 = New Bitmap(strbmpAllPass1)
            bmpPrint2 = New Bitmap(strbmpAllPass2)
            e.Graphics.DrawImage(bmpPrint1, bmpWidthPoint, bmpHeightPoint1, bmpWidth, bmpHeight)
            e.Graphics.DrawImage(bmpPrint2, bmpWidthPoint, bmpHeightPoint2, bmpWidth, bmpHeight)
            bmpPrint1 = Nothing
            bmpPrint2 = Nothing
        Case 3
            bmpPrint1 = New Bitmap(strbmpAllPass1)
            bmpPrint2 = New Bitmap(strbmpAllPass2)
            bmpPrint3 = New Bitmap(strbmpAllPass3)
            e.Graphics.DrawImage(bmpPrint1, bmpWidthPoint, bmpHeightPoint1, bmpWidth, bmpHeight)
            e.Graphics.DrawImage(bmpPrint2, bmpWidthPoint, bmpHeightPoint2, bmpWidth, bmpHeight)
            e.Graphics.DrawImage(bmpPrint3, bmpWidthPoint, bmpHeightPoint3, bmpWidth, bmpHeight)
            bmpPrint1 = Nothing
            bmpPrint2 = Nothing
            bmpPrint3 = Nothing
        Case Else
            bmpPrint1 = New Bitmap(strbmpAllPass1)
            bmpPrint2 = New Bitmap(strbmpAllPass2)
            bmpPrint3 = New Bitmap(strbmpAllPass3)
            bmpPrint4 = New Bitmap(strbmpAllPass4)
            e.Graphics.DrawImage(bmpPrint1, bmpWidthPoint, bmpHeightPoint1, bmpWidth, bmpHeight)
            e.Graphics.DrawImage(bmpPrint2, bmpWidthPoint, bmpHeightPoint2, bmpWidth, bmpHeight)
            e.Graphics.DrawImage(bmpPrint3, bmpWidthPoint, bmpHeightPoint3, bmpWidth, bmpHeight)
            e.Graphics.DrawImage(bmpPrint4, bmpWidthPoint, bmpHeightPoint4, bmpWidth, bmpHeight)
            bmpPrint1 = Nothing
            bmpPrint2 = Nothing
            bmpPrint3 = Nothing
            bmpPrint4 = Nothing

    End Select



    e.HasMorePages = False

End Sub

こんな感じで無事出るようになりました。
定数はPrivateで宣言しています。
ミリメートル単位が使えないのが少し心残りですが(笑)

Shuさん、本当にありがとうございました。

回答

見落としていましたが、

Using bmp As New Bitmap(230, 400, e.Graphics) '230mm×400mmの大きな画像
230Pixcel x 400Pixcel の画像になってしまいます。

編集 履歴 (0)
  • e.Graphics.PageUnit = GraphicsUnit.Millimeter ←左記でe.Graphics.PageUnitを単位ミリメートルに変換していますが、これは駄目なのでしょうか? -
  • PageUnitの指定は関係なくPixel単位となります。
    e.Graphicsを渡しているので解像度はe.Graphicsのものが使用されます。
    つまりプリンタ解像度が300dpi×300dpiであれば
    約0.8inch × 1.3inch
       ≒ 20mm × 32mm
    の大きさしか確保されません
    -
  • なるほど、それでは(出すプリンタは1200dpiですので) Using bmp As New Bitmap(10866, 4725, e.Graphics) ←左記のように宣言しなければいけないということですか? -
  • 縦サイズ修正:Using bmp As New Bitmap(10866, 18898, e.Graphics)
    -
  • 数値の検証はしていませんがそういうことです。
    ただプリンタ毎に変わってくるので今のやり方だと解像度を考慮して指定する必要が発生してしまいます。
    bmp.Saveを実際に行う必要がなければ直接e.Graphicsに描画された方がスマートになると思います。幅、高さ指定付のDrawImageを使用すればよいかと思います。
    -
  • >幅、高さ指定付のDrawImageを使用すればよいかと思います。

    すみません。
    これについて教えていただけますか?
    -
  • すみません↑の部分は自分で検索して解決しました。週明けに出社したら実際のデータ使って試してみます。結果はお知らせします。ありがとうございました。 -

Private bmpPrint1 As Bitmap
Private bmpPrint2 As Bitmap
Private bmpPrint3 As Bitmap
Private bmpPrint4 As Bitmap

への設定処理はどのように行っているのでしょうか?
設定後これらをSaveして確認してみてはどうでしょうか。

編集 履歴 (0)
  • 画像設定はSetValue()とMakeImageFile()という(リライタブルプリンタ用独自関数)を利用して画像を作成しています。
    g.DrawImage(bmpPrint1, 0, 0)~の前でSAVEしてみましたが、一つ一つの画像はきちんと出来ています。
    -

PrintDocumentを使用して
PrintPageイベントにてGraphicsにDrawImageを行うとよいです。

参考URL:
http://dobon.net/vb/dotnet/graphics/printdocument.html

用紙の指定は
PrintDocument.DefaultSettings.PaperSize

PrintDocument.PrinterSettings.PaperSizes 内の

KindPaperKind.Letter の物を指定するとよいかと思います。

編集 履歴 (0)
  • すみません。回答欄に書いてしまいました。
    状況は上に書いたとおりです。
    結合した画像を印刷しても画像が印刷できない(白紙)という事は、
    画像の結合に失敗しているという事でしょうか?
    -
  • ちなみに、
    ちなみに、
    'bmp.Save("C:\Prnt\bmp2\" & BoothID & "_" & SERNO & "_" & setbmpdate & ".jpg")
    の部分を有効にして保存してみると、
    (画像→http://ll.la/make.pl パス:4345)のようになっています。
    -
  • リンク修正
    http://www1.axfc.net/uploader/so/2720040
    パス:4345
    -

Shuさんありがとうございます。
とりあえず、Shuさんの示したくれた参考ページや自分でも再検索した結果を参考に
以下プログラム(要点のみ)を作ってみましたが、白紙で印刷されてしまいます。
どこかおかしいでしょうか?

※プログラムは要点部分のみを抽出しています。
(同クラス内でoracleからデータを抽出→1件ずつループ、
bmpPrint1~4にデータから作成した画像を1件ずつ格納、
4個(4件)画像が出来たら下の「用紙方向を縦向きに設定」のプログラムに遷移、
印刷して次のデータへ~ループをしています)

Private bmpPrint1 As Bitmap
Private bmpPrint2 As Bitmap
Private bmpPrint3 As Bitmap
Private bmpPrint4 As Bitmap

' 用紙方向を縦向きに設定
PrintDocument1.DefaultPageSettings.Landscape = Not _
PrintDocument1.DefaultPageSettings.Landscape

' 用紙サイズをレターサイズに設定
For Each psz As Printing.PaperSize In _
PrintDocument1.PrinterSettings.PaperSizes
If psz.Kind = Printing.PaperKind.Letter Then
PrintDocument1.DefaultPageSettings.PaperSize = psz
Exit For
End If
Next

' 画像印刷
PrintDocument1.PrintController = _
New Printing.StandardPrintController
PrintDocument1.Print()

Private Sub PrintDocument1_PrintPage( _
ByVal sender As System.Object, ByVal e As _
Printing.PrintPageEventArgs) _
Handles PrintDocument1.PrintPage
e.HasMorePages = True

e.Graphics.PageUnit = GraphicsUnit.Millimeter
Using bmp As New Bitmap(230, 400, e.Graphics)   '230mm×400mmの大きな画像

    Using g As Graphics = Graphics.FromImage(bmp)
        g.PageUnit = GraphicsUnit.Millimeter

        g.DrawImage(bmpPrint1, 0, 0) '1件目のデータから作った画像
        g.DrawImage(bmpPrint2, 0, 100) '2件目のデータから作った画像
        g.DrawImage(bmpPrint3, 0, 200) '3件目のデータから作った画像
        g.DrawImage(bmpPrint4, 0, 300) '4件目のデータから作った画像

    End Using

    e.Graphics.ResetTransform()
    'bmp.Save("C:\Prnt\bmp2\" & BoothID & "_" & SERNO & "_" & setbmpdate & ".jpg")
    '作成した一枚絵を貼り付ける処理
    e.Graphics.DrawImage(bmp, e.MarginBounds.Location)

End Using

e.HasMorePages = False

End Sub

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。