NonSoft

WEBページをビットマップ保存するサンプル(C#.NET)


 サンプル(ソース/コード)
WEBページだけ(ウィンドウ枠を除く)を印刷する時などにWEBページ全体のビットマップが必要になります。
このサンプルはWEBページ全体(スクロールバー無し)をビットマップ保存するサンプル(C#.NET)です。

IE等でWEBページのイメージ印刷をすると途中で切れてしまう事がありますが、
ビットマップに保存してペイントツールで加工すれば綺麗に印刷する事が可能です。

関連ツールはこちらです。
WEBキャプチャ保存ツール(NonWebCapture)

VB.NETのWEBページ・ビットマップ保存のサンプルはこちらです。
WEBページをビットマップ保存するサンプル(VB.NET)

その他のサンプル(WEB関係/ビットマップ関係等)はこちらです。
サンプルソース(コード)

★フォーム(Form1.cs)
public partial class Form1 : Form
{
    // ole32.dllのOleDrawを使用する(Const定義)
    const int DVASPECT_CONTENT  = 1;

    // ole32.dllのOleDrawを使用する(DllImport定義)
    [System.Runtime.InteropServices.DllImport("ole32.dll")]
    extern static int OleDraw(
        IntPtr pUnk,
        int dwAspect,
        IntPtr hdcDraw,
        ref Rectangle lprcBounds);

    // フォームロード
    // (準備)WebBrowserをフォームに貼り付けています
    // (準備)PictureBoxをフォームに貼り付けています
    // (準備)Buttonをフォームに貼り付けています
    private void Form1_Load(object sender, EventArgs e)
    {
        // WebBrowserを非表示にする
        this.webBrowser1.Visible = false;

        // WebBrowserのサイズを自由に変更出来るようにする
        this.webBrowser1.Dock = DockStyle.None;

        // WebBrowserのスクロールバーを無効にする
        this.webBrowser1.ScrollBarsEnabled = false;

        // WEBページのURLを指定
        this.webBrowser1.Navigate("http://www.yahoo.co.jp");
    }

    // ボタンクリック時の処理
    // WEBページをJPEG形式で保存
    private void button1_Click(object sender, EventArgs e)
    {
        // WebBrowser(WEBページ)のダウンロード完了まで待つ
        for (int i = 1; i <= 100; i++)
        {
            if (webBrowser1.IsBusy == false) break;
            System.Threading.Thread.Sleep(1000);
            System.Windows.Forms.Application.DoEvents();
        }

        // WebBrowserにWEBページを全体表示(スクロールバー無し)するため、
        // WebBrowserのウィンドウサイズ(横)をWEBページの本文サイズにあわせる
        webBrowser1.Width = webBrowser1.Document.Body.ScrollRectangle.Width;

        // WebBrowserにWEBページを全体表示(スクロールバー無し)するため、
        // WebBrowserのウィンドウサイズ(縦)をWEBページの本文サイズにあわせる
        webBrowser1.Height = webBrowser1.Document.Body.ScrollRectangle.Height;

        // WebBrowserのサイズ(WEBページのサイズ)に合わせてBitmap生成
        Bitmap bmp = new Bitmap(webBrowser1.Width, webBrowser1.Height);

        // BitmapのGraphicsを取得
        Graphics gra = Graphics.FromImage(bmp);

        // BitmapのGraphicsのHdcを取得
        IntPtr hdc = gra.GetHdc();

        // WebBrowser(WEBページ)のオブジェクト取得
        IntPtr web =
            System.Runtime.InteropServices.Marshal.GetIUnknownForObject(
            webBrowser1.ActiveXInstance);

        // WebBrowser(WEBページ)のイメージをBitmapにコピー
        Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
        OleDraw(web, DVASPECT_CONTENT, hdc, ref rect);

        // WebBrowser(WEBページ)のオブジェクト使用終了
        System.Runtime.InteropServices.Marshal.Release(web);

        // BitmapのGraphicsの使用終了
        gra.Dispose();

        // BitmapをJPEG形式で保存
        bmp.Save(DateTime.Now.ToString("yyyyMMddHHmmss") + "_WebPage.jpg",
            System.Drawing.Imaging.ImageFormat.Jpeg);

        // BitmapをPictureBoxに表示
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox1.Image = bmp;
    }
}