Sizing and working with ICO files in WPF/C#
In an application I'm working on there are Images (part of System.Windows.Media.Imaging
) being created dynamically in the code-behind of a XAML page and getting added to the window. I'm using ICO files, which contain various sizes and bit depths. The size I want is 96x96 @ 32 bit. The code automatically selects the largest size (256x256 @ 32 bit).
I'm setting the Image.Source
property as follows:
image.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Images/Application.ico"));
Now, by searching around I've found the Icon (part of System.Drawing
) which will allow me to set a string path and size, but this is a part of an entirely different library.
new Icon("pack://application:,,,/Resources/Images/Inquiry.ico",96,96);
Any idea how I can make my Image's size property a bit more manageable? Thank you!
EDIT: Convert System.Drawing.Icon to System.Media.I开发者_StackOverflow中文版mageSource
This post gets the image to appear smaller, however, it doesn't matter if I set the Icon to 96x96 or 128x128, it doesn't actually change the displayed image's size. I'm assuming it's going to some default value that is different that theSystem.Windows.Media.Imaging
default.
EDIT to the EDIT: Weird keeps getting weirder. When I display through the original method, it's definitely displaying the image as 256x256. However, when I use the conversion method described in the link, while the sizes change, they are significantly scaled down (i.e. 256x256 looks closer to 48x48).
Try the markup extension that is posted in this answer to another SO question. Note the use of BitmapDecoder
to get the required frame from the Ico file.
You could try with the following code, it should work for ICO files:
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;
I havent tried with ico files, I think could be useful here.
/// <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;
}
}
精彩评论