113 votes

Redimensionnement d'une image sans perte de qualité

Comment puis-je redimensionner une image sans en altérer la qualité ?

0 votes

Pouvez-vous nous donner plus de détails ? Quelle est la taille de vos images, et de quelle taille avez-vous besoin ?

5 votes

6 votes

imageresizing.net - Cette bibliothèque produit des images de la plus haute qualité que vous pouvez obtenir avec .NET.

221voto

Kris Erickson Points 16204

Comme rcar dit, vous ne pouvez pas sans perdre de la qualité, le mieux que vous pouvez faire en c# est :

Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
    gr.SmoothingMode = SmoothingMode.HighQuality;
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}

3 votes

J'ajouterais que (si possible) l'utilisateur devrait commencer par une image bitmap qui est, disons, deux fois plus grande que ce qu'elle doit être, puis la réduire. L'image résultante devrait être assez lisse.

0 votes

+1 pour la réduction de l'échelle. jamais pour l'augmentation, alors que vous pouvez augmenter l'échelle, même en codant un masque de flou ne vous donnera pas un bon résultat.

0 votes

+1 Merci - c'est incroyablement utile !

32voto

Randy Points 3196

À moins que vous ne fassiez du graphisme vectoriel, il n'y a aucun moyen de redimensionner une image sans perdre potentiellement de sa qualité.

1 votes

À moins que vous ne l'étendiez...

0 votes

Vous pouvez l'étendre sans perdre aucune information, mais il existe différents types de filtres que vous pouvez utiliser et qui donnent des résultats différents - maintien d'ordre zéro, passe-bas, etc.

0 votes

Je peux confirmer, j'ai dramatiquement dit "Amélioration !" à mon ordinateur et ça n'a pas marché.

26voto

ozba Points 1558
private static Image resizeImage(Image imgToResize, Size size)
{
    int sourceWidth = imgToResize.Width;
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)size.Width / (float)sourceWidth);
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);

    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((Image)b);
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();

    return (Image)b;
}

de ici

0 votes

Cela fonctionne, mais donne une qualité identique à la réponse de Kris Erickso. Sympa de voir Size utilisé quand même...

5voto

Ashlocke Points 478

Je crois que ce que vous cherchez à faire est de "redimensionner/rééchantillonner" vos images. Voici un bon site qui donne des instructions et fournit une classe utilitaire (que j'utilise également) :

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

3voto

AaronS Points 4508

Vous ne pouvez pas redimensionner une image sans perdre en qualité, simplement parce que vous réduisez le nombre de pixels.

Ne réduisez pas la taille côté client, car les navigateurs ne font pas un bon travail de redimensionnement des images.

Ce que vous pouvez faire, c'est modifier par programme la taille avant de la rendre, ou lorsqu'un utilisateur la télécharge.

Voici un article qui explique une façon de le faire en c# : http://www.codeproject.com/KB/GDI-plus/imageresize.aspx

0 votes

"Les navigateurs ne font pas un bon travail de redimensionnement des images" - cela aurait pu être vrai en 2008, mais heureusement, nous sommes en avance dans ce domaine aujourd'hui (en grande partie grâce aux anciennes versions d'IE qui disparaissent lentement).

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