使用WebBrower实现ASP.NET抓图 但不知为何出现空白
代码如下:GetImage.cs
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;
/// <summary>
/// GetImage 的摘要说明
/// </summary>
namespace Wap.Map
{
public class GetImage
{
int F_Width;
string MyURL;
/// <summary>
/// 宽度
/// </summary>
public int ImageWidth
{
get
{
return F_Width;
}
set
{
F_Width = value;
}
}
/// <summary>
/// URL地址
/// </summary>
public string WebSite
{
get
{
return MyURL;
}
set
{
MyURL = value;
}
}
/// <summary>
/// 构造
/// </summary>
/// <param name="WebSite"></param>
/// <param name="ImageWidth"></param>
public GetImage(string WebSite, int ImageWidth)
{
this.WebSite = WebSite;
this.ImageWidth = ImageWidth;
}
/// <summary>
/// 获得图片
/// </summary>
/// <returns></returns>
public byte[] GetBitmap()
{
WebPageBitmap Shot = new WebPageBitmap(this.WebSite);
Shot.GetIt();
Bitmap Pic = Shot.DrawBitmap(this.ImageWidth);
return imageToByteArray(Pic);
}
/// <summary>
/// 获得输出
/// </summary>
/// <param name="bitMap"></param>
/// <returns></returns>
private byte[] imageToByteArray(System.Drawing.Bitmap bitMap)
{
MemoryStream ms = new MemoryStream();
bitMap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
return ms.ToArray();
}
/// <summary>
/// 获得图片类型
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private System.Drawing.Imaging.ImageFormat getImgFormat(string fileName)
{
fileName = Path.GetExtension(fileName).TrimStart('.').ToLower();
if (fileName.Equals("bmp"))
{
return System.Drawing.Imaging.ImageFormat.Bmp;
}
if (fileName.Equals("gif"))
{
return System.Drawing.Imaging.ImageFormat.Gif;
}
if (fileName.Equals("jpg") || fileName.Equals("jpeg"))
{
return System.Drawing.Imaging.ImageFormat.Jpeg;
}
if (fileName.Equals("png"))
{
return System.Drawing.Imaging.ImageFormat.Png;
}
if (fileName.Equals("tiff"))
{
return System.Drawing.Imaging.ImageFormat.Tiff;
}
return System.Drawing.Imaging.ImageFormat.Jpeg;
}
}
/// <summary>
/// 抓网页
/// </summary>
public class WebPageBitmap
{
System.Windows.Forms.WebBrowser MyBrowser;
string URL;
public WebPageBitmap(string url)
{
this.URL = url;
MyBrowser = new System.Windows.Forms.WebBrowser();
MyBrowser.ScrollBarsEnabled = false;
MyBrowser.Visible = false;
MyBrowser.Size = new Size(1, 1);
}
public void GetIt()
{
MyBrowser.Navigate(this.URL, false);
while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
System.Threading.Thread.Sleep(500);
}
}
public Bitmap DrawBitmap(int imgWidth)
{
int DocumentHeight = MyBrowser.Document.Window.Size.Height;
int DocumentWidth = MyBrowser.Document.Window.Size.Width;
MyBrowser.Size = new Size(DocumentWidth, DocumentHeight);
if (DocumentWidth < imgWidth)
{
imgWidth = DocumentWidth;
}
int imgHeight = System.Convert.ToInt32(Math.Ceiling(DocumentHeight * imgWidth / System.Convert.ToDouble(DocumentWidth)));
Bitmap MyBitmap = new Bitmap(DocumentWidth, DocumentHeight);
Rectangle DrawRect = new Rectangle(0, 0, DocumentWidth, DocumentHeight);
/*
* System.Windows.Forms.WebBrowser继承了System.Windows.Forms.WebBrowserBase
* 而
* System.Windows.Forms.WebBrowserBase继承了System.Windows.Forms.Control
*
* System.Windows.Forms.Control.DrawToBitmap(bitmap,targetBounds)
* 支持呈现到指定的位图
* bitmap 要绘制到的位图。
* targetBounds 呈现控件时的边界。
*
* DrawToBitmap 方法具有下列局限性:
* 可能会针对大位图引发 ArgumentException。允许使用的最大大小因计算机而异。
* DrawToBitmap 不支持 Windows XP Tablet PC Edition 2005 操作系统的 Ink 控件。
* 如果 TextBox 的 Visible 属性设置为 false,则 DrawToBitmap 不绘制子 TextBox。
* 容器内部的控件按相反的顺序呈现。
* 对于 RichTextBox,DrawToBitmap 不能完全发挥作用;只绘制位图的边框
*/
try
{
MyBrowser.DrawToBitmap(MyBitmap, DrawRect);
System.Drawing.Bitmap oThumbNail = new Bitmap(imgWidth, imgHeight, MyBitmap.PixelFormat);
Graphics g = Graphics.FromImage(oThumbNail);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
Rectangle oRectangle = new Rectangle(0, 0, imgWidth, imgHeight);
g.DrawImage(MyBitmap, oRectangle);
g.Dispose();
return oThumbNail;
}
catch
{
return null;
}
finally
{
MyBitmap.Dispose();
MyBrowser.Dispose();
MyBrowser = null;
}
}
}
}