本来是想把网页加载出来的验证码的图片控件<img>中的url直接放到PictureBox,但发现url是一个没有图片格式后缀的地址(或是个action),所以图片没能显示在PictureBox中。
从网上搜索相关解决办法,测试通过了其中两种。
环境:vs2008
第一种:
属性声明区域引入:
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern int BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);
截图方法中:
int x = 10;
int y = -20;
//用于保存图片的位图对象
Bitmap bmSave = new Bitmap(220, 60);
//创建该位图的Graphics对象
Graphics gSave = Graphics.FromImage(bmSave);
Graphics gSrc = this.webBrowser1.CreateGraphics();
HandleRef hDcSave = new HandleRef(null, gSave.GetHdc());
HandleRef hDcSrc = new HandleRef(null, gSrc.GetHdc());
BitBlt(hDcSave, x, y, 220, 60, hDcSrc, 0, 0, 0xcc0020);
gSrc.ReleaseHdc();
gSave.ReleaseHdc();
bmSave.Save("d://test.png");
gSrc.Dispose();
gSave.Dispose();
bmSave.Dispose();
这样PictureBox的图像地址设置为"d://test.png",就可以显示图片了。
需要说明的是起始坐标X,Y可以设置负数,这也许能让你截取图片时,找到最佳切入位置。
第二种:
比较简单,DrawToBitmap方法,网上也有很多举例的,但发现vs2008的webBrowser没有这个方法。通过查阅msdn介绍,发现这个方法在r它“老子”那里。
ectangle rect = new Rectangle(0, 0, 220, 60);
Bitmap bmSave1 = new Bitmap(220, 60);
this.webBrowser1.Parent.DrawToBitmap(bmSave1, rect);
bmSave1.Save("d://test1.png");
注意第一句的Rectangle(0, 0, 220, 60)前两个参数是0(不可以是负数,否则报错)。
问题来了,图片在网页的什么地方??幸好又碰到一位高人,把这个图片的网页元素设置到网页的左上角,如下:
HtmlElement ele_pic = this.webBrowser1.Document.GetElementsByTagName("img")[0];
ele_pic.Style = "position: absolute; z-index: 9999; top: 0px; left: 0px";
这样截取图片的起始起始位置就是0,0,从而保证完好无损的截图原图片。
以上内容中的220, 60 不用多说了,是图片的大小,这个你可以从网页中显示的图片,右键-属性得知。