WPF уменьшенное изображение размыто - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть приложение WPF , которое сохраняет эскиз в виде png .Код работает достаточно хорошо, но когда я открываю изображение очень размыто.Изображение, которое он захватывает, происходит от самого холста.Холст меняет свою ширину и высоту в зависимости от загружаемого изображения.Желаемый размер миниатюры будет 200 x 200 ( пикселей ).

Вот мой код

    public void CreateThumbail(Canvas canvas, string filename)
    {
      RenderTargetBitmap rtb = new RenderTargetBitmap(
        (int)canvas.ActualWidth,
        (int)canvas.ActualHeight,
        96, //dip X
        96, //dpi Y
        PixelFormats.Pbgra32);
      rtb.Render(canvas);

      PngBitmapEncoder pngImage = new PngBitmapEncoder();

      pngImage.Frames.Add(CreateResizedImage(rtb, 200, 200, 0));
      using (var filestream = System.IO.File.Create(filename))
      {
        pngImage.Save(filestream);
      }
    }

    private static BitmapFrame CreateResizedImage(ImageSource source, int width, int height, int margin)
    {
      var rect = new Rect(margin, margin, width, height);

      var group = new DrawingGroup();
      RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.HighQuality);
      group.Children.Add(new ImageDrawing(source, rect));

      var drawingVisual = new DrawingVisual();
      using (var drawingContext = drawingVisual.RenderOpen())
        drawingContext.DrawDrawing(group);

      var resizedImage = new RenderTargetBitmap(
          (int)rect.Width, (int)rect.Height,// Resized dimensions
          96, 96, // Default DPI values
          PixelFormats.Pbgra32); // Default pixel format
      resizedImage.Render(drawingVisual);

      return BitmapFrame.Create(resizedImage);
    }

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

1 Ответ

2 голосов
/ 23 апреля 2019

Возможно, вам необходимо соблюдать исходные размеры изображения.Например, изображение размером 400x400 будет довольно хорошо уменьшено до 200x200, но изображение размером 235x235 не будет.

Это не относится к изображениям, которые не являются квадратными для начала.

ВыМожно попытаться уменьшить высоту и ширину изображения с хорошим коэффициентом (я бы начал с деления пополам) до тех пор, пока изображение не станет меньше, чем 200x200, а затем заполнить его белым или прозрачным.

Обработка изображения может быть довольно сложной.Я не эксперт в этом, поэтому я бы попробовал стороннюю библиотеку, подобную этой, которую я только что нашел в Google: https://imageprocessor.org/

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