- PR -

printdocumentからimageを作る方法

投稿者投稿内容
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-19 19:33
引用:

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

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



半日くらい格闘してみました。
が、C#は初めてなので大苦戦中ですorz

動き的にはtodoさんの紹介してくださったソースがドンピシャなので、C#覚えるところからはじめてます。(なんとなくはわかるのですけれどねぇ・・)
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-19 21:16
自己レスです。

引用:

『SRCCOPY』がはまりそうなのですけれど、要求されるのはinteger。どぼんさんのところのものを参考にすると『13369376』になっています。



http://www.codeproject.com/vb/net/Bitblt_wrapper_class.asp
を見ていたら
引用:

a quick side note: The 'SRCCOPY' is one of the many raster operations BitBlt can do for us, this (the most commonly used) operation copies an exact copy of the bitmap, i have declared SRCCOPY as a Const, this is the value-

Dim SRCCOPY as Integer = &HCC0020 ' Hex
or
Dim SRCCOPY as Integer = 13369376 ' Dec

We can also use BitBlt to create masks, transparency and some more cool stuff (FYI)



だそうです。他所を見ても『&HCC0020』となっている物もあるので、これでためしてみました。
さらに

引用:

で、とりあえずそれで動かしてみた所、『無効であるか、現在サポートされていない形式です』と言われてしまうbitmapが出力されました。



TargetBitMap.Save("\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
のようにFormatを指定したらバッチリでした。

でも、出来上がってきたのは大きさの正しい真っ黒なbitmap....orz
うーん。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 22:28
引用:

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

でも、出来上がってきたのは大きさの正しい真っ黒なbitmap....orz


e.Graphic.Clear(System.Drawing.Color.White)
した後だとどうなりますか?

その後に、DrawString してみたりなどして、少し試してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-19 22:47
引用:

じゃんぬねっとさんの書き込み (2006-01-19 22:28) より:
e.Graphic.Clear(System.Drawing.Color.White)
した後だとどうなりますか?

その後に、DrawString してみたりなどして、少し試してみてください。



きちんと真っ白になりました。
drawstringしてみても、ちゃんと文字が出力されます。

・・・・じゃあプリントされるはずの物はどこ行ったんだろう?

printdocumentの呼び出し元から
PrintPreviewControl1.Document = PrintDocument1
//→printpreviewcontrolです

で確認していたのですけれど、真っ黒が出力されている時は
previewcontrolにはちゃんと出力されて欲しい物が表示されていました。
で、今回塗りつぶしたり、字を書いたりしてみるとbitmapと同じ物が表示されています。
e(System.Drawing.Printing.PrintPageEventArgs)
を上書しちゃったのでそうなったと思うのですけれど、じゃあ今までは何で真っ黒だったんだろう・・・

もしかしてgraphicが出力される前にファイルに保存しちゃっているとかいう事なんでしょうか?

で、さらにプレビューをスクロールさせてみると、出力されて欲しい物がチラチラと見えていたりします。

うーん。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-20 00:20
Graphicsの単位(Unit)をそろえる必要があるかも。
e.Graphicsのほうが大きくて左上のほうだけが転送されているんじゃないでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-20 01:12
引用:

まどかさんの書き込み (2006-01-20 00:20) より:

Graphicsの単位(Unit)をそろえる必要があるかも。
e.Graphicsのほうが大きくて左上のほうだけが転送されているんじゃないでしょうか。


それで思い出したのですが、Image の PixelFormat は合わせる必要はないんでしょうか?
どうやって、NSSPRNXA.DLL が Draw しているかわかんないですけど...

# 色の指定が文字列なのが、ちょっと笑えました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
はま
会議室デビュー日: 2006/01/18
投稿数: 14
投稿日時: 2006-01-20 09:33
引用:

まどかさんの書き込み (2006-01-20 00:20) より:

Graphicsの単位(Unit)をそろえる必要があるかも。
e.Graphicsのほうが大きくて左上のほうだけが転送されているんじゃないでしょうか。



引用:

じゃんぬねっとさんの書き込み (2006-01-20 01:12) より:
それで思い出したのですが、Image の PixelFormat は合わせる必要はないんでしょうか?
どうやって、NSSPRNXA.DLL が Draw しているかわかんないですけど...



:現状

Dim rect As Rectangle = e.PageBounds
Dim TargetBitMap As New Bitmap(rect.Width, rect.Height)
//もしくはこうとか
//Dim TargetBitMap As New Bitmap(rect.Width, rect.Height, e.Graphics)
BitBlt(TargetDCPtr, 0, 0, rect.Width, rect.Height, _
SourceDCPtr, 0, 0, &HCC0020)

こんな感じで幅と高さだけは併せたつもりだったんですけれど、単位はちょっと考えて無かったです。今からちょっと調べてみます。

ただ、現状出て来る真っ黒のbitmapの大きさだけは、printpreviewの倍率1倍で描画した物を出力した時と同じ(printpreviewからだとグレーの外枠を省いた大きさ)で出力されています。空bitmapを定義する所までは良くって、その後の書き込みでコケていると言う事は、BitBltのところを調べる訳ですよね。(vb6の資料が多いのに.netになるとほとんどないorz)
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-20 14:30
印刷が正常に動作しているPrintPageイベントで試しましたが
真っ黒になりました(; ;/

GetWindowDC APIで取得したDCからビットマップを作成するという方法でウィンドウキャプチャしてるんですが
Graphics.GetHdcだと何か違いがあるのか。。。

実のところGDIには疎いので、こもってごにょごにょしてみます。

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