Chủ nhật, ngày 4 tháng 12 năm 2016

C# – Chụp ảnh toàn bộ trang Web (Webpage capture)

Ngày đăng: 20/3/2012, 8:44:14AM | Lượt xem: 2,121
Hot!

Sử dụng một WebBrowser control để nạp trang web, bạn có thể chụp được ảnh màn hình dựa vào kích thước của tài liệu trong WebBrowser thông qua phương thức Graphics.CopyFromScreen(). Tuy nhiên, WebBrowser đã hỗ trợ sẵn phương thức DrawToBitmap() giúp bạn làm việc này. (Từ Câu hỏi của bạn Án Bình Trọng)

Sử dụng một WebBrowser control để nạp trang web, bạn có thể chụp được ảnh màn hình dựa vào kích thước của tài liệu trong WebBrowser thông qua phương thức Graphics.CopyFromScreen(). Tuy nhiên, WebBrowser đã hỗ trợ sẵn phương thức DrawToBitmap() giúp bạn làm việc này.
(Từ Câu hỏi của bạn Án Bình Trọng)

 

Download demo+sourcecode (16KB)

Screenshot:

Phương pháp chụp hình trang web này dựa vào việc tạo một WebBrowser và phóng to cửa sổ để hiển thị toàn bộ trang web. Sau đó ta sẽ dùng phương thức DrawToBitmap() để lưu ảnh vào một Bitmap.

Để đảm bảo việc chụp ảnh trang web chỉ diễn ra một lần, ta cần làm công việc này trong sự kiện WebBrowser.DocumentCompleted, và sử dụng thêm property WebBrowser.ReadyState để kiểm tra việc nạp xong trang web.

Chụp ảnh

Phương thức CaptureWebPage() sau cung cấp thêm việc hiển thị tiến trình làm việc của WebBrowser thông qua một progressBar1:

void CaptureWebPage(string url)
{
    Cursor.Current=Cursors.WaitCursor;
    progressBar1.Show();
    if (_browser == null) {
        _browser = new WebBrowser();
        _browser.ProgressChanged += (sender,e) =>
        {
             progressBar1.Value = (int)(((double)e.CurrentProgress / e.MaximumProgress)*100);
        };

        _browser.DocumentCompleted += (sender, e) =>
        {
            if (_browser.ReadyState == WebBrowserReadyState.Complete) {

                int width = _browser.Document.Body.ScrollRectangle.Width;
                int height =_browser.Document.Body.ScrollRectangle.Height;

                _bitmap = new Bitmap(width,height);

                _browser.Size = _bitmap.Size;
                _browser.DrawToBitmap(_bitmap,_browser.Bounds);
                _browser.Stop();

                pictureBox1.Image = _bitmap;
                pictureBox1.Size = _bitmap.Size;

                lblImageSize.Text= String.Format("{0} x {1} pixels",_bitmap.Width,_bitmap.Height);

                progressBar1.Hide();
            }
        };
    }
    _browser.Navigate(url);
}

Thay đổi kích thước ảnh

Vì việc resize sẽ làm thay đổi ảnh nên cần sử dụng một đối tượng Bitmap (thành viên của lớp) để lưu lại ảnh ban đầu. Ví dụ sau sử dụng một NumericUpDown cho phép người dùng thay đổi kích thước theo phần trăm, từ đó tính ra kích thước mới (width x height):

void NumPercentValueChanged(object sender, EventArgs e)
{
    if(_bitmap==null)
        return;
    float percent=(float)(numPercent.Value/100);
    Bitmap bmp=new Bitmap((int)(_bitmap.Width*percent),(int)(_bitmap.Height*percent));
    lblImageSize.Text= String.Format("{0} x {1} pixels",bmp.Width,bmp.Height);
    Graphics g=Graphics.FromImage(bmp);
    g.DrawImage(_bitmap,0,0,bmp.Width,bmp.Height);
    pictureBox1.Image=bmp;
    pictureBox1.Size=bmp.Size;
}

Lưu ảnh

Sử dụng phương thức Image.Save(), phương thức này chấp nhận một tham số ImageFormat dành cho định dạng ảnh:

void BtnSaveClick(object sender, EventArgs e)
{
    if(saveFileDialog1.ShowDialog()==DialogResult.OK)
    {
        ImageFormat format;
        switch(saveFileDialog1.FilterIndex)
        {
            case 1:
                format=ImageFormat.Png;
                break;
            case 2:
                format=ImageFormat.Jpeg;
                break;
            default:
                format=ImageFormat.Bmp;
                break;
        }
        pictureBox1.Image.Save(saveFileDialog1.FileName,format);
    }
}

Note:Để sử dụng trong ASP.NET project, bạn cần add references các assembly cần thiết của WinFoms.

http://yinyangit.wordpress.com

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.