【问题标题】:Sizing and working with ICO files in WPF/C#在 WPF/C# 中调整大小并使用 ICO 文件
【发布时间】:2011-10-05 21:28:29
【问题描述】:

在我正在处理的应用程序中,有图像(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);

知道如何使 Image 的 size 属性更易于管理吗?谢谢!

编辑: Convert System.Drawing.Icon to System.Media.ImageSource
这篇文章使图像看起来更小,但是,我将图标设置为 96x96 还是 128x128 都没有关系,它实际上并没有改变显示图像的大小。我假设它的默认值与System.Windows.Media.Imaging 默认值不同。

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

【问题讨论】:

  • 不确定,如果我有问题,如果您想为图像设置固定大小,为什么不使用 Image.Height 和 Image.Width?否则还有很多关于调整大小的教程,例如rongchaua.net/blog/c-wpf-fast-image-resize
  • ICO 太痛苦了。看起来微软不再认为它们是一流的对象了……无论如何,system.drawing.icon.tobitmap 可以用来调整图标的大小。您可以在 BitmapImage.BeginInit - EndInit 块中使用 BitmapImage.DecodePixelWidth 属性吗?
  • 我阅读了另一篇文章,其中的解决方案是创建特定大小的 ICO,但我现在找不到。您是否将其用作应用程序的图标?
  • Blam:我在程序中使用它作为图标。一种伪平板式界面。对于实际系统使用的任何尺寸,它似乎都是一触即发的,然后重新调整自己的尺寸。只是最终咬紧牙关,改为制作矢量。

标签: c# wpf image icons size


【解决方案1】:

试试this answer to another SO question 中发布的标记扩展。请注意使用 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】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2010-10-20
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多