none
画像ファイルの印刷について RRS feed

  • 質問

  • いつもお世話になっています。いたと申します。

    現在、プリンタードライバーの評価ツールを開発中で、APIを使用した画像の印刷を行おうとしています。
    (敢えて、PrintDocumetコントロールは使わずにAPIで実現したいと思っています)

    CreateDCで取得したプリンターのhdcに対し、任意の画像ファイル(bmpやICO)を等倍で印刷する際のソースを教えて下さい。

    いろいろ調べ、下記のAPIを使えばできるようなところまでは理解できましたが、実際の作りがわかりません。
    図々しい質問ですが、よろしくお願いします。

    開発環境は、下記のとおりです。
    OS:WindowsXP Professional
    VS:VS2005Professional(VB2005)

    使用API(これで全てかは定かではありません)
    CreateDC
    CreateCompatibleDC
    SelectObject
    BitBlt
    DeleteDC
    Escape

    2007年4月24日 0:35

回答

  • とっちゃんさん

    いろいろアドバイスありがとうございます。

    Abstractさんの方法で一応解決しました。

     

    > いずれにしても、今のご時世、英語は厭と拒絶してる限り、詳しい情報は手に入らないと思ってください。

    > それほど、日本語の詳しい資料は少なくなっていますので。

     

    その通りだと痛切に感じ、英語の情報の解読を少しずつでも努力したいと思います。懇切丁寧ないろいろは情報をありがとうございました。

    2007年4月26日 0:41

