- 題名: WebBrowserコントロールでページ全体をキャプチャしたい
- 日時: 2008/08/24 22:42:10
- ID: 22812
- この記事の返信元:
- (なし)
- この記事への返信:
- [22813] Re[1]: WebBrowserコントロールでページ全体をキャプチャしたい2008/08/24 22:50:39
- ツリーを表示
前に作ろうとしたことがありますので,参考にしてください。
GetBitmapFromWebの第2引数でWebページの大きさを第3引数でBitmapの大きさを
指定しますが,NothingにすればWebページの全体をキャプチャします。
ただ,やはりフレームがあると全体をキャプチャできません。
'WebページをBitmapで取得する
Imports System.Runtime.InteropServices
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Img As Image
Img = GetBitmapFromWeb("http://www.yahoo.co.jp", Nothing, Nothing)
Me.BackgroundImage = Img
End Sub
<DllImport("ole32.dll")> _
Public Shared Function OleDraw( _
ByVal pUnk As IntPtr, _
ByVal dwAspect As DVASPECT, _
ByVal hdcDraw As IntPtr, _
ByRef lprcBounds As Rectangle) _
As Integer
End Function
Public Function GetBitmapFromWeb(ByVal Url As String, ByVal HtmlSize As Size, ByVal BitmapSize As Size) As Image
Dim WebBrowser1 As WebBrowser = Nothing
Dim ImageGraph As Graphics = Nothing
Dim Stopwatch1 As Stopwatch = Nothing
Try
'WebBrowserコントロールの初期化
WebBrowser1 = New WebBrowser
WebBrowser1.Visible = False '非表示にしないと実際に表示されている以上の大きさの画像が取得できない
WebBrowser1.ScriptErrorsSuppressed = True
WebBrowser1.Navigate(Url)
Stopwatch1 = New Stopwatch
Stopwatch1.Start()
Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
If Stopwatch1.ElapsedMilliseconds > 10000 Then Throw New Exception '10秒待ってナビゲートできなければ例外処理
Loop
Stopwatch1.Stop()
WebBrowser1.Document.Body.Style = "overflow-x:hidden;overflow-y:hidden" 'スクロールバーを消す(ScrollBarsEnabled=Falseでは消えない)
If HtmlSize = Nothing Then
Dim Rect As Rectangle = WebBrowser1.Document.Body.ScrollRectangle 'ページの大きさを取得する(不完全な実装)
HtmlSize = New Size(Rect.Width, Rect.Height)
End If
WebBrowser1.Size = HtmlSize
'OleDrawでビットマップを取得
Dim HtmlImage As Bitmap = Nothing
Dim Browser As Object = Nothing
Dim pUnk As IntPtr
Dim HtmlGraph As Graphics = Nothing
Dim hDc As IntPtr
Try
HtmlImage = New Bitmap(HtmlSize.Width, HtmlSize.Height)
Browser = WebBrowser1.ActiveXInstance
pUnk = Marshal.GetIUnknownForObject(Browser)
HtmlGraph = Graphics.FromImage(HtmlImage)
hDc = HtmlGraph.GetHdc
OleDraw(pUnk, DVASPECT.CONTENT, hDc, New Rectangle(0, 0, HtmlImage.Width, HtmlImage.Height))
Catch ex As Exception
Debug.Print(ex.Message)
Finally
If Not hDc.Equals(IntPtr.Zero) Then HtmlGraph.ReleaseHdc(hDc)
If HtmlGraph IsNot Nothing Then HtmlGraph.Dispose()
If Not pUnk.Equals(IntPtr.Zero) Then Marshal.Release(pUnk)
If Browser IsNot Nothing AndAlso Marshal.IsComObject(Browser) Then Marshal.ReleaseComObject(Browser)
End Try
'取得したビットマップを縮小
If BitmapSize = Nothing OrElse BitmapSize.Width < 1 OrElse BitmapSize.Height < 1 Then
BitmapSize = New Size(HtmlSize.Width, HtmlSize.Height)
End If
Dim Image = New Bitmap(BitmapSize.Width, BitmapSize.Height)
ImageGraph = Graphics.FromImage(Image)
ImageGraph.SmoothingMode = Drawing2D.SmoothingMode.HighQuality '高画質に処理
ImageGraph.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality '高画質に処理
ImageGraph.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic '高画質に縮小
ImageGraph.DrawImage(HtmlImage, 0, 0, Image.Width, Image.Height)
Return Image
Catch ex As Exception
Debug.Print(ex.Message)
Return Nothing
Finally
If ImageGraph IsNot Nothing Then ImageGraph.Dispose()
If WebBrowser1 IsNot Nothing Then WebBrowser1.Dispose()
End Try
End Function
End Class
Public Enum DVASPECT
CONTENT = 1
THUMBNAIL = 2
ICON = 4
DOCPRINT = 8
End Enum
VisualBasic2005でwebbrowserに表示させたページ全体をキャプチャしたいのですがどのようにしたらよいのでしょうか?
表示されている部分だけをキャプチャするのはできたのですが、表示されていない部分も含めたキャプチャの方法がわかりません。