选择System.Drawing.Icon的大小?

24

我有一个图标,它有几个不同的尺寸(16px、32px、64px)。我使用 ToBitmap() 方法调用它,但它总是返回32px大小的图像。如何获取64px大小的图像?


1
顺便提一下,那是_System_.Drawing.Icon,并且是ToBitmap()方法。 - SLaks
嗨,SLaks,你是对的。抱歉打错了。 - Andy Hin
7个回答

36

这个能帮到你吗?

Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64));

25

对于其他遇到同样问题的人,我找到了一个不错的解决方案。

Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap()

这就是它。图标资源包含所有尺寸,只需使用New()获取所需的尺寸即可。 - Todd Myhre

13
这是ResourceManager类中的一个相当痛苦的限制。它的GetObject()方法没有提供一种方式来传递额外的参数,以便通过大小选择返回的图标。一种解决方法是将图标添加到项目中。使用“项目”+“添加现有项”,选择您的.ico文件。选择添加的图标并将“生成操作”属性更改为“嵌入式资源”。现在,您可以使用以下代码检索所需的图标:
    public static Icon GetIconFromEmbeddedResource(string name, Size size) {
        var asm = System.Reflection.Assembly.GetExecutingAssembly();
        var rnames = asm.GetManifestResourceNames();
        var tofind = "." + name + ".ICO";
        foreach (string rname in rnames) {
            if (rname.EndsWith(tofind, StringComparison.CurrentCultureIgnoreCase)) {
                using (var stream = asm.GetManifestResourceStream(rname)) {
                    return new Icon(stream, size);
                }
            }
        }
        throw new ArgumentException("Icon not found");
    }

使用示例:

        var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16));
        var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32));

需要注意的是一个可能的故障模式:这段代码假设图标被添加到包含该方法的同一个程序集中。


我无法让它工作。字符串rname未包含文件中资源的名称。 - Kirsten
这个对我有用。其他解决方案不行是因为我需要从给定路径的程序集中获取图标。我只加载了程序集到反射上下文中。重要的是图标必须是程序集中的“嵌入式资源”,否则就不起作用。 - redcurry
使用VS Express 15,我将我的“Resources.resx”中的图标的“Persistence”属性设置为“嵌入到 .resx 文件中”;这是否等同于将“Build Action”属性设置为“嵌入的资源”? - Thanasi Poulos
你如何提取具有32位颜色与8位颜色的图标? - tofutim

3
以下设置工具栏中所有按钮的图标大小。
它依赖于资源名称存储在按钮标签中。
public void SetButtons(object toolstrip, int IconWidth, int IconHeight)
{
    var ts = (ToolStrip) toolstrip;
    var size = new System.Drawing.Size();
    size.Height = IconSize;
    size.Width = IconSize;

    foreach (ToolStripButton tsBtn in ts.Items)
    {
        tsBtn.ImageScaling = ToolStripItemImageScaling.None;
        var resourcename = (String) tsBtn.Tag;
        if (resourcename != null)
        {
            var myIcon = (Icon) Properties.Resources.ResourceManager.GetObject(resourcename);
            var newIcon = new Icon(myIcon, IconWidth, IconHeight);
            tsBtn.Image = newIcon.ToBitmap();
        }
    }
}

1
internal static class IconHelper {
    public static Icon GetSize(this Icon icon, int width, int height) {
        return icon.GetSize(new Size(width, height));
    }

    public static Icon GetSize(this Icon icon, Size size) {
        using(var mem = new MemoryStream()) {
            icon.Save(mem);
            mem.Position = 0;
            return new Icon(mem, size);
        }
    }
}

谢天谢地,不需要像这样复制整个东西! - Asherah

1

图标的大小在创建 Icon 实例时确定,因此您需要在创建它时指定要使用的大小,使用其中一个带有 Size 参数的 Icon 构造函数


嗨,谢谢。这很有道理,但我的图标在资源文件中。我该如何修改构造函数? - Andy Hin

0

在 .Net 框架中没有内置的方法可以实现这个功能。

不过,你可以使用 这个库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接