Cela permettra d'effectuer un redimensionnement de haute qualité :
/// <summary>
/// Resize the image to the specified width and height.
/// </summary>
/// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
-
wrapMode.SetWrapMode(WrapMode.TileFlipXY)
empêche les images fantômes autour des frontières de l'image -- un redimensionnement naïf échantillonnera les pixels transparents au-delà des frontières de l'image, mais en reflétant l'image nous pouvons obtenir un meilleur échantillon (ce paramètre est très visible)
-
destImage.SetResolution
maintient le DPI indépendamment de la taille physique -- peut augmenter la qualité lors de la réduction des dimensions de l'image ou lors de l'impression
- La composition contrôle la façon dont les pixels sont mélangés à l'arrière-plan. Elle n'est peut-être pas nécessaire puisque nous ne dessinons qu'une seule chose.
-
graphics.CompositingMode
détermine si les pixels d'une image source remplacent ou sont combinés avec les pixels de l'arrière-plan. SourceCopy
spécifie que lorsqu'une couleur est rendue, elle écrase la couleur d'arrière-plan.
-
graphics.CompositingQuality
détermine le niveau de qualité du rendu des images en couches.
-
graphics.InterpolationMode
détermine le mode de calcul des valeurs intermédiaires entre deux points d'extrémité
-
graphics.SmoothingMode
spécifie si les lignes, les courbes et les bords des zones remplies utilisent le lissage (également appelé anti-crénelage) -- ne fonctionne probablement que sur les vecteurs.
-
graphics.PixelOffsetMode
affecte la qualité du rendu lors du dessin de la nouvelle image
Le maintien du ratio d'aspect est laissé comme un exercice pour le lecteur (en fait, je ne pense pas que ce soit le rôle de cette fonction de le faire pour vous).
Aussi, c'est un bon article décrivant certains des pièges du redimensionnement des images. La fonction ci-dessus couvre la plupart d'entre eux, mais vous devez toujours vous préoccuper de ce qui suit sauver .
0 votes
Vérifiez este dehors.
0 votes
C'est ce qu'il faut faire... Le constructeur surchargé de Bitmap accepte également deux paramètres pour la largeur et la hauteur.
0 votes
Vous pouvez également consulter cette question sur stackoverflow : < stackoverflow.com/questions/87753/ >
4 votes
Ce n'est pas la bonne méthode... elle utilise une interpolation de faible qualité et peut entraîner le blocage du flux original pendant la durée de la nouvelle image bitmap... Lire la liste des pièges du redimensionnement des images avant de faire votre propre solution de redimensionnement d'image.
0 votes
La librairie standard pour le redimensionnement des images se trouve à l'adresse suivante imageresizing.net . Une fois que vous aurez commencé à résoudre tous les bogues de GDI, il vaudra vraiment la peine d'utiliser une bibliothèque (simple) plutôt que d'écrire la vôtre.
3 votes
Jetez ça ! Using(){} fonctionne !
9 votes
Si ces réponses sont utiles, pensez à marquer la réponse acceptée.
3 votes
Il n'est pas nécessaire d'utiliser une bibliothèque supplémentaire. Le code posté ci-dessous par Mark fonctionne parfaitement.
0 votes
@Gabe votre lien est mort.
14 votes
Qui est Mark ? Je n'ai pas trouvé sa réponse, mais il y a 3 commentaires qui y font référence.
0 votes
@Sinatr Il semble que la "réponse de Mark" soit cette réponse .
0 votes
@inutan Souhaitez-vous accepter une réponse différente ? La réponse actuellement acceptée a été supprimée, probablement parce qu'il s'agissait d'une réponse avec un lien uniquement.