Подтвердить что ты не робот

Выбор размера System.Drawing.Icon?

У меня есть значок, который имеет несколько разных размеров (16px, 32px, 64px). Я нахожу ToBitmap() на нем, но он всегда возвращает изображение 32px. Как получить 64px один?

4b9b3361

Ответ 1

Это довольно болезненное ограничение в классе ResourceManager. Его метод GetObject() не предоставляет способ передать дополнительные аргументы, которые позволят выбрать возвращаемый значок по размеру. Обходным путем является добавление значка в проект вместо этого. Используйте Project + Добавить существующий элемент, выберите ваш .ico файл. Выберите добавленный значок и измените свойство Build Action на "Embedded Resource".

Теперь вы можете получить нужный значок с кодом следующим образом:

    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));

Остерегайтесь одного возможного отказа: этот код предполагает, что значок был добавлен в ту же сборку, которая содержит этот метод.

Ответ 2

Помогает ли это?

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

Ответ 3

Для кого-то другого, наткнувшегося на ту же проблему, я нашел небольшое небольшое решение.

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

Ответ 4

Ниже задается размер значка для всех кнопок на панели инструментов.
Он зависит от имени ресурса, хранящегося в теге кнопки.

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();
        }
    }
}

Ответ 5

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);
        }
    }
}

Ответ 6

В .NET Framework нет встроенного метода.

Вместо этого вы можете использовать эту библиотеку.

Ответ 7

Размер определяется при создании экземпляра Icon, поэтому вам нужно указать, какой размер вы хотите использовать при его создании, используя один из Icon конструкторы, которые принимают параметр Size.