【问题标题】:Create an Icon from an Image downloaded from the Internet从从 Internet 下载的图像创建图标
【发布时间】:2021-09-10 19:02:23
【问题描述】:

我想使用从 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 图像,但从技术上讲,它可以是任何文件格式。

【问题讨论】:

  • 推荐的方法是使用图标编辑器创建一个真正的 ie 多分辨率图标并将其加载到您的程序集中。

标签: c# .net winforms icons webclient


【解决方案1】:

您可以使用Image.FromStream() 并转换为位图,因此您可以使用GetHicon() 方法。
如果Image不需要任何特殊处理,则返回Icon.FromHandle(),将GetHicon()返回的值传递给方法。

FromStream(stream, true) 中的布尔选项指示保留 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]);

【讨论】:

  • 对不起。正如我所说,错误消息显示“参数无效”。我正在尝试下载:web.whatsapp.com/img/…
  • 不,我用你的代码行试过了,也没有用。我尝试将项目架构更改为 x86,这次我的防火墙询问我是否要允许访问互联网。我点击是,但错误又来了。错误发生在系统上。绘图(见下文)。这个项目是全新的,我只是打开一个带有按钮的新表单,并想在构造函数中更改图标。 System.ArgumentException HResult=0x80070057 消息=无效参数。来源 = System.Drawing
  • 我按照您在此处发布的方式粘贴了代码。我在另一个类中使用它,并从表单的构造函数中调用该类。在我使用this.Icon = [class].DownloadImage 的形式中
  • 你没有说这段代码在什么系统中运行以及正在使用的.Net版本是什么。 -- 我无法重现该问题:Form with Icon。 -- 您还可以更新您的问题,如何/何时调用此代码。
  • 我使用的是 Windows 10 Pro 和 -NET Framework 4.7.2
【解决方案2】:

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

然后

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 2015-12-31
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多