Hier ist ein Nudelkratzer.
Denken Sie daran, wir haben HTML5 lokalen Speicher und xhr v2 und was nicht. Ich habe mich gefragt, ob jemand ein funktionierendes Beispiel finden oder mir einfach ein Ja oder Nein für diese Frage geben könnte:
Ist es möglich, die Größe eines Bilds mithilfe des neuen lokalen Speichers (oder was auch immer) vorab zu ändern, sodass ein Benutzer, der keine Ahnung hat, wie die Größe eines Bildes geändert werden kann, sein 10-MB-Bild auf meine Website ziehen kann, um die Größe mithilfe des neuen lokalen Speichers und zu ändern DANN lade es in der kleineren Größe hoch.
Ich weiß genau, dass Sie es mit Flash, Java-Applets, aktivem X tun können ... Die Frage ist, ob Sie es mit Javascript + Html5 tun können.
Ich freue mich auf die Antwort auf diese Frage.
Ta für jetzt.
quelle
onload
auf das Bild warten (Handler vor dem Einstellen anhängensrc
), da der Browser asynchron dekodieren darf und Pixel möglicherweise vorher nicht verfügbar sinddrawImage
.ctx.drawImage()
Ende keine großen Bilder geladen werden .Ich habe dieses Problem vor einigen Jahren angegangen und meine Lösung als https://github.com/rossturner/HTML5-ImageUploader auf github hochgeladen
Die Antwort von robertc verwendet die im Blog-Beitrag von Mozilla Hacks vorgeschlagene Lösung. Ich fand jedoch, dass dies eine wirklich schlechte Bildqualität ergab, wenn die Größe auf einen Maßstab geändert wurde, der nicht 2: 1 (oder ein Vielfaches davon) war. Ich fing an, mit verschiedenen Algorithmen zur Größenänderung von Bildern zu experimentieren, obwohl die meisten ziemlich langsam waren oder auch keine gute Qualität hatten.
Schließlich habe ich eine Lösung gefunden, die meiner Meinung nach schnell ausgeführt werden kann und auch eine ziemlich gute Leistung aufweist - da die Mozilla-Lösung zum Kopieren von einer Leinwand auf eine andere schnell und ohne Verlust der Bildqualität im Verhältnis 2: 1 bei einem Ziel von x funktioniert Pixel breit und y Pixel hoch. Ich verwende diese Methode zur Größenänderung der Leinwand, bis das Bild zwischen x und 2 x und y und 2 y liegt . An dieser Stelle wende ich mich dann der algorithmischen Bildgröße für den letzten "Schritt" der Größenänderung auf die Zielgröße zu. Nachdem ich verschiedene Algorithmen ausprobiert hatte, entschied ich mich für eine bilineare Interpolation aus einem Blog, das nicht mehr online ist, aber über das Internetarchiv zugänglich istHier ist der zutreffende Code:
Dadurch wird ein Bild auf eine Breite von verkleinert
config.maxWidth
, wobei das ursprüngliche Seitenverhältnis beibehalten wird. Zum Zeitpunkt der Entwicklung funktionierte dies auf iPad / iPhone Safari zusätzlich zu den wichtigsten Desktop-Browsern (IE9 +, Firefox, Chrome), sodass ich davon ausgehe, dass es angesichts der breiteren Verbreitung von HTML5 heute noch kompatibel sein wird. Beachten Sie, dass der Aufruf canvas.toDataURL () einen MIME-Typ und eine Bildqualität verwendet, mit denen Sie die Qualität und das Ausgabedateiformat steuern können (möglicherweise anders als die Eingabe, wenn Sie dies wünschen).Der einzige Punkt, der hier nicht behandelt wird, ist die Beibehaltung der Orientierungsinformationen. Ohne Kenntnis dieser Metadaten wird die Größe des Bilds geändert und unverändert gespeichert. Dabei gehen alle Metadaten im Bild zur Orientierung verloren, was bedeutet, dass Bilder, die auf einem Tablet-Gerät "verkehrt herum" aufgenommen wurden als solche gerendert, obwohl sie im Kamerasucher des Geräts umgedreht worden wären. Wenn dies ein Problem darstellt, enthält dieser Blog-Beitrag eine gute Anleitung und Codebeispiele, wie dies erreicht werden kann. Ich bin sicher, dass dies in den obigen Code integriert werden könnte.
quelle
Korrektur nach oben:
quelle
dataurl
nicht da.img.width
undimg.height
zunächst sind sie0
. Sie sollten den Rest der Funktion inimg.addEventListener('load', function () { // now the image has loaded, continue... });
Änderung der Antwort von Justin , die für mich funktioniert:
quelle
Wenn Sie das Rad nicht neu erfinden möchten, können Sie plupload.com ausprobieren
quelle
Typoskript
quelle
Dies wird nicht funktionieren. Auf der PHP-Seite können Sie damit keine Datei speichern.
Verwenden Sie stattdessen diesen Code:
quelle
Das Ändern der Größe von Bildern in einem Canvas-Element ist im Allgemeinen eine schlechte Idee, da die billigste Box-Interpolation verwendet wird. Das resultierende Bild nimmt merklich an Qualität ab. Ich würde empfehlen, http://nodeca.github.io/pica/demo/ zu verwenden, um stattdessen eine Lanczos-Transformation durchzuführen. Die Demo-Seite oben zeigt den Unterschied zwischen Canvas- und Lanczos-Ansätzen.
Außerdem werden Web-Worker verwendet, um die Größe von Bildern parallel zu ändern. Es gibt auch eine WEBGL-Implementierung.
Es gibt einige Online-Bildveränderer, die Pica für die Arbeit verwenden, z. B. https://myimageresizer.com
quelle
Die akzeptierte Antwort funktioniert gut, aber die Größenänderungslogik ignoriert den Fall, in dem das Bild nur in einer der Achsen größer als das Maximum ist (z. B. Höhe> maxHöhe, aber Breite <= maxBreite).
Ich denke, der folgende Code kümmert sich einfacher und funktionaler um alle Fälle (ignorieren Sie die Anmerkungen zum Typoskripttyp, wenn Sie einfaches Javascript verwenden):
quelle
Sie können dropzone.js verwenden, wenn Sie einen einfachen Upload-Manager mit Größenänderung vor dem Hochladen verwenden möchten.
Es verfügt über integrierte Größenänderungsfunktionen, aber Sie können Ihre eigenen bereitstellen, wenn Sie möchten.
quelle