トップ回答者
画像ファイルの印刷について

質問
-
いつもお世話になっています。いたと申します。
現在、プリンタードライバーの評価ツールを開発中で、APIを使用した画像の印刷を行おうとしています。
(敢えて、PrintDocumetコントロールは使わずにAPIで実現したいと思っています)
CreateDCで取得したプリンターのhdcに対し、任意の画像ファイル(bmpやICO)を等倍で印刷する際のソースを教えて下さい。
いろいろ調べ、下記のAPIを使えばできるようなところまでは理解できましたが、実際の作りがわかりません。
図々しい質問ですが、よろしくお願いします。
開発環境は、下記のとおりです。
OS:WindowsXP Professional
VS:VS2005Professional(VB2005)
使用API(これで全てかは定かではありません)
CreateDC
CreateCompatibleDC
SelectObject
BitBlt
DeleteDC
Escape
回答
すべての返信
-
PlatformSDK のサンプルにある ViewDIB(WindowsSDKにはありませんでした)が、API をつかって、bmpファイルを出力する(印刷も行う)ものになっています。
これよりやさしいビットマップ出力のサンプルもネットを探せばあると思いますけど、ちょっとわかりません。
いずれにしても、評価ツールがドライバの何を評価するのかがわからないと、そもそも API を使った方がいいかどうかもわからないし、使うとしてもどういう使い方をすればいいかもわからないのですけどね。
VBから操作できなければ意味がないと言うのであれば、その旨を評価したいドライバの提供元に相談してみることをおお奨めします。
状況的に考えて、ここで具体的に聞ける案件ではなく NDA に引っ掛かる部分が少なからず含まれているように思いますので。
-
とりあえず情報共有 http://vsug.jp/tabid/63/forumid/44/postid/9676/view/topic/Default.aspx
さて、PlatfromSDK ですが...MSDN サブスクリプションに加入しているのであれば、すべて表示でSDKとかなんとか書かれているところの中にあります。
MSDN サブスクリプションに加入していない場合は、
でダウンロードできます。
私が持ってるやつよりひとつ新しいのでもしかしたら入っていないかもしれませんが。
その場合は、
で落とせます。
ISO イメージの方がいいという場合は、それぞれのページの下のほうにリンクがあるので、そちらをたどってください。
これを、インストールすれば(全部)、中にサンプルが入っています。
猫と違って、説明文など一切ありませんので、それ相応の覚悟は必要になりますけどねw
#情報も全部英語だし...
-
とっちゃんさん
情報共有ありがとうございます。
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)
よろしくお願いします。
-
追加。下記コードにて、
縦横 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)*注 実際の運用には少し問題があります。
-
いた さんからの引用 platformSDKをインストールしてみましたが、英語がチンプンカンプンな私には到底ついて行けず、挫折しました。
インストールは出来たんですよね?どこで挫折したんでしょうか?
それがわかりませんと、手を差し伸べることもできないのですが?
Abstract さんが、.NET 側での段取りを細かく書いてくれていますので、出力まではたどり着けているでしょうけど...
いた さんからの引用 1.印刷画像がいやに小さい
ですが、解像度の違いに起因する問題です。画面の解像度(ピクセル)は、モニタにもよりますが、大抵は 0.1mm~0.3mm程度の大きさです(ぎりぎり肉眼でも識別できるサイズ)。
それに対して、プリンタは、もっと小さなサイズ(0.03mm程度以下)になります(肉眼で識別するのはかなり困難を伴うサイズ)。
それだけの違いがありますので、おおきさも、画面に比べれば、1/10以下になるとおもいます。それこそ、アイコンなら、ゴマ粒程度もないでしょう。
解像度を変換する仕組みを、マッピングモードと呼ぶのですが、ご存知でしょうか?
詳しい解説を始めると、それこそ専門書一章分のボリュームになってしまいますので、割愛しますが、もし近くにいる方が、Programming Windows 第5版の下巻をお持ちであれば、一度読ませていただくとよいと思います。
ここに、ビットマップの話とともに、マッピングモードの話が出ています。わたしが読んだことのある書籍で唯一と言ってもよい資料です。
持っている人がいないとなると、入手は困難と思います。その場合、英語の文献を当たることになると思います。APIの説明の日本語情報は少しずつ減っていますし、概要などの部分は、NT 3.5 の時代にまで遡らないと資料がありません。
この時代のものとなると、当時から、Windows の開発を行っていて、なおかつ、後生大事に抱えているようなごく一部の人以外はもっていないと思われます。
いずれにしても、今のご時世、英語は厭と拒絶してる限り、詳しい情報は手に入らないと思ってください。それほど、日本語の詳しい資料は少なくなっていますので。