调整和使用WPF / C中的ICO文件#

时间:2011-10-05 21:28:29

标签: c# wpf image icons size

在我正在处理的应用程序中,有一些图像(System.Windows.Media.Imaging的一部分)是在XAML页面的代码隐藏中动态创建的,并被添加到窗口中。我正在使用包含各种大小和位深度的ICO文件。我想要的大小是96x96 @ 32位。代码自动选择最大的大小(256x256 @ 32位)。

我正在设置Image.Source属性,如下所示:

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

现在,通过搜索我发现了Icon(System.Drawing的一部分),它允许我设置一个字符串路径和大小,但这是一个完全不同的库的一部分。

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

知道如何让我的Image尺寸属性更易于管理吗?谢谢!

编辑: Convert System.Drawing.Icon to System.Media.ImageSource
此帖子使图像显得更小,但是,如果我将图标设置为96x96或128x128并不重要,它实际上不会更改显示图像的大小。我假设它的某个默认值与System.Windows.Media.Imaging默认值不同。

编辑编辑:奇怪的是继续变得怪异。当我通过原始方法显示时,它肯定会将图像显示为256x256。但是,当我使用链接中描述的转换方法时,当尺寸发生变化时,它们显着缩小(即256x256看起来更接近48x48)。

3 个答案:

答案 0 :(得分:1)

尝试在this answer to another SO question中发布的标记扩展程序。请注意使用BitmapDecoder从Ico文件中获取所需的帧。

答案 1 :(得分:0)

您可以尝试使用以下代码,它应该适用于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;

答案 2 :(得分:-1)

我没有尝试使用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;
     }
    }