50 votes

La mise à l'échelle de l'image provoque une qualité médiocre dans Firefox / Internet Explorer, mais pas le chrome

Voir http://jsfiddle.net/aJ333/1/ en chrome, puis dans firefox ou internet explorer. L'image est à l'origine de 120px, et je me suis mise à l'échelle vers le bas pour 28px, mais il est mauvais assez beaucoup n'importe ce que la mise à l'échelle vers le bas pour.

L'image est au format PNG et il a un canal alpha (transparence).

Voici le code correspondant:

html:
<a href="http://tinypic.com?ref=2z5jbtg" target="_blank">
    <img src="http://i44.tinypic.com/2z5jbtg.png" border="0" alt="Image and video hosting by TinyPic">
</a>​

css:
a {width:28px;height:28px;display:block}
img {max-width:100%;max-height:100%;
    image-rendering: -moz-crisp-edges;
    -ms-interpolation-mode: bicubic
}

L'image de rendu et-ms-interpolation-mode lignes de css ne semble pas faire quoi que ce soit, mais je les ai trouvés en ligne tout en faisant quelques recherches sur le problème.

35voto

mgutt Points 784

Il semble que vous avez raison. Aucune option à l'échelle de l'image à mieux:

http://www.maxrev.de/html/image-scaling.html

J'ai testé FF14, IE9, OP12 et GC21. Seulement GC a une meilleure mise à l'échelle peut être désactivé via image-rendering: -webkit-optimize-contrast. Tous les autres navigateurs n'ont pas ou mauvaise échelle.

Capture d'écran de la sortie différents: http://www.maxrev.de/files/2012/08/screenshot_interpolation_jquery_animate.png

7voto

Fernando Teles Points 79

Une façon de "normaliser" l'apparition, dans les différents navigateurs est à l'aide de votre "côté serveur" pour redimensionner l'image. Un exemple d'utilisation de C# contrôleur:

public ActionResult ResizeImage(string imageUrl, int width)
{
    WebImage wImage = new WebImage(imageUrl);
    wImage = WebImageExtension.Resize(wImage, width);
    return File(wImage.GetBytes(), "image/png");
}

où WebImage est une classe de Système.Web.Les aides.

WebImageExtension est défini ci-dessous:

using System.IO;
using System.Web.Helpers;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Collections.Generic;

public static class WebImageExtension
{
    private static readonly IDictionary<string, ImageFormat> TransparencyFormats =
        new Dictionary<string, ImageFormat>(StringComparer.OrdinalIgnoreCase) { { "png", ImageFormat.Png }, { "gif", ImageFormat.Gif } };

    public static WebImage Resize(this WebImage image, int width)
    {
        double aspectRatio = (double)image.Width / image.Height;
        var height = Convert.ToInt32(width / aspectRatio);

        ImageFormat format;

        if (!TransparencyFormats.TryGetValue(image.ImageFormat.ToLower(), out format))
        {
            return image.Resize(width, height);
        }

        using (Image resizedImage = new Bitmap(width, height))
        {
            using (var source = new Bitmap(new MemoryStream(image.GetBytes())))
            {
                using (Graphics g = Graphics.FromImage(resizedImage))
                {
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.DrawImage(source, 0, 0, width, height);
                }
            }

            using (var ms = new MemoryStream())
            {
                resizedImage.Save(ms, format);
                return new WebImage(ms.ToArray());
            }
        }
    }
}

remarque l'option InterpolationMode.HighQualityBicubic. C'est la méthode utilisée par google Chrome.

Maintenant, vous devez le publier dans une page web. Permet l'utilisation de rasoir:

<img src="@Url.Action("ResizeImage", "Controller", new { urlImage = "<url_image>", width = 35 })" />

Et cela a fonctionné très bien pour moi!

Idéalement sera mieux pour enregistrer l'image au préalable dans différentes largeurs, à l'aide de cet algorithme de redimensionnement, pour éviter que le contrôleur de processus dans chaque chargement de l'image.

(Désolé pour mon mauvais anglais, je suis brésilien...)

4voto

Soviut Points 26384

Vous devez essayer de conserver un rapport hauteur / largeur approprié entre les tailles que vous souhaitez mettre à l’échelle. Par exemple, si votre taille cible est de 28px, votre taille de source devrait être une puissance de celui-ci, telle que 56 (28 x 2) ou 112 (28 x 4). Cela garantit que vous pouvez évoluer à 50% ou 25% au lieu des 0,233333% que vous utilisez actuellement.

4voto

Timothy Armstrong Points 1058

Votre problème est que vous êtes en s'appuyant sur le navigateur de redimensionner vos images. Les navigateurs ont notoirement mauvaise image mise à l'échelle des algorithmes, qui sera la cause de la laide de pixelisation.

Vous devez redimensionner vos images dans un logiciel de graphisme d'abord avant de les utiliser sur la page web.

Aussi, vous avez une faute d'orthographe: il faut dire moz-crisp-bords; toutefois, cela ne vous aidera pas dans votre cas (parce que l'algorithme de redimensionnement ne vais pas vous donner une haute qualité de redimensionnement: https://developer.mozilla.org/En/CSS/Image-rendering)

0voto

Chris Points 5

Semble Chrome downscaling est meilleur, mais la vraie question est pourquoi l'utilisation d'une telle image sur le web si vous utilisez le spectacle est si massivement réduit? Downloadtimes comme on le voit sur la page de test ci-dessus sont terribles. Surtout pour les sites sensibles d'un certain montant de la mise à l'échelle de sens, en fait plus une échelle que l'échelle vers le bas. Mais jamais dans une telle (désolé du jeu de mots) de l'échelle.

Semble que ce soit plus un problème théorique qui Chrome semble traiter avec bien, mais en fait ne devrait pas arriver et en fait ne devrait pas être utilisé dans la pratique, à mon humble avis.

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