从从 Internet 下载的图像创建图标

Create an Icon from an Image downloaded from the Internet

我想使用从 Internet 地址获取的图像,并在我的应用程序中使用它作为一个或多个表单的图标。
我不想将它保存在磁盘上。我试了一下,在绘制位图时出现了一些错误。

到目前为止我有这样的东西:

internal static Icon DownloadImage(string fromUrl)
{
    using (System.Net.WebClient webClient = new System.Net.WebClient())
    {
        using (Stream stream = webClient.OpenRead(fromUrl))
        {
            return new Icon(stream);
        }
    }
}

最后一行本来是针对图片优化的,像这样:

return Image.FromStream(stream);

这就是它变得棘手的地方,我不知道如何进一步。
它在当前状态下不起作用,我想这样称呼它:

this.Icon = DownloadImage(url);

谁能帮我解决这个问题? 我正在尝试使用 .svg 图片,但从技术上讲它可以是任何文件格式。

使用 return Image.FromStream(stream); 更安全,因此您可以引用任何图像..

然后

Bitmap myBitmap = DownloadImage(url);
IntPtr Hicon = myBitmap.GetHicon();
Icon newIcon = Icon.FromHandle(Hicon);
this.Icon = newIcon;
DestroyIcon(newIcon.Handle);

您可以使用 Image.FromStream() and cast to Bitmap, so you have the GetHicon() 可用的方法。
如果图像不需要任何特殊处理,则只需 return Icon.FromHandle(),将 return 由 GetHicon() 编辑的值传递给方法。

FromStream(stream, true) 中的 bool 选项指示保留 ICM 信息(如果存在)。如果存在,丢弃它可能会影响图像的颜色定义。

如果图像已经是透明的,图标将保留透明度设置。

记得在窗体关闭时或用另一个替换它之前调用新图标的 Dispose() 方法(销毁句柄)。

注:题中提到了SVG格式。 GDI+ 不支持这种格式,就像 WebP 和其他更新的格式一样。参见:Using Image Encoders and Decoders in Managed GDI+

using System.Drawing;
using System.Net;

internal static Icon GetIconFromWebImage(string fromUrl)
{
    using (var client = new WebClient())
    using (var stream = client.OpenRead(new Uri(fromUrl)))
    using (var img = (Bitmap)Image.FromStream(stream, true)) {
        return Icon.FromHandle(img.GetHicon());
    }
}

你可以设置:

[Some Form].Icon = DownloadImage([some address]);