DOBON.NET DOBON.NETプログラミング掲示板過去ログ

画面のキャプチャを分割して結合する

  • 題名: 画面のキャプチャを分割して結合する
  • 著者: ねこピンチ
  • 日時: 2013/01/20 18:20:47
  • ID: 31243
  • この記事の返信元:
    • (なし)
  • この記事への返信:
    • (なし)
  • ツリーを表示
環境/言語:[OS : Windows 7 / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

【解決したい問題】

ウェブブラウザ(IE)に表示された画面をキャプチャしようと
考えています。キャプチャ方法を調べてみると、画面を非表示に
して、ブラウザの画面=表示する画面に設定して、一度でキャプ
チャする方法はありましたが、ブラウザ画面は固定で、分割して
キャプチャし、それを結合した画像を作成したいと思っています。

その画像を利用して、用意した小さな画像と一致している場所を
調べて、そのブラウザをスクロールなどさせて、合致している場
所にポイントしたいというのが理由です。

そこで、分割してキャプチャし、結合しようとしているのですが、
うまく結合できません。

何か根本的な間違いを犯しているのでしょうか。

【解決するために何をしたか】

ロジックを分解し、座標などを全部定数で直接指定してデバッグ
してみましたが、原因がわかりません。
テストした時の状況は以下の通りです。
 
ブラウザの大きさ=610x375
展開されたサイト自体の画像の大きさ=950x375

以下がそのソースです。

Dim bmp2 As New Bitmap( _
WebBrowser1.Document.Body.ScrollRectangle.Width, _
WebBrowser1.Document.Body.ScrollRectangle.Height)

Dim bmp As New Bitmap(610, 375)
Dim gra As Graphics = Graphics.FromImage(bmp)
Dim hdc As IntPtr = gra.GetHdc

Dim web As IntPtr = _
System.Runtime.InteropServices.Marshal.GetIUnknownForObject(WebBrowser1.ActiveXInstance)

Dim rect As Rectangle = New Rectangle(0, 0, 610, 375)

OleDraw(web, DVASPECT_CONTENT, hdc, rect)
System.Runtime.InteropServices.Marshal.Release(web)
gra.Dispose()

Dim srcRect As New Rectangle(0, 0, 610, 375)
Dim desRect As New Rectangle(0, 0, 610, 375)

Dim gra2 As Graphics = Graphics.FromImage(bmp2)
gra2.DrawImage(bmp, srcRect, desRect, GraphicsUnit.Pixel)
gra2.Dispose()

PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox1.Image = bmp

WebBrowser1.Document.Window.ScrollTo(610, 0)

Dim bmp_x = New Bitmap(340, 375)
Dim gra_x As Graphics = Graphics.FromImage(bmp_x)

Dim hdc_x As IntPtr = gra_x.GetHdc
Dim web_x As IntPtr = _
System.Runtime.InteropServices.Marshal.GetIUnknownForObject(WebBrowser1.ActiveXInstance)
Dim rect_x As Rectangle = New Rectangle(0, 0, 340, 375)

OleDraw(web_x, DVASPECT_CONTENT, hdc_x, rect_x)
System.Runtime.InteropServices.Marshal.Release(web_x)
gra_x.Dispose()

PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox2.Image = bmp_x
Dim srcRect_x As New Rectangle((0, 0, 340, 375)
Dim desRect_x As New Rectangle(270, 0, 610, 375)

Dim gra3 As Graphics = Graphics.FromImage(bmp2)
gra3.DrawImage(bmp_x, srcRect_x, desRect_x, GraphicsUnit.Pixel)
gra3.Dispose()

PictureBox3.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox3.Image = bmp2

【追加事項】
bmpでキャプチャした画像の横にbmp_xの右側を切り取ってbmp2に結合している
つもりですが、そうならず、bmp_xの一部がbmp2の最初のほうに表示されてしま
います。

初めてグラフィック関連のクラスを利用したので、rectangle辺りの
理解が正しくないのかもしれません。
何卒、よろしくお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板