10 votes

Redimensionnement d'image en .Net avec anti-aliasing

J'ai un code C# qui redimensionne les images et je pense qu'il est assez typique :

Bitmap bmp = new Bitmap(image, new Size(width, height));
Graphics graphics = Graphics.FromImage(bmp);
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawImage(bmp, width, height);

Le problème est que les images résultantes sont clairement aliasées et les modifications des propriétés InterpolationMode et SmoothingMode semblent ne pas faire de différence.

Des suggestions ?

21voto

Julien Grenier Points 101

Il s'avère que le code était tout simplement incorrect. En fait, il redimensionnait l'image sans interpolation dans le constructeur Bitmap, puis essayait de redimensionner en douceur cette version à la taille à laquelle elle était déjà. Voici le code modifié:

Bitmap bmp = new Bitmap(width, height);
Graphics graph = Graphics.FromImage(bmp);
graph.InterpolationMode = InterpolationMode.High;
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, new Rectangle(0, 0, width, height));

En ce qui concerne l'anti-aliasing, le paramètre le plus important est graph.InterpolationMode.

Merci.

2voto

Firas Assaad Points 10339

Essayez graphics.DrawImage(bmp, 0, 0, largeur, hauteur); Consultez également cet article MSDN sur l'interpolation.

2voto

leppie Points 67289

L'anti-aliasing n'a rien à voir avec les graphiques raster. Il s'applique uniquement aux graphiques vectoriels. De toute évidence, une image est un graphique raster.

Vous devez regarder le InterpolationMode.

0voto

0xA3 Points 73439

Il y a un article sur CodeProject décrivant une méthode d'antialiasing améliorée :

http://www.codeproject.com/KB/GDI-plus/AntiAliasingIssues.aspx

Cordialement, divo

0voto

ericg Points 1518

Le problème pourrait être à un autre endroit. J'utilise un code similaire pour redimensionner des images et cela fonctionne correctement, mais la plus grande différence est que lorsque vous enregistrez l'image, vous devez spécifier la qualité (jpeg):

ImageCodecInfo[] codecs=ImageCodecInfo.GetImageEncoders();
ImageCodecInfo codec = null;
for (int i = 0; i

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X