Подтвердить что ты не робот

Масштабирование изображения приводит к плохому качеству в Firefox/Internet Explorer, но не хрома

Смотрите http://jsfiddle.net/aJ333/1/ в Chrome, а затем в Firefox или Internet Explorer. Изображение первоначально 120px, и я уменьшаю до 28px, но он выглядит неплохо в значительной степени независимо от того, к чему вы его масштабируете.

Изображение представляет собой PNG и имеет альфа-канал (прозрачность).

Вот соответствующий код:

HTML:

<a href="#" onclick="location.href='http://tinypic.com?ref=2z5jbtg'; return false;" 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;
}

Строки image-rendering и -ms-interpolation-mode CSS, похоже, ничего не делали, но я нашел их в Интернете, проводя некоторые исследования проблемы.

4b9b3361

Ответ 1

Кажется, вы правы. Нет опции масштабирует изображение лучше:
http://www.maxrev.de/html/image-scaling.html

Я тестировал FF14, IE9, OP12 и GC21. Только GC имеет лучшее масштабирование, которое можно деактивировать через image-rendering: -webkit-optimize-contrast. У всех других браузеров нет/плохого масштабирования.

Снимок экрана с разным выходом: http://www.maxrev.de/files/2012/08/screenshot_interpolation_jquery_animate.png

Обновление 2017

Между тем некоторые браузеры поддерживают плавное масштабирование:

  • ME38 (Microsoft Edge) имеет хорошее масштабирование. Он не может быть отключен, и он работает для JPEG и PNG, но не для GIF.

  • FF51 (относительно комментария @karthik, поскольку FF21) имеет хорошее масштабирование, которое можно отключить с помощью следующих настроек:

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

    Примечание: Что касается MDN, параметр optimizeQuality является синонимом для auto (но auto не отключает плавное масштабирование):

    Значения optimizeQuality и optimizeSpeed ​​присутствуют в начале проекта (и, исходя из его SVG-аналога), определяются как синонимы для auto value.

  • OP43 ведет себя как GC (не удивляет, так как это на основе Chromium с 2013 года) и его по-прежнему этот параметр, который отключает плавное масштабирование

    image-rendering: -webkit-optimize-contrast
    

Нет поддержки в IE9-IE11. Параметр -ms-interpolation-mode работал только в IE6-IE8, но был удален в IE9.

P.S. По умолчанию выполняется плавное масштабирование. Это означает, что не требуется опция image-rendering!

Ответ 2

Поздний ответ, но это работает:

/* 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

Вот еще одна ссылка, которая рассказывает о поддержке браузера:

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

Ответ 3

Один из способов "нормализации" внешнего вида в разных браузерах - использовать "серверную сторону" для изменения размера изображения. Пример с использованием контроллера С#:

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

где WebImage является классом в System.Web.Helpers.

WebImageExtension определяется ниже:

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

Обратите внимание на опцию InterpolationMode.HighQualityBicubic. Это метод, используемый Chrome.

Теперь вам нужно опубликовать его на веб-странице. Давайте используем бритву:

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

И это сработало очень хорошо для меня!

В идеале лучше сохранить изображение заранее в разной ширине, используя этот алгоритм изменения размера, чтобы избежать процесса контроллера при каждой загрузке изображения.

(Извините за мой бедный английский, я бразильский...)

Ответ 4

Ваша проблема заключается в том, что вы полагаетесь на браузер, чтобы изменять размеры ваших изображений. У браузеров есть слабые алгоритмы масштабирования изображения, которые вызовут уродливую пикселизацию.

Сначала вы должны изменить размер изображений в графической программе, прежде чем использовать их на веб-странице.

Кроме того, у вас есть орфографическая ошибка: она должна сказать moz-crisp-edge; однако это не поможет вам в вашем случае (поскольку этот алгоритм изменения размера не даст вам высокого качества: https://developer.mozilla.org/En/CSS/Image-rendering)

Ответ 5

Вам следует попытаться поддерживать правильное соотношение сторон между размерами, от которых вы масштабируетесь. Например, если ваш целевой размер равен 28px, тогда ваш размер источника должен быть такой, как 56 (28 x 2) или 112 (28 x 4). Это гарантирует, что вы можете масштабировать на 50% или 25%, а не 0.233333%, которые вы сейчас используете.

Ответ 6

Я видел то же самое в firefox, css transform scaled transparent png выглядит очень грубо.

Я заметил, что когда раньше у них был цвет фона, качество было намного лучше, поэтому я попытался установить фон RGBA с минимальным значением непрозрачности, насколько это возможно.

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

Это сработало для меня, попробуйте.

Ответ 7

Масштабирование IE зависит от количества уменьшенных размеров

Некоторые люди сказали, что сокращение доли даже позволяет избежать проблемы. Я не согласен.

В IE11 я обнаружил, что уменьшение изображения на 50% (например, от 300 пикселей до 150 пикселей) дает неровное изменение размера (например, с использованием ближайшего соседа). Изменение размера до ~ 99% или 73% (например, от 300 до 276 пикселей) дает более гладкое изображение: билинейное или бикубическое и т.д.

В ответ я использую изображения, которые являются только сетчаткой: возможно, на 25% больше, чем на традиционном экране отображения 1:1 пикселей, так что IE только немного изменяет размер и не вызывает уродства,

Ответ 8

Это возможно! По крайней мере, теперь, когда css-преобразования имеют хорошую поддержку:

Вам нужно использовать CSS-преобразование для масштабирования изображения - трюк заключается не только в использовании scale(), но и в применении очень небольшого вращения. Это заставляет IE использовать более плавную интерполяцию изображения:

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

Ответ 9

Кажется, что уменьшение масштаба Chrome лучше, но реальный вопрос заключается в том, почему использование такого массивного изображения в Интернете, если вы используете шоу, настолько массово уменьшено? Downloadtimes, как видно на тестовой странице выше, ужасны. Особенно для чувствительных веб-сайтов определенная степень масштабирования имеет смысл, на самом деле больше масштаб, чем масштабирование. Но никогда в такой шкале (извините).

Похоже, это более теоретическая проблема, с которой Chrome, похоже, хорошо справляется, но на самом деле этого не должно происходить и на самом деле не следует использовать на практике IMHO.

Ответ 10

Помните, что размеры в Интернете резко возрастают. 3 года назад я провела капитальный ремонт, чтобы обеспечить максимальный размер сайта размером 500 пикселей до 1000. Теперь, когда многие сайты совершают прыжок до 1200, мы прыгали мимо этого и переходили на максимальный максимум 2560 для 1600 широкоформатных (или 80% в зависимости от на уровне контента), в основном, с учетом способности реагировать на точные отношения и внешний вид на ноутбуке (1366x768) и на мобильных устройствах (1280x720 или меньше).

Динамическое изменение размера является неотъемлемой частью этого и будет только больше, так как отзывчивость становится все более важной в 2013 году.

У моего смартфона нет проблем с контентом с 25 элементами на изменяемой странице - ни для расчета для изменения размера, ни для полосы пропускания. 3 секунды загружает страницу из свежей. Выглядит отлично на нашем 6-летнем ноутбуке (1366x768) и на проекторе (800x600).

Только в Mozilla Firefox это выглядит действительно ужасно. Он даже выглядит просто на IE8 (никогда не использовался/обновлялся с тех пор, как я установил его 2,5 года назад).