Bildskalierung verursacht schlechte Qualität in Firefox/Internet Explorer, aber nicht in Chrome
Lesezeit: 7 Minuten
Andreas Rasmussen
Sehen http://jsfiddle.net/aJ333/1/ in Chrome und dann entweder in Firefox oder Internet Explorer. Das Bild ist ursprünglich 120 Pixel groß und ich verkleinere es auf 28 Pixel, aber es sieht ziemlich schlecht aus, egal auf was Sie es verkleinern.
Das Bild ist ein PNG und hat einen Alphakanal (Transparenz).
Hier ist der entsprechende Code:
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>
Der image-rendering und -ms-interpolation-mode CSS-Zeilen schienen nichts zu bewirken, aber ich fand sie online, als ich etwas über das Problem recherchierte.
Ich habe FF14, IE9, OP12 und GC21 getestet. Nur GC hat eine bessere Skalierung, die sich durch deaktivieren lässt image-rendering: -webkit-optimize-contrast. Alle anderen Browser haben keine/schlechte Skalierung.
Notiz: Apropos MDN das optimizeQuality Einstellung ist ein Synonym für auto (aber auto deaktiviert nicht die glatte Skalierung):
Die Werte optimizeQuality und optimizeSpeed, die im frühen Entwurf vorhanden sind (und von ihrem SVG-Gegenstück stammen), sind als Synonyme für den Wert auto definiert.
OP43 verhält sich wie GC (auch wenn es nicht überraschend ist basierend auf Chromium seit 2013) und es ist immer noch diese Option, die die glatte Skalierung deaktiviert:
image-rendering: -webkit-optimize-contrast
Keine Unterstützung in IE9-IE11. Der -ms-interpolation-mode Einstellung funktionierte nur in IE6-IE8, wurde aber in IE9 entfernt.
PS Glatte Skalierung erfolgt standardmäßig. Das bedeutet nein image-rendering Option ist erforderlich!
bestätigt in IE10 sicher, obwohl Google Chrome tut glätten die verkleinerten bilder bei mir in der neusten version. Alle Browser sollten dies tun. So frustrierend!
– Jeff Atwood
2. Februar 13 um 6:07 Uhr
Ich habe es in FF3.6 getestet und beide (JPG+PNG) sehen genauso gut aus wie in der aktuellen Version von Chrome (29) ohne CSS-Option. Können Sie erklären, warum Skalierung schlecht sein sollte?
– F. Lekschas
11. September 13 um 23:38 Uhr
@FLekschas Ich habe alle Browser erneut getestet und Firefox unterstützt jetzt eine gute Skalierung. Auch Microsoft Edge.
– mgutt
2. März 17 um 12:01 Uhr
Was ist die Auflösung dafür, erstellen Sie eine Version der PNG-Datei, die 28 Pixel groß ist, damit sie nicht im Ankerelement skaliert werden muss?
Das Problem mit dieser Lösung ist, dass sie zuvor in anderen Browsern gut aussah und dann sehen sie alle Müll aus.
– Antony D’Andrea
6. Februar 17 um 10:52 Uhr
Fernando Teles
Eine Möglichkeit, das Erscheinungsbild in den verschiedenen Browsern zu “normalisieren”, besteht darin, die Größe des Bildes “serverseitig” zu ändern. Ein Beispiel mit einem C#-Controller:
public ActionResult ResizeImage(string imageUrl, int width)
{
WebImage wImage = new WebImage(imageUrl);
wImage = WebImageExtension.Resize(wImage, width);
return File(wImage.GetBytes(), "image/png");
}
wobei WebImage eine Klasse in System.Web.Helpers ist.
WebImageExtension ist unten definiert:
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());
}
}
}
}
Beachten Sie die Option InterpolationMode.HighQualityBicubic. Dies ist die von Chrome verwendete Methode.
Jetzt müssen Sie auf einer Webseite veröffentlichen. Lass uns Rasiermesser benutzen:
Idealerweise ist es besser, das Bild vorher in verschiedenen Breiten zu speichern, indem Sie diesen Größenänderungsalgorithmus verwenden, um den Controller-Prozess bei jedem Bildladen zu vermeiden.
(Sorry für mein schlechtes Englisch, ich bin Brasilianer…)
Wo ist using System.Web.Helpers; Es erzeugt einen Fehler. Müssen wir dafür eine Bibliothek herunterladen?
– Lernen
11. September 13 um 6:07 Uhr
Dies ist kein Fix für das Browser-Rendering. Es ist eine Lösung unter einer Unmenge, die die Größe des Bildes auf dem Server ändern kann.
– LessQuesar
2. Februar 15 um 13:55 Uhr
Downsampling verschlimmert das Problem nur, der Punkt ist, ein großes Bild zu verwenden und den Browser dann auf Subpixel-Auflösungen herunterzuskalieren, um Pixelbildung zu verhindern, aber Browser scheinen dies nicht richtig zu tun.
– Benutzer3338098
20. August 2015 um 22:00 Uhr
Ich frage mich, wie machbar es wäre, dies zu tun und dann eine Funktion auf dem Client zu haben, die zum Server zurückkehrt, um all dies erneut zu tun, wenn er denkt, dass die Größe des Bildes geändert werden könnte. Derzeit (2017) wird dies nur im Internet Explorer benötigt, aber immer noch.
– trysis
20. Juni 17 um 16:15 Uhr
Ihr Problem ist, dass Sie sich auf den Browser verlassen, um die Größe Ihrer Bilder zu ändern. Browser haben notorisch schlechte Bildskalierungsalgorithmen, die die hässliche Pixelisierung verursachen.
Sie sollten Ihre Bilder zuerst in einem Grafikprogramm skalieren, bevor Sie sie auf der Webseite verwenden.
Außerdem haben Sie einen Rechtschreibfehler: Es sollte moz-crisp-edges heißen; Das wird Ihnen jedoch in Ihrem Fall nicht helfen (weil dieser Größenänderungsalgorithmus Ihnen keine qualitativ hochwertige Größenänderung liefert: https://developer.mozilla.org/En/CSS/Image-rendering)
Sie sollten versuchen, ein korrektes Seitenverhältnis zwischen den Größen beizubehalten, von und zu denen Sie skalieren. Wenn Ihre Zielgröße beispielsweise 28 Pixel beträgt, sollte Ihre Quellgröße eine Potenz davon sein, z. B. 56 (28 x 2) oder 112 (28 x 4). Dadurch wird sichergestellt, dass Sie um 50 % oder 25 % statt um die derzeit verwendeten 0,233333 % skalieren können.
Ein guter Punkt, wenn dies möglich ist, aber einige Benutzer werden in großen Benutzeranwendungsfällen seltsame Proportionen hochladen
– gdibble
4. März 15 um 19:39 Uhr
MarkBaillie
Ich habe dasselbe in Firefox gesehen, CSS-Transformationsskalierte transparente PNGs, die sehr rau aussehen.
Mir ist aufgefallen, dass die Qualität viel besser war, wenn sie zuvor eine Hintergrundfarbe eingestellt hatten, also habe ich versucht, einen RGBA-Hintergrund mit einem möglichst niedrigen Deckkraftwert einzustellen.
background:rgba(255,255,255,0.001);
Das hat bei mir funktioniert, probier es aus.
Ein guter Punkt, wenn dies möglich ist, aber einige Benutzer werden in großen Benutzeranwendungsfällen seltsame Proportionen hochladen
– gdibble
4. März 15 um 19:39 Uhr
David Hoffmann
IE-Skalierung hängt von der Größe der Verkleinerung ab
Einige Leute sagten, dass eine Verkleinerung um einen Bruchteil das Problem vermeidet. Ich bin nicht einverstanden.
In IE11 finde ich, dass das Reduzieren eines Bildes um 50% (z. B. 300px auf 150px) zu einer gezackten Größenänderung führt (als würde der nächste Nachbar verwendet). Eine Größenänderung auf ~99 % oder 73 % (z. B. 300 Pixel auf 276 Pixel) ergibt ein glatteres Bild: bilinear oder bikubisch usw.
Als Reaktion darauf habe ich Bilder verwendet, die nur Retina-ähnlich sind: vielleicht 25 % größer als auf einem herkömmlichen 1:1-Pixel-Mapping-Bildschirm, sodass der IE die Größe nur ein wenig ändert und nicht die Hässlichkeit auslöst.
.
7574400cookie-checkBildskalierung verursacht schlechte Qualität in Firefox/Internet Explorer, aber nicht in Chromeyes
Ich habe das letzte FF Nightly bekommen und festgestellt, dass das Rendering so gut wie Chrome ist. Hier ein Screenshot von FF18 (neuester Stall) & FF21 (spätestens jede Nacht)
– kart
2. Februar 13 um 6:28 Uhr