WebBrowserコントロールを使用して、プログラムから指定したサイト全体の画像を取得します。
サンプルコードは、以下の通り。
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Runtime.InteropServices.ComTypes; namespace SiteCaptureSharp { //************************************************************************* /// <summary> Webサイトの画像イメージキャプチャ処理を管理します /// </summary> //************************************************************************* public class CaptureManager { [DllImport("ole32.dll")] private static extern int OleDraw( IntPtr pUnk, int dwAspect, IntPtr hdcDraw, ref Rectangle lprcBounds ); //********************************************************************* /// <summary> 指定されたWebサイトをbitmap画像として取得する /// </summary> /// <param name="url">キャプチャ対象のサイトURL</param> /// <returns> ページの画像</returns> //********************************************************************* public static Bitmap getBitmapFromUrl(string url ) { bool isCaptured = false; Bitmap bitmap = null; //------------------------------------------------ // Webサイト情報取得用のブラウザコントロールを作成 //------------------------------------------------ WebBrowser browser = new WebBrowser(); browser.ScrollBarsEnabled = false; browser.ScriptErrorsSuppressed = true; //--------------------------------------------- // 指定URLへNavigate()完了時のハンドラを登録 //--------------------------------------------- browser.DocumentCompleted += (sender, e) => { if ( e.Url.Equals( "about:blank" ) ) { return; } try { // キャプチャサイズを指定 browser.Width = browser.Document.Body.ScrollRectangle.Width; browser.Height = browser.Document.Body.ScrollRectangle.Height; // キャプチャの保存先bitmapを生成 bitmap = new Bitmap( browser.Width, browser.Height ); // 生成したbitmapにWebページの画像を保存 Graphics graphic = null; IntPtr ptrObj = IntPtr.Zero; IntPtr ptrHdc = IntPtr.Zero; try { graphic = Graphics.FromImage( bitmap ); ptrHdc = graphic.GetHdc(); ptrObj = Marshal.GetIUnknownForObject( browser.ActiveXInstance ); Rectangle rect = new Rectangle(0, 0, browser.Width, browser.Height ); // ptrObj画像内のrectで指定した領域を,HDCのエリアに貼付 OleDraw( ptrObj, (int)DVASPECT.DVASPECT_CONTENT, ptrHdc, ref rect ); } finally { if ( ptrObj != IntPtr.Zero ) { Marshal.Release( ptrObj ); } if ( ptrHdc != IntPtr.Zero ) { graphic.ReleaseHdc( ptrHdc ); } if ( graphic != null ) { graphic.Dispose(); } } } finally { isCaptured = true; } }; //------------------------------------------------ // 指定されたページへ遷移 //------------------------------------------------ browser.Navigate( url ); while( !isCaptured ) { // 指定URLのロード&キャプチャが完了するのを待つ Application.DoEvents(); System.Threading.Thread.Sleep( 20 ); } // 取得したbmp情報を返す return bitmap; } } } |
通常、WinFormで指定したコントロールの画像が欲しい場合は、Control.DrawToBitmap()で取得可能なのですが、WebBrowserコントロールは、ページによってはこのメソッドで画像が取れない場合がある為、Win32APIのOleDraw()を使用しています。
また、呼び元側は以下のような感じです。
シンプルに、1行でbitmapオブジェクトが取得できます。
Bitmap bitmap = SiteCaptureSharp.CaptureManager.getBitmapFromUrl( "http://www.yahoo.co.jp/" ); if ( bitmap != null ) { bitmap.Save( "c:\\test.bmp" ); } |
DLL版も作ったので、DLLだけ欲しい場合はこちらのページからダウンロードしてください。
CaptureManagerは、前述のメソッドがひとつだけ存在する、シンプルなクラスです。
関連記事
コメントを残す