свойство привязки wpf для изменения размера bmp в высоком разрешении

#wpf #bitmap #resize #highdpi

#wpf #растровое изображение #изменение размера #высокое разрешение

Вопрос:

Имея необходимость отображать растровые изображения, а не векторные, с несколькими пользовательскими настройками dpi в приложении XBAP WPF, я хотел бы настроить глобальную переменную dpiFactor при запуске, которая будет рассчитываться в процентах от исходного растрового размера:

т. е. для 120 точек на дюйм я хочу, чтобы оба размера изображения были: NewSize = originalSize * (100 — (120 — 96)) / 100 что означает умножение на 75%, если разрешение составляет 125% от исходного.

dpiFactor должен быть определен при запуске, а затем все измерения должны быть уменьшены (или увеличены) при запуске страницы. Как я могу выразить это в XAML, возможно, с помощью свойства bound?

Ответ №1:

Возможно, вы можете использовать конвертер, который выглядит следующим образом:

   [ValueConversion(typeof(string), typeof(BitmapImage))]
  public class ImageConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      string imageSource = value as string;
      if (imageSource == null)
        return DependencyProperty.UnsetValue;

      try
      {
        BitmapImage originalImage = new BitmapImage(new Uri(imageSource));
        int originalWidth = originalImage.PixelWidth;
        int originalHeight = originalImage.PixelHeight;

        double originalDpiX = originalImage.DpiX;
        double originalDpiY = originalImage.DpiY;

        BitmapImage scaledImage = new BitmapImage();
        scaledImage.BeginInit();
        scaledImage.DecodePixelWidth = originalWidth; // Place your calculation here,
        scaledImage.DecodePixelHeight = originalHeight; // and here.
        scaledImage.UriSource = new Uri(imageSource);
        scaledImage.EndInit();
        scaledImage.Freeze();

        return scaledImage;
      }
      catch
      {
      }
      return new BitmapImage();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }
  

И в xaml это будет выглядеть следующим образом:

 <Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:test="clr-namespace:Test">
  <Window.Resources>
    <test:ImageConverter x:Key="imageConverter" />
  </Window.Resources>
  <Image Source="{Binding SomePath, Converter={StaticResource imageConverter}}" />
</Window>
  

Чтобы получить разрешение системы, я думаю, вы можете использовать этот код.