1

Il n'y a pas plus de semaines, j'ai commencé à développer ma première application windows avec Metro Studio Visual Studio 2015. J'ai remarqué que certains sujets ne sont pas faciles à trouver.Comment redimensionner une image avec C# WinRT

J'essaye de redimensionner (réduire) une image que j'ai enregistrée précédemment sur le système de fichiers, puis de l'enregistrer dans un autre dossier.

J'ai trouvé this thread où ils sont en train de parler. J'ai adapté le code qu'ils ont partagé mais l'image de résultat n'est pas acceptable pour moi. Parce que, je peux voir que le résultat de l'image semble être "points de pixel", spécialement sur les détails de l'image. Je ne sais pas comment décrire l'image du résultat ... Comme en utilisant l'ancienne application Paint Brush, quand on change l'image de taille.

Qu'est-ce que je fais mal? Pourquoi ça arrive?

J'ai pensé utiliser un paquet NuGet comme alternative, pour faciliter ce travail. Dans ce cas, existe un bon package NuGet pour cette tâche et est capable de fonctionner dans C# Visual Studio 2015?

Je vais partager ma fonction de code:

Note: les nouvelles dimensions sont proportionnelles sur l'image originale, et je travaille avec des images 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; 
} 

REMARQUE: j'essaie de réduire la taille de l'image. Par exemple, j'ai une image de fichier originale 100 x 100 pixels et je veux obtenir une image de 50 x 50 pixels.

+0

Est-ce que vous agrandissez l'image? Si c'est le cas, ça ressemblera à de la merde ... comme regarder une image imprimée avec une loupe. –

+0

Évidemment, j'essaie de réduire la taille de l'image. – stivex

+0

Maintenant que vous avez modifié votre post, c'est évident. –

Répondre

2

Je pense que j'ai trouvé la solution.

J'ai ajouté cette ligne dans ma fonction:

transform.InterpolationMode = BitmapInterpolationMode.Fant; 

Le BitmapTransform a la propriété InterpolationMode, que vous pouvez spécifier le type d'interpolation que nous voulons utiliser quand il redimensionne une image.

Here vous pouvez voir toutes les possibilités.

Dans mon cas, j'ai remarqué que l'utilisation de l'interpolation "Fant" est la meilleure pour obtenir les meilleurs résultats d'image.