【问题标题】:Retrieving favicon as icon instead of image检索图标而不是图像
【发布时间】:2012-02-24 15:42:18
【问题描述】:

我使用我找到的here 的网站图标代码来检索加载到浏览器元素中的网站的网站图标。

我想将此网站图标用作我的 Windows 窗体的图标。

感谢JP Hellemons此代码有效:

private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    this.Icon = favicon(GetActiveBrowser().Url);
}

private WebBrowser GetActiveBrowser() {
    return (WebBrowser)tabs.SelectedTab.Controls[0];
}

private Icon favicon(Uri url) {
    WebRequest request = (HttpWebRequest)WebRequest.Create("http://" + url.Host + "/favicon.ico");

    Bitmap bm = new Bitmap(32, 32);
    MemoryStream memStream;

    using (Stream response = request.GetResponse().GetResponseStream()) {
        memStream = new MemoryStream();
        byte[] buffer = new byte[1024];
        int byteCount;

        do {
            byteCount = response.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, byteCount);
        } while (byteCount > 0);
    }

    bm = new Bitmap(Image.FromStream(memStream));

    if (bm != null) {
        Icon ic = Icon.FromHandle(bm.GetHicon());
        return ic;
    } else
        return Properties.Resources.GZbrowser;
}

【问题讨论】:

  • 关于您的“Visual C#”问题:C# 就是 C#。如果您主要在图形设计模式下使用 Visual Studio IDE,我想您可以说“Visual”,但没有“Visual C#”与“其他类型的 C#”,就像 Basic 一样。
  • @MrLister:好的,谢谢,这是因为我有很多提到 Visual C# 的 tuts

标签: c# image browser icons favicon


【解决方案1】:

根据本文档,它应该从流中工作。 http://msdn.microsoft.com/en-us/library/system.drawing.icon.aspx

我用过这篇文章:http://odetocode.com/Blogs/scott/archive/2004/10/05/webrequest-and-binary-data.aspx

WebRequest request = (HttpWebRequest)WebRequest.Create("http://" + url.Host + "/favicon.ico");
Icon ic = new Icon(); // put default here
Bitmap bm = new Bitmap();

try
{
    using(WebResponse response = request.GetResponse())
    {
       using(Stream responseStream = response.GetResponseStream())
       {
          using(MemoryStream ms = new MemoryStream())
          {
              var tmp = Image.FromStream(ms); // changed bitmap to image
              bm = new Bitmap(tmp);
          }
       }
    }
}catch{}
if(bm != null)
{
    ic = Icon.FromHandle(bm.GetHicon);  
}
return ic;

编辑:应该这样做

Edit2: 更改了答案中的一些内容。你可以试试这个吗?

最终编辑:(笑)

刚刚在 Windows 窗体应用程序中对此进行了测试,并且有效! :)

Uri url = new Uri("http://www.google.nl");
WebRequest request = (HttpWebRequest)WebRequest.Create("http://" + url.Host + "/favicon.ico");

Bitmap bm = new Bitmap(32,32); 
MemoryStream memStream;

using (Stream response = request.GetResponse().GetResponseStream())
{
    memStream = new MemoryStream();
    byte[] buffer = new byte[1024];
    int byteCount;

    do
    {
        byteCount = response.Read(buffer, 0, buffer.Length);
        memStream.Write(buffer, 0, byteCount);
    } while (byteCount > 0);
}

bm = new Bitmap(Image.FromStream(memStream));                 

if (bm != null) 
{
    Icon ic = Icon.FromHandle(bm.GetHicon());
    this.Icon = ic;
}

【讨论】:

  • 感谢您的快速回答!我已经为您编写了一些代码,因为返回不起作用(我必须创建一个新图标)+ 我想使用我自己的图标,以防网站没有图标。可悲的是,我仍然收到一个错误:参数图片必须是可以用作图标的图像在下一篇文章中查看我的代码
  • 新版本在 VS 中给了我这个错误:无法将类型“System.Drawing.Image”隐式转换为“System.Drawing.Bitmap”。存在显式转换(您是否缺少演员表?)
  • 在 catch 中使用 (Bitmap)Bitmap.FromStream(ms); 和 MessageBox 会导致以下错误:System.Drawing.Image 中的参数无效。 FromStream(....) ... 关于规则 340 规则 339-341: 'using (MemoryStream ms = new MemoryStream()) { bm = (Bitmap)Bitmap.FromStream(ms); }'
  • 那是因为ico包含多个位图,更多信息在这里:channel9.msdn.com/Forums/TechOff/…
  • 像魅力一样工作!非常感谢您。 Hartelijk 湿透了!
【解决方案2】:

首先读取响应字节数组,然后创建它的 MemoryStream 并从该 MemoryStream 创建图标。

网络流不支持创建图标所需的搜索操作。

【讨论】:

  • 您好,感谢您的帮助。但我现在不太喜欢使用 Streams 等。我是 C# 的初学者。你能帮我一些代码示例吗?我不是要完整的代码(但我不会阻止你这样做:p),但有些代码会很有用
猜你喜欢
  • 2015-12-31
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多