すべての返信

  • PlatformSDK のサンプルにある ViewDIB(WindowsSDKにはありませんでした)が、API をつかって、bmpファイルを出力する(印刷も行う)ものになっています。

    これよりやさしいビットマップ出力のサンプルもネットを探せばあると思いますけど、ちょっとわかりません。

     

     

    いずれにしても、評価ツールがドライバの何を評価するのかがわからないと、そもそも API を使った方がいいかどうかもわからないし、使うとしてもどういう使い方をすればいいかもわからないのですけどね。

     

    VBから操作できなければ意味がないと言うのであれば、その旨を評価したいドライバの提供元に相談してみることをおお奨めします。

    状況的に考えて、ここで具体的に聞ける案件ではなく NDA に引っ掛かる部分が少なからず含まれているように思いますので。

    2007年4月24日 6:52
  • 回答ありがとうございます。

     

    PlatformSDKのサンプルの在処を教えていただけないでしょうか?すみません初歩的な返しで。

     

    評価ツールとは、CreateDCで取得したhdcを使ってAPI経由で画像ファイルを印刷して、印刷結果を確認する程度のもので、NDA云々の

    話にはならないと思います。

     

    単純に、API経由で画像ファイルを印刷できるVB.NETソースを求めているだけです。

     

    よろしくお願いします。

     

    2007年4月24日 8:55
  • とりあえず情報共有 http://vsug.jp/tabid/63/forumid/44/postid/9676/view/topic/Default.aspx

    さて、PlatfromSDK ですが...MSDN サブスクリプションに加入しているのであれば、すべて表示でSDKとかなんとか書かれているところの中にあります。

    MSDN サブスクリプションに加入していない場合は、

    http://www.microsoft.com/downloads/details.aspx?FamilyID=484269e2-3b89-47e3-8eb7-1f2be6d7123a&DisplayLang=en

    でダウンロードできます。

    私が持ってるやつよりひとつ新しいのでもしかしたら入っていないかもしれませんが。

    その場合は、

    http://www.microsoft.com/downloads/details.aspx?familyid=EBA0128F-A770-45F1-86F3-7AB010B398A3&displaylang=en

    で落とせます。

    ISO イメージの方がいいという場合は、それぞれのページの下のほうにリンクがあるので、そちらをたどってください。

    これを、インストールすれば(全部)、中にサンプルが入っています。

     

    猫と違って、説明文など一切ありませんので、それ相応の覚悟は必要になりますけどねw

    #情報も全部英語だし...

    2007年4月24日 9:34
  • とっちゃんさん

    情報共有ありがとうございます。

    platformSDKをインストールしてみましたが、英語がチンプンカンプンな私には到底ついて行けず、挫折しました。すみません。

     

    日本語情報を根気よく調べてみると、pictureboxの画像をプリンターのhdcにコピーすれば良いということまでわかり、それにはbitbltというAPIでできることがわかりました。(違うのかな?)

     

    早速下記のソースで試した処、画像が印刷されましたが、

    1.印刷画像がいやに小さい

    2.画像ファイルの情報だけでなく、何故かピクチャーボックスの周りの現在のデスクトップの画像も印刷されてしまう。

    という不具合が発生しています。

    下記のソースに不備があるとは思いますが、どなたか指摘して下さい。

     

    hdc=プリンターのhdc

    lResult = StartDoc(hdc, di)

    lResult = StartPage(hdc)

    Dim srcPic As Graphics = Picture1.CreateGraphics

    Dim HDC1 As IntPtr = srcPic.GetHdc

    BitBlt(hdc, 0, 0, Picture1.Image.Width, Picture1.Image.Height, HDC1, 0, 0, 13369376)

    lResult = EndPage(hdc)

    lResult = EndDoc(hdc)

     

    よろしくお願いします。

    2007年4月25日 6:21
  • 自己レスです。

    上記2.のピクチャーボックスの周りの現在のデスクトップの画像も印刷されてしまう現象は、ピクチャーボックスのサイズが画像ファイルよりも小さい場合に、実際に表示しきれていない範囲をデスクトップの画面も含めて印刷されているようです。

     

    原因はわかっていません。よろしくお願いします。

    2007年4月25日 6:57
  • よくわかりませんが、BitBlt でなくて、

    DrawImage を使うというのはどうでしょう?

    2007年4月25日 7:09
  • Abstractさん

    回答ありがとうございます。

    当方は、APIで取得したプリンターのhdcに対して、APIを使い画像ファイルの画像情報を印刷させたいと考えています。

    このDrawImageでもできるのでしょうか?

    (これって、.Net frameworkの機能でprintDocumentコントロールで使うものだと認識していますが?自信はありませんが)

     

    こちらでも調べてみますが、できれば、ソースを提供していただけないでしょうか?

    よろしくお願いします。

     

    2007年4月25日 7:33
  • こんなかんじ。

    Dim g As Graphics = Graphics.FromHdc(hdc)

    g.DrawImage(Picture1.Image, 0, 0)

    g.Dispose()

     

     

    2007年4月25日 7:57
  • 追加。下記コードにて、

    縦横 512 ピクセルのビットマップが、約 13.6cm で出力されました。

    Dim di As DOCINFO
    di.cbSize = 20
    di.lpszDocName = "PrintTest"
    di.lpszOutput = Nothing
    di.lpszDatatype = Nothing
    di.fwType = 0

    Dim hDC As Integer = CreateDC("WINSPOOL", printerName, Nothing, Nothing)
    StartDoc(hDC, di)
    StartPage(hDC)
    Dim bmp As New Bitmap(filePath)
    Dim g As Graphics = Graphics.FromHdc(New IntPtr(hDC))
    g.DrawImage(bmp, 0, 0)
    g.Dispose()
    bmp.Dispose()
    EndPage(hDC)
    EndDoc(hDC)
    DeleteDC(hDC)

    *注 実際の運用には少し問題があります。

    2007年4月25日 8:58
  •  

     いた さんからの引用

    platformSDKをインストールしてみましたが、英語がチンプンカンプンな私には到底ついて行けず、挫折しました。

    インストールは出来たんですよね?どこで挫折したんでしょうか?

    それがわかりませんと、手を差し伸べることもできないのですが?

     

    Abstract さんが、.NET 側での段取りを細かく書いてくれていますので、出力まではたどり着けているでしょうけど...

     

     

     いた さんからの引用

    1.印刷画像がいやに小さい

    ですが、解像度の違いに起因する問題です。画面の解像度(ピクセル)は、モニタにもよりますが、大抵は 0.1mm~0.3mm程度の大きさです(ぎりぎり肉眼でも識別できるサイズ)。

    それに対して、プリンタは、もっと小さなサイズ(0.03mm程度以下)になります(肉眼で識別するのはかなり困難を伴うサイズ)。

    それだけの違いがありますので、おおきさも、画面に比べれば、1/10以下になるとおもいます。それこそ、アイコンなら、ゴマ粒程度もないでしょう。

     

     

     

    解像度を変換する仕組みを、マッピングモードと呼ぶのですが、ご存知でしょうか?

    詳しい解説を始めると、それこそ専門書一章分のボリュームになってしまいますので、割愛しますが、もし近くにいる方が、Programming Windows 第5版の下巻をお持ちであれば、一度読ませていただくとよいと思います。

    ここに、ビットマップの話とともに、マッピングモードの話が出ています。わたしが読んだことのある書籍で唯一と言ってもよい資料です。

    持っている人がいないとなると、入手は困難と思います。その場合、英語の文献を当たることになると思います。APIの説明の日本語情報は少しずつ減っていますし、概要などの部分は、NT 3.5 の時代にまで遡らないと資料がありません。

    この時代のものとなると、当時から、Windows の開発を行っていて、なおかつ、後生大事に抱えているようなごく一部の人以外はもっていないと思われます。

    いずれにしても、今のご時世、英語は厭と拒絶してる限り、詳しい情報は手に入らないと思ってください。それほど、日本語の詳しい資料は少なくなっていますので。

    2007年4月25日 14:23
  • Abstractさん

    丁寧なソースの提示ありがとうございました。

    私が求めていたものは、これです。これで解決しました。

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

    2007年4月26日 0:33
  • とっちゃんさん

    いろいろアドバイスありがとうございます。

    Abstractさんの方法で一応解決しました。

     

    > いずれにしても、今のご時世、英語は厭と拒絶してる限り、詳しい情報は手に入らないと思ってください。

    > それほど、日本語の詳しい資料は少なくなっていますので。

     

    その通りだと痛切に感じ、英語の情報の解読を少しずつでも努力したいと思います。懇切丁寧ないろいろは情報をありがとうございました。

    2007年4月26日 0:41