Определение размера и работа с файлами ICO в WPF / C # - PullRequest
10 голосов
/ 06 октября 2011

В приложении, над которым я работаю, есть изображения (часть 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);

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

РЕДАКТИРОВАТЬ: Конвертировать System.Drawing.Icon в System.Media.ImageSource
В этом посте изображение будет выглядеть меньше, однако, не имеет значения, если яустановите Icon на 96x96 или 128x128, это фактически не изменит размер отображаемого изображения.Я предполагаю, что будет какое-то значение по умолчанию, которое отличается от значения System.Windows.Media.Imaging по умолчанию.

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

Ответы [ 3 ]

1 голос
/ 20 апреля 2012

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

0 голосов
/ 12 февраля 2012

Я не пробовал с 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;
     }
    }
0 голосов
/ 03 февраля 2012

Вы можете попробовать следующий код, он должен работать для файлов 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;
...