El escalado de imágenes causa mala calidad en firefox / internet explorer pero no en chrome


Véase http://jsfiddle.net/aJ333/1 / en Chrome y luego en Firefox o Internet Explorer. La imagen es originalmente 120px, y estoy reduciendo a 28px,pero se ve mal prácticamente no importa a qué escala.

La imagen es PNG y tiene un canal alfa (transparencia).

Aquí está el código relevante:

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;
}

Las líneas image-rendering y -ms-interpolation-mode de CSS no parecían hacer nada, pero las encontré en línea mientras haciendo algunas investigaciones sobre el problema.

Author: Taylor Edmiston, 2012-03-30

10 answers

Parece que tienes razón. Ninguna opción escala mejor la imagen:
http://www.maxrev.de/html/image-scaling.html

He probado FF14, IE9, OP12 y GC21. Solo GC tiene una mejor escala que se puede desactivar a través de image-rendering: -webkit-optimize-contrast. Todos los demás navegadores no tienen escalado / pobre.

Captura de pantalla de la salida diferente: http://www.maxrev.de/files/2012/08/screenshot_interpolation_jquery_animate.png

Actualización 2017

Mientras tanto un poco más los navegadores admiten escalado suave:

  • ME38 (Microsoft Edge) tiene un buen escalado. No se puede desactivar y funciona para JPEG y PNG, pero no para GIF.

  • FF51 (Con respecto al comentario de @karthik desde FF21) tiene un buen escalado que se puede desactivar a través de los siguientes ajustes:

    image-rendering: optimizeQuality
    image-rendering: optimizeSpeed
    image-rendering: -moz-crisp-edges
    

    Nota: Con respecto a MDN el ajuste optimizeQuality es un sinónimo de auto (pero auto no deshabilita el escalado suave):

    Los valores optimizeQuality y optimizeSpeed presente en el borrador inicial (y viniendo de su contraparte SVG) se definen como sinónimos para el valor auto.

  • OP43 se comporta como GC (no sorprendente como es basado en Chromium desde 2013 ) y sigue siendo esta opción que desactiva el escalado suave:

    image-rendering: -webkit-optimize-contrast
    

No hay soporte en IE9-IE11. El ajuste -ms-interpolation-modesolo funcionó en IE6-IE8, pero se eliminó en IE9.

P.d. El escalado suave se realiza por defecto. Esto significa que no image-rendering la opción es necesaria!

 30
Author: mgutt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:44

Respuesta tardía pero esto funciona:

/* applies to GIF and PNG images; avoids blurry edges */
img[src$=".gif"], img[src$=".png"] {
    image-rendering: -moz-crisp-edges;         /* Firefox */
    image-rendering:   -o-crisp-edges;         /* Opera */
    image-rendering: -webkit-optimize-contrast;/* Webkit (non-standard naming) */
    image-rendering: crisp-edges;
    -ms-interpolation-mode: nearest-neighbor;  /* IE (non-standard property) */
}

Https://developer.mozilla.org/en/docs/Web/CSS/image-rendering

Aquí hay otro enlace también que habla sobre el soporte del navegador:

Https://css-tricks.com/almanac/properties/i/image-rendering /

 12
Author: trgraglia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 09:19:26

Una forma de "normalizar" la apariencia en los diferentes navegadores es usar su "lado del servidor" para cambiar el tamaño de la imagen. Un ejemplo usando un controlador C#:

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

Donde WebImage es una clase en System.Web.Ayudante.

WebImageExtension se define a continuación:

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());
            }
        }
    }
}

Tenga en cuenta la opción InterpolationMode.Un Cubic de alta calidad. Este es el método utilizado por Chrome.

Ahora necesita publicar en una página web. Vamos a usar razor:

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

Y esto funcionó muy bien para ¡Yo!

Idealmente será mejor guardar la imagen de antemano en anchuras diferentes, utilizando este algoritmo de cambio de tamaño, para evitar el proceso del controlador en cada carga de imagen.

(Lo siento por mi pobre inglés, soy brasileño...)

 7
Author: Fernando Teles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-21 18:28:23

Su problema es que está confiando en el navegador para cambiar el tamaño de sus imágenes. Los navegadores tienen algoritmos de escalado de imagen notoriamente pobres, lo que causará la pixelización fea.

Primero debe cambiar el tamaño de sus imágenes en un programa de gráficos antes de usarlas en la página web.

Además, tienes un error ortográfico: debería decir moz-crisp-edges; sin embargo, eso no te ayudará en tu caso (porque ese algoritmo de redimensionamiento no te dará un redimensionamiento de alta calidad: https://developer.mozilla.org/En/CSS/Image-rendering )

 4
Author: Timothy Armstrong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-30 15:01:15

Debe tratar de mantener una relación de aspecto adecuada entre los tamaños desde y hacia los que está escalando. Por ejemplo, si su tamaño de destino es 28px, entonces su tamaño de origen debe ser una potencia de esa, como 56 (28 x 2) o 112 (28 x 4). Esto garantiza que pueda escalar un 50% o un 25% en lugar del 0.233333% que está utilizando actualmente.

 4
Author: Soviut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-02 07:01:15

He visto lo mismo en Firefox, css transform scaled png transparente mirando muy áspero.

Me di cuenta de que cuando previamente tenían un color de fondo establecido la calidad era mucho mejor, así que intenté establecer un fondo RGBA con el menor valor de opacidad posible.

background:rgba(255,255,255,0.001);

Esto funcionó para mí, inténtalo.

 1
Author: MarkBaillie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-24 10:01:12

IE Escala Depende de la Cantidad de Downsize

Algunas personas dijeron que una reducción de la fracción uniforme evita el problema. No estoy de acuerdo.

En IE11 encuentro que reducir una imagen en un 50% (por ejemplo, 300px a 150px) produce un cambio de tamaño irregular (como si estuviera usando nearest-neighbor). Un cambio de tamaño a ~99% o 73% (por ejemplo, 300px a 276px) produce una imagen más suave: bilineal o bicúbico, etc.

En respuesta he estado usando imágenes que son solo retina-ish: tal vez un 25% más grande que se usaría en un tradicional pantalla de mapeo de píxeles 1:1, de modo que IE solo cambia el tamaño un poco y no desencadena la fealdad.

 1
Author: David Hoffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 16:42:46

Esto es posible! Al menos ahora que las transformaciones css tienen un buen soporte:

Necesita usar una transformación CSS para escalar la imagen - el truco no es solo usar una escala(), sino también aplicar una rotación muy pequeña. Esto desencadena IE para utilizar una interpolación más suave de la imagen:

img {
    /* double desired size */
    width: 56px; 
    height: 56px;

    /* margins to reduce layout size to match the transformed size */ 
    margin: -14px -14px -14px -14px; 

    /* transform to scale with smooth interpolation: */
    transform: scale(0.5) rotate(0.1deg);
}
 1
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 08:57:24

Parece Chrome downscaling es mejor, pero la verdadera pregunta es por qué utilizar una imagen tan masiva en la web si se utiliza mostrar es tan masivamente reducido? Los tiempos de descarga como se ve en la página de prueba anterior son terribles. Especialmente para los sitios web receptivos, una cierta cantidad de escala tiene sentido, en realidad más una escala hacia arriba que hacia abajo. Pero nunca en tal escala.

Parece que esto es más un problema teórico que Chrome parece tratar muy bien, pero en realidad no debe suceder y en realidad no debe ser utilizado en la práctica en mi Humilde opinión.

 0
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-02 11:26:12

Recuerde que los tamaños en la web están aumentando dramáticamente. hace 3 años, hice una revisión para llevar nuestro diseño de sitio de 500 px a 1000. Ahora, donde muchos sitios están haciendo el salto a 1200, saltamos más allá de eso y fuimos a un máximo de 2560 optimizado para 1600 de ancho (o 80% dependiendo del nivel de contenido) área de contenido principal con capacidad de respuesta para permitir exactamente las mismas proporciones y apariencia en un portátil (1366x768) y en el móvil (1280x720 o más pequeño).

El redimensionamiento dinámico es una parte integral de esto y solo será más-por lo que la capacidad de respuesta se vuelve más y más importante en 2013.

Mi teléfono inteligente no tiene problemas para lidiar con el contenido con 25 elementos en una página que se está redimensionando, ni el cálculo para redimensionar ni el ancho de banda. 3 segundos carga la página desde fresco. Se ve muy bien en nuestro portátil de presentación de 6 años (1366x768) y en el proyector (800x600).

Solo en Mozilla Firefox se ve realmente atroz. Incluso se ve muy bien en IE8 (nunca usado / actualizado desde que lo instalé hace 2.5 años).

 -2
Author: JimmyDee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-19 08:25:23