[C#]WebBrowserコントロールを使用して、指定したサイト全体の画像を取得(DLL化しました)

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は、前述のメソッドがひとつだけ存在する、シンプルなクラスです。

関連記事

コメントを残す

メールアドレスが公開されることはありません。