Sie können das Heruntertreten verwenden, um bessere Ergebnisse zu erzielen. Die meisten Browser scheinen beim Ändern der Bildgröße eher eine lineare Interpolation als eine bikubische zu verwenden.
( Update Den Spezifikationen wurde eine Qualitätseigenschaft hinzugefügt, imageSmoothingQuality
die derzeit nur in Chrome verfügbar ist.)
Sofern keine Glättung oder kein nächster Nachbar gewählt wird, interpoliert der Browser das Bild nach dem Herunterskalieren immer, da dies als Tiefpassfilter fungiert, um Aliasing zu vermeiden.
Bi-Linear verwendet 2x2 Pixel für die Interpolation, während Bi-Cubic 4x4 verwendet. Wenn Sie dies in Schritten tun, können Sie dem Bi-Cubic-Ergebnis nahe kommen, während Sie die Bi-Linear-Interpolation verwenden, wie in den resultierenden Bildern gezeigt.
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.onload = function () {
// set size proportional to image
canvas.height = canvas.width * (img.height / img.width);
// step 1 - resize to 50%
var oc = document.createElement('canvas'),
octx = oc.getContext('2d');
oc.width = img.width * 0.5;
oc.height = img.height * 0.5;
octx.drawImage(img, 0, 0, oc.width, oc.height);
// step 2
octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);
// step 3, resize to final size
ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5,
0, 0, canvas.width, canvas.height);
}
img.src = "//i.imgur.com/SHo6Fub.jpg";
<img src="//i.imgur.com/SHo6Fub.jpg" width="300" height="234">
<canvas id="canvas" width=300></canvas>
Abhängig davon, wie drastisch Ihre Größenänderung ist, können Sie Schritt 2 überspringen, wenn der Unterschied geringer ist.
In der Demo können Sie sehen, dass das neue Ergebnis jetzt dem Bildelement sehr ähnlich ist.
Da die Geige von Trung Le Nguyen Nhat überhaupt nicht korrekt ist (sie verwendet nur das Originalbild im letzten Schritt), habe
ich meine eigene allgemeine Geige mit Leistungsvergleich geschrieben:
GEIGE
Im Grunde ist es:
quelle
Ich habe einen wiederverwendbaren Angular-Dienst erstellt, um die Größe von Bildern / Leinwänden in hoher Qualität für alle Interessierten zu ändern : https://gist.github.com/transitive-bullshit/37bac5e741eaec60e983
Der Service umfasst zwei Lösungen, da beide ihre eigenen Vor- und Nachteile haben. Der Lanczos-Faltungsansatz bietet eine höhere Qualität auf Kosten der Langsamkeit, während der schrittweise Downscaling-Ansatz einigermaßen antialiasierte Ergebnisse liefert und erheblich schneller ist.
Anwendungsbeispiel:
quelle
Während einige dieser Code-Schnipsel kurz sind und funktionieren, sind sie nicht trivial zu befolgen und zu verstehen.
Da ich kein Fan von "Kopieren und Einfügen" aus dem Stapelüberlauf bin, möchte ich, dass Entwickler den Code verstehen, den sie in ihre Software übertragen. Ich hoffe, Sie finden das Folgende nützlich.
DEMO : Ändern der Größe von Bildern mit JS und HTML Canvas Demo Fiddler.
Möglicherweise finden Sie drei verschiedene Methoden, um die Größe zu ändern. Diese helfen Ihnen zu verstehen, wie der Code funktioniert und warum.
https://jsfiddle.net/1b68eLdr/93089/
Der vollständige Code der Demo und der TypeScript-Methode, die Sie möglicherweise in Ihrem Code verwenden möchten, finden Sie im GitHub-Projekt.
https://github.com/eyalc4/ts-image-resizer
Dies ist der endgültige Code:
quelle
Ich habe eine Bibliothek erstellt, mit der Sie jeden Prozentsatz reduzieren können, während alle Farbdaten erhalten bleiben.
https://github.com/danschumann/limby-resize/blob/master/lib/canvas_resize.js
Diese Datei können Sie in den Browser aufnehmen. Die Ergebnisse sehen aus wie Photoshop oder Bildmagie, wobei alle Farbdaten erhalten bleiben und Pixel gemittelt werden, anstatt in der Nähe befindliche zu nehmen und andere zu löschen. Es wird keine Formel verwendet, um die Durchschnittswerte zu erraten, sondern der genaue Durchschnitt.
quelle
Basierend auf der K3N-Antwort schreibe ich Code generell für jeden neu
UPDATE JSFIDDLE DEMO
Hier ist meine ONLINE-DEMO
quelle
Ich verstehe nicht, warum niemand vorschlägt
createImageBitmap
.funktioniert wunderbar (vorausgesetzt, Sie legen IDs für Bild und Leinwand fest).
quelle
Ich habe ein kleines js-Dienstprogramm geschrieben, um das Bild im Frontend zuzuschneiden und seine Größe zu ändern. Hier ist der Link zum GitHub-Projekt. Sie können auch Blob vom endgültigen Bild erhalten, um es zu senden.
quelle