- PR -

printdocumentからimageを作る方法

投稿者投稿内容
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-18 22:06
遅くなってしまいました。

引用:

じゃんぬねっとさんの書き込み (2006-01-18 16:40) より:

PrintPage イベントで何かをセットしないと、何も入ってこないので、
「そんなわけで、印刷自体の実装を見る必要があります」と書いたんですが、
要するに、NSSPRNXA.DLL というものは (On)PrintPage をオーバーライドしていることになりますね。

Base を呼び出した後ならば、どうとでもなりそうですね。
普通に Graphics オブジェクトから Image に Draw すれば保存できるかもしれません。




当たりです。
PrintPageをオーバーライドしています。

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

の中でNSSPRNXAを使って印刷データを作ってます。
で、ここの末尾に

Dim rect As Rectangle = e.PageBounds
Dim bmp As New Bitmap(rect.Width, rect.Height)
e.Graphics.DrawImage(bmp, 0, 0)
'画像を保存する
bmp.Save("\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp)

を入れてみました。
で、『e』はサイズなどは全部正しく持っているようなのですけれど、出力は真っ黒でした。

これはgraphicsからbitmapの作り方が悪いのでしょうか?
自分でやっておいてなんですが、
e.Graphics.DrawImage(bmp, 0, 0)
は間違ってる気がして仕方ないです。

画像の周りに関してもうちょっとちゃんと勉強した方がいいですね。私orz
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 16:38
引用:

はまさんの書き込み (2006-01-18 22:06) より:

自分でやっておいてなんですが、
 e.Graphics.DrawImage(bmp, 0, 0)
は間違ってる気がして仕方ないです。


お察しどおり間違ってます。(^^;)
これは、e.Graphics に対して描画しています。

System.Drawing.Bitmap のコンストラクタのオーバーロードで、
Graphics が指定できるものをチョイスすることになるでしょう。

それでもできないかもしれません。(自信なし)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-19 17:14
引用:

System.Drawing.Bitmap のコンストラクタのオーバーロードで、
Graphics が指定できるものをチョイスすることになるでしょう。


自前のハードコピーのロジックを眺めていましたが、
e.Graphicsから、出力ビットマップからGraphics.FromImageで取得したGraphicsオブジェクトへ
DC系APIおよびBitBlt APIで転送するとできるような。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-19 17:47
こんなかんじでいいかしら。

コード:
Dim SourceDCPtr As IntPtr
Dim SourceDC As Integer
Dim TargetBitMap As New BitMap(...)
Dim TargetGraphics As Graphics
Dim TargetDCPtr As IntPtr
Dim TargetDC As Integer

SourceDCPtr = e.Graphics.GetHdc
SourceDC = SourceDCPtr.ToInt32

TargetGraphics = Graphics.FromImage(TargetBitmap)
TargetDCPtr = TargetGraphics.GetHdc
TargetDC = TargetDCPtr.ToInt32

'API
BitBlt(TargetDC, 0, 0, intWidth, intHeight, _
       SourceDC, 0, 0, SRCCOPY)

TargetGraphics.ReleaseHdc(TargetDCPtr)
e.Graphics.ReleaseHdc(SourceDCPtr)

TargetBitMap.Save(...)


#ReleaseDCは必要か?。。。
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-19 18:12
引用:

じゃんぬねっとさんの書き込み (2006-01-19 16:38) より:

お察しどおり間違ってます。(^^
これは、e.Graphics に対して描画しています。



ですよね。やっぱり。

引用:

System.Drawing.Bitmap のコンストラクタのオーバーロードで、
Graphics が指定できるものをチョイスすることになるでしょう。

それでもできないかもしれません。(自信なし)



System.Drawing.Bitmap
にはgraphicsを突っ込める物って無いようなんです。うーん。

そもそも私、graphicsとimageの関係が良くわかってないです。
その辺調べなきゃ・・
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-19 18:17
引用:

そもそも私、graphicsとimageの関係が良くわかってないです。
その辺調べなきゃ・・


ここが参考になるかも。
「どぼんさん」
http://dobon.net/
のTips「PictureBoxのImageプロパティに関するよくある勘違い」
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 18:29
引用:

はまさんの書き込み (2006-01-19 18:12) より:

System.Drawing.Bitmap にはgraphicsを突っ込める物って無いようなんです。


Graphics は指定できても、解像度しか取得してなさ気ですね。(^-^;)
(あのオーバーロード、すっごく紛らわしい...)

PrintController が現実的なようですが、試されました?
ちょっと、私も時間が空いたら試してみようかな。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-19 19:27
>まどかさん
返信ありがとうございます。

引用:

ここが参考になるかも。
「どぼんさん」
http://dobon.net/
のTips「PictureBoxのImageプロパティに関するよくある勘違い」



どぼんさんのところ見てみました。

PictureBoxのGraphicsオブジェクトを使ってPictureBoxに描画し、そのイメージをPictureBoxのImageプロパティで取得しようとすると、エラーが出る(もしくはうまく行かない)。

を地で行っていたんですよね。私。
image→graphics『drawimage』
graphics→image『???』
だった訳です。
これの???の部分がBitBltってことなんでしょうか?

で、早速試してみました。
BitBltの宣言は
どぼんさん
http://dobon.net/vb/dotnet/vb6/printform.html

を参考にしてみました。
で、BitBltのパラメータの『dwRop』でつまづいてしまいました。

microsoft
http://www.microsoft.com/JAPAN/developer/library/jpgdipf/_win32_BitBlt.htm

を見る限りではご提供いただいたソースの『SRCCOPY』がはまりそうなのですけれど、要求されるのはinteger。どぼんさんのところのものを参考にすると『13369376』になっています。
で、とりあえずそれで動かしてみた所、『無効であるか、現在サポートされていない形式です』と言われてしまうbitmapが出力されました。

うーん、BitBltについてもうちょっとちゃんと調べてみます。

スキルアップ/キャリアアップ(JOB@IT)