Изображение миниатюры WPF размыто

#c# #wpf

#c# #wpf

Вопрос:

У меня есть приложение 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:

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

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

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

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