1

Еще несколько недель назад я начал разрабатывать свое первое приложение для приложений Windows с Visual Studio 2015. Я заметил, что некоторые темы нелегко найти четкую информацию.Как изменить размер изображения с помощью C# WinRT

Я пытаюсь изменить (уменьшить) изображение, которое я сохранил ранее в файловой системе, а затем сохранил его в другой папке.

Я нашел this thread, где они говорят об этом. Я адаптировал код, который они поделили, но результат не подходит для меня. Потому что, я вижу, что результат изображения кажется «пиксельными точками», особенно по деталям изображения. Я не знаю, как записать результат изображения ... Как и при использовании старого приложения Paint Brush, когда мы меняем размер изображения.

Что я делаю неправильно? Почему так происходит?

Я подумал использовать альтернативный вариант NuGet, чтобы облегчить эту работу. В этом случае существует какой-то хороший пакет NuGet для этой задачи и он способен работать в C# Visual Studio 2015?

Я собираюсь поделиться код функции:

Примечание: новые размеры пропорциональны на исходном изображении, и я работаю с PNG изображений.

 public async static Task<bool> ResizeImage(Windows.Storage.StorageFile sourceFile, Windows.Storage.StorageFile destinationFile, int newWidth, int newHeight, int dpi) 
{ 
    try 
    { 
     using (var sourceStream = await sourceFile.OpenAsync(FileAccessMode.Read)) 
     { 
      Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(sourceStream); 
      Windows.Graphics.Imaging.BitmapTransform transform = new Windows.Graphics.Imaging.BitmapTransform() { ScaledHeight = Convert.ToUInt32(newHeight), ScaledWidth = Convert.ToUInt32(newWidth) }; 
      Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
       Windows.Graphics.Imaging.BitmapPixelFormat.Rgba8, 
       BitmapAlphaMode.Straight, 
       transform, 
       ExifOrientationMode.RespectExifOrientation, 
       ColorManagementMode.DoNotColorManage); 

      using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, destinationStream); 
       encoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Premultiplied, Convert.ToUInt32(newWidth), Convert.ToUInt32(newHeight), Convert.ToUInt32(dpi), Convert.ToUInt32(dpi), pixelData.DetachPixelData()); 
       await encoder.FlushAsync(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ModuleLog.WriteError(ex.ToString()); 
     return false; 
    } 

    return true; 
} 

ПРИМЕЧАНИЕ: Я пытаюсь уменьшить размер изображения. Например, у меня есть исходное изображение с файлом 100 х 100 пикселей, и я хочу получить файл размером 50 х 50 пикселей.

+0

Вы увеличиваете изображение? Если это так, то это будет выглядеть как дерьмо ... например, глядя на напечатанное изображение с увеличительным стеклом. –

+0

Очевидно, я пытаюсь уменьшить размер изображения. – stivex

+0

Теперь, когда вы отредактировали свой пост, это очевидно. –

ответ

2

Я думаю, что нашел решение.

Я добавил эту строку в моей функции:

transform.InterpolationMode = BitmapInterpolationMode.Fant; 

BitmapTransform обладает свойством InterpolationMode, который вы можете указать тип интерполяции, который мы хотим использовать, когда он изменяет размер изображения.

Here вы можете увидеть все возможности.

В моем случае я заметил, что использование интерполяции «Fant» является лучшим, чтобы получить наилучшие результаты изображения.

Смежные вопросы