Размер и работа с файлами ICO в WPF/С#

В приложении, над которым я работаю, есть изображения (часть System.Windows.Media.Imaging), которые динамически создаются на основе кода страницы XAML и добавляются в окно. Я использую ICO файлы, которые содержат различные размеры и бит глубины. Размер, который я хочу, равен 96x96 @32 бит. Код автоматически выбирает самый большой размер (256x256 @32 бит).

Я устанавливаю свойство Image.Source следующим образом:

image.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Images/Application.ico"));

Теперь, выполнив поиск, я нашел значок (часть System.Drawing), который позволит мне установить путь и размер строки, но это часть совершенно другой библиотеки.

new Icon("pack://application:,,,/Resources/Images/Inquiry.ico",96,96);

Любая идея, как я могу сделать свой размер изображения более управляемым? Спасибо!

EDIT: Преобразовать System.Drawing.Icon в System.Media.ImageSource
В этом сообщении изображение становится меньше, однако не имеет значения, если я установил значок 96x96 или 128x128, он фактически не изменит отображаемый размер изображения. Я предполагаю, что это будет какое-то значение по умолчанию, которое отличается от System.Windows.Media.Imaging по умолчанию.

РЕДАКТИРОВАТЬ РЕДАКТИРОВАНИЕ: Странно продолжает становиться более странным. Когда я показываю через оригинальный метод, он определенно отображает изображение как 256x256. Однако, когда я использую метод преобразования, описанный в ссылке, в то время как размеры меняются, они значительно уменьшаются (т.е. 256x256 выглядит ближе к 48x48).

Ответ 1

Попробуйте расширение разметки, которое опубликовано в этом ответе на другой вопрос SO. Обратите внимание на использование BitmapDecoder, чтобы получить требуемый кадр из файла Ico.

Ответ 2

Вы можете попробовать со следующим кодом, он должен работать для файлов ICO:

Image displayImage = new Image();
// Create the source
BitmapImage sourceImage = new BitmapImage();
sourceImage.BeginInit();
sourceImage.UriSource = new Uri("pack://application:,,,/Resources/Images/Application.ico");
sourceImage.EndInit();
// Set the source
displayImage.Source = sourceImage;
// Set the size you want
displayImage.Width = 96;
displayImage.Stretch = Stretch.Uniform;

Ответ 3

Я havent пытался с файлами ico, я думаю, может быть полезно здесь.

    /// <summary>
    /// Resizes image with high quality
    /// </summary>
    /// <param name="imgToResize">image to be resized</param>
    /// <param name="size">new size</param>
    /// <returns>new resized image</returns>
    public Image GetResizedImage(Image imgToResize, Size size) 
    {
      try
      {
       if (imgToResize != null && size != null)
       {
         if (imgToResize.Height == size.Height && imgToResize.Width == size.Width)
         {
            Image newImage = (Image)imgToResize.Clone();
            imgToResize.Dispose();
            return newImage;
         }
         else
         {
            Image newImage = (Image)imgToResize.Clone();
            imgToResize.Dispose();
            Bitmap b = new Bitmap(size.Width, size.Height);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(newImage, 0, 0, size.Width, size.Height);
            g.Dispose();
            return (Image)b;
        }
      }
       return null;
     }
     catch (Exception e)
     {
       log.Error("Exception in Resizing an image ", e);
       return null;
     }
    }