Загрузка изображения в ImageSource - неправильная ширина и высота - PullRequest
14 голосов
/ 19 сентября 2010

Моя проблема в том, что загрузка изображения происходит неправильно из ресурсов приложения.Это код:

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.UriSource = new Uri(@"pack://application:,,,/WpfApplication3;component/Resources/Images/16x16_incorrect.png", UriKind.Absolute);
    bi.EndInit();

    ImageSource s = bi;

Файл изображения "16x16_incorrect.png" имеет размер PNG-файла 16x16 32 бит, но после выполнения приведенного выше кода s.Width = s.Height = 21,59729 .... У меня также естьдругой файл - «16x16_correct.png», когда я загружаю его таким же образом, ширина и высота ImageSource равны 16,002.

У меня есть большой пакет полезных изображений PNG 16x16 32bpp, которые я собираюсь использовать в интерфейсе своих приложений.К сожалению, каждый из них загружается неправильно и выглядит размытым (или сглаженным), поскольку система растягивает его с 16x16 до 21x21.

  • правильное изображение: Correct Image
  • неверное изображение: Incorrect Image

Не могли бы вы любезно объяснить возможное решение этой проблемы?Если проблема в файлах исходного изображения, как я могу изменить ImageSource.Width на нужный размер, чтобы использовать эти файлы?

Ответы [ 3 ]

18 голосов
/ 14 апреля 2011

Если вы не хотите изменять DPI извне, вы можете сделать это следующим образом:

public static BitmapSource ConvertBitmapTo96DPI(BitmapImage bitmapImage)
{
    double dpi = 96;
    int width = bitmapImage.PixelWidth;
    int height = bitmapImage.PixelHeight;

    int stride = width * bitmapImage.Format.BitsPerPixel;
    byte[] pixelData = new byte[stride * height];
    bitmapImage.CopyPixels(pixelData, stride, 0);

    return BitmapSource.Create(width, height, dpi, dpi, bitmapImage.Format, null, pixelData, stride);
}

Если вам просто нужны правильные значения в Image.Source.Width / Height, вы можете сделать что-то вроде того, что я сделал:

this.myImage.Tag = new double[] { bitmapImage.DpiX, bitmapImage.DpiY };
this.myImage.Source = bitmapImage;

и измените его размер так:

public static void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    if (img == null || img.Source == null)
        return;

    double srcWidth = img.Source.Width;
    double srcHeight = img.Source.Height;

    // Set your image tag to the sources DPI value for smart resizing if DPI != 96
    if (img.Tag != null && img.Tag.GetType() == typeof(double[]))
    {
        double[] DPI = (double[])img.Tag;
        srcWidth = srcWidth / (96 / DPI[0]);
        srcHeight = srcHeight / (96 / DPI[1]);
    }

    double resizedWidth = srcWidth;
    double resizedHeight = srcHeight;

    double aspect = srcWidth / srcHeight;

    if (resizedWidth > maxWidth)
    {
        resizedWidth = maxWidth;
        resizedHeight = resizedWidth / aspect;
    }
    if (resizedHeight > maxHeight)
    {
        aspect = resizedWidth / resizedHeight;
        resizedHeight = maxHeight;
        resizedWidth = resizedHeight * aspect;
    }

    img.Width = resizedWidth;
    img.Height = resizedHeight;
}
11 голосов
/ 19 сентября 2010

Вам нужно установить разрешение изображения 96 DPI (в настоящее время это неправильное значение png 71,12).

Это можно сделать с помощью бесплатной программы paint.net (http://getpaint.net) изВ меню «Изображение» выберите «Размер холста» и установите для поля «разрешение» значение 96

.
6 голосов
/ 19 сентября 2010

Это из-за DPI изображений. WPF отображает значение по умолчанию с 96 dpi. Если вы посмотрите на точек на дюйм неправильного изображения PNG. Вы увидите, что он установлен на 72. Это заставляет WPF масштабировать изображение до 96 DPI и сохранять исходный размер.

Есть два решения. Вы можете:

  1. Изменить DPI с помощью, например, XnView. Установите его на 96.
  2. Установите для свойств Width и Height значение 16, а для свойства Stretch - Uniform

    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Image x:Name="MyIncorrectImageFixed" Source="http://i.piccy.info/i5/24/41/504124/16x16_incorrect.png" Width="16" Height="16" Stretch="Uniform"  />
    <Image x:Name="MyIncorrectImage" Source="http://i.piccy.info/i5/24/41/504124/16x16_incorrect.png"  Stretch="None" Grid.Row="1"  />
    <Image x:Name="MyCorrectImage" Source="http://i.piccy.info/i5/22/41/504122/16x16_correct.png" Stretch="None" Grid.Row="2"  />
    

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...