怎样将一个图像传递给Memorystream

cyclone_leo 2012-06-30 03:24:50
以下代码是将网页上的图片保存到剪切板再保存到bincode,能否不经过Clipboard,将IMG传递给bincode,代码应该怎么写?

HTMLDocument html = (HTMLDocument)obj.Document.DomDocument;
HTMLBody body = (HTMLBody)html.body;
IHTMLControlRange range = (IHTMLControlRange)body.createControlRange();
IHTMLControlElement IMG;
for (int i = 0; i < obj.Document.Images.Count; i++)
{
IHTMLImgElement img = (IHTMLImgElement)obj.Document.Images[i].DomElement;
if (img.src.IndexOf("Img=") >= 0)
{
IMG = (IHTMLControlElement)obj.Document.Images[i].DomElement;
range.add(IMG);
while (Clipboard.ContainsImage())
Application.DoEvents();
range.execCommand("Copy", false, null);
img = null;
IMG = null;
if (Clipboard.ContainsImage())
{
MemoryStream bincode = new MemoryStream();
Clipboard.GetImage().Save(bincode, System.Drawing.Imaging.ImageFormat.Bmp);
}
break;
}
}
...全文
308 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
HeraLu 2013-02-25
  • 打赏
  • 举报
回复
请问7楼的代码里 Bitmap bmp = new Bitmap(e.OffsetRectangle.Width, e.OffsetRectangle.Height); e是什么?
孟子E章 2012-07-01
  • 打赏
  • 举报
回复
其实,既然是程序处理,请求多次验证码不影响你的使用,请求一次新的图片,验证码是新的,就像页面上的刷新验证码是一样的,
孟子E章 2012-07-01
  • 打赏
  • 举报
回复


[ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")]
private interface IHTMLElementRenderFixed
{
void DrawToDC(IntPtr hdc);
void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc);
}


public Bitmap GetImage(IHTMLImgElement img)
{
IHTMLElementRenderFixed render = (IHTMLElementRenderFixed)img;

Bitmap bmp = new Bitmap(e.OffsetRectangle.Width, e.OffsetRectangle.Height);

Graphics g = Graphics.FromImage(bmp);
IntPtr hdc = g.GetHdc();
render.DrawToDC(hdc);
g.ReleaseHdc(hdc);

return bmp;
}
cyclone_leo 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你要直接得到图片也可以,只要分析网页html的标签,然后单独对这个标签地址发起WebRequest请求。
[/Quote]

谢谢,按你说的试了,但得到的图片和webBrowser上显示不是同一个验证码图片。WebRequest对img.src发起的请求是获得第二个验证码的图片啊。我希望可以将我一楼的代码中的IMG通过什么办法赋值给bincode而不经过剪切板copy和save的方式才传给bincode。因为我在想如果程序在并发使用时候,很容易造成同时几个程序实例去调用剪切板使用而导致冲突,所以想避免使用剪切板。

for (int i = 0; i < webBrowser1.Document.Images.Count; i++)
{
IHTMLImgElement img = (IHTMLImgElement)webBrowser1.Document.Images[i].DomElement;
if (img.src.IndexOf("Img=") >= 0)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(img.src);
WebRequest req = WebRequest.Create(img.src);
WebResponse res = req.GetResponse();
Bitmap bm = new Bitmap(res.GetResponseStream());
pictureBox1.Image = bm;
break;
}
}
qldsrx 2012-06-30
  • 打赏
  • 举报
回复
你要直接得到图片也可以,只要分析网页html的标签,然后单独对这个标签地址发起WebRequest请求。
cyclone_leo 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这是 java 的代码?
[/Quote]

c#的啊
cyclone_leo 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
网页的图片直接WebClient.DownLoad就可以了,你最终要实现什么功能》
[/Quote]

是验证码的图片,DOWNLOAD下来的和网页上的不一样的。按我说的代码是可以和网页的一样,但是我不想经过剪切板COPY保存,能否直接将IMG传递给Memorystream
__天涯寻梦 2012-06-30
  • 打赏
  • 举报
回复
这是 java 的代码?
孟子E章 2012-06-30
  • 打赏
  • 举报
回复
网页的图片直接WebClient.DownLoad就可以了,你最终要实现什么功能》

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