Digitalkamera-Fotos werden häufig als JPEG mit einem EXIF-Tag "Orientierung" gespeichert. Um korrekt angezeigt zu werden, müssen Bilder je nach eingestellter Ausrichtung gedreht / gespiegelt werden. Browser ignorieren diese Informationen jedoch, um das Bild zu rendern. Selbst in großen kommerziellen Web-Apps kann die Unterstützung für die EXIF-Ausrichtung nur sporadisch sein 1 . Dieselbe Quelle bietet auch eine schöne Zusammenfassung der 8 verschiedenen Ausrichtungen, die ein JPEG haben kann:
Beispielbilder sind unter 4 verfügbar .
Die Frage ist, wie das Bild auf der Clientseite gedreht / gespiegelt werden kann, damit es korrekt angezeigt wird und bei Bedarf weiterverarbeitet werden kann.
Zum Parsen von EXIF-Daten stehen JS-Bibliotheken zur Verfügung, einschließlich des Orientierungsattributs 2 . Flickr stellte ein mögliches Leistungsproblem beim Parsen großer Bilder fest, für das Webworker erforderlich sind 3 .
Konsolenwerkzeuge können die Bilder korrekt neu ausrichten 5 . Ein PHP-Skript zur Lösung des Problems finden Sie unter 6
quelle
canvas.toDataURL()
und diese serverseitig dekodieren und speichern.<img>
Tag ansprechend zu gestalten ?Mederrs Kontexttransformation funktioniert perfekt. Wenn Sie die Orientierung extrahieren müssen, verwenden Sie nur diese Funktion - Sie benötigen keine EXIF-Lesebibliotheken. Unten finden Sie eine Funktion zum Zurücksetzen der Ausrichtung im base64-Bild. Hier ist eine Geige dafür . Ich habe auch eine Geige mit Orientierungs-Extraktions-Demo vorbereitet .
quelle
switch
wird nicht benötigt, da diese Transformation nichts bewirkt. Ziehen Sie auch die Verwendung vonsrcOrientation > 4 && srcOrientation < 9
anstelle von in Betracht[5,6,7,8].indexOf(srcOrientation) > -1
, da diese schneller und weniger ressourcenintensiv ist (sowohl RAM als auch CPU). Es ist nicht erforderlich, dort ein Array zu haben. Dies ist wichtig, wenn viele Bilder gestapelt werden, wobei jedes Bit zählt. Ansonsten ziemlich gute Antwort. Upvoted!indexOf
, was Sie vorgeschlagen haben. Ich habe eine einfache Schleife mit 10 Millionen Iterationen ausgeführt und sie war 1400% schneller. Schön: D Vielen Dank!getOrientation
bin ich gespannt, ob dies in Bezug auf die Leistung effizient ist.getOrientation
ruft auffileReader.readAsArrayBuffer
, und dann rufen wir aufURL.createObjectURL
und übergeben das ErgebnisresetOrientation
, wodurch diese URL als Bild geladen wird. Bedeutet dies, dass die Bilddatei nicht nur einmal, sondern zweimal vom Browser "geladen" / gelesen wird, oder verstehe ich das falsch?image-orientation: from-image
wenn es verwendet wird.Wenn
Mit diesen Transformationen können Sie das Bild dann auf Ausrichtung 1 drehen
Aus der Orientierung:
ctx.transform(1, 0, 0, 1, 0, 0);
ctx.transform(-1, 0, 0, 1, width, 0);
ctx.transform(-1, 0, 0, -1, width, height);
ctx.transform(1, 0, 0, -1, 0, height);
ctx.transform(0, 1, 1, 0, 0, 0);
ctx.transform(0, 1, -1, 0, height, 0);
ctx.transform(0, -1, -1, 0, height, width);
ctx.transform(0, -1, 1, 0, 0, width);
Vor dem Zeichnen des Bildes auf ctx
quelle
ok zusätzlich zu @ user3096626 Antwort Ich denke, es ist hilfreicher, wenn jemand ein Codebeispiel zur Verfügung stellt. Das folgende Beispiel zeigt Ihnen, wie die Bildorientierung von der URL (Remote-Bilder) korrigiert wird:
Lösung 1: Verwenden von Javascript (empfohlen)
da Last-Bild Bibliothek EXIF - Tags aus url Bildern nur (Datei- / Blob) nicht extrahiert, werden wir beide verwenden Exif-js und Last-Bild Javascript - Bibliotheken, so zuerst diese Bibliotheken als folgen zu Ihrer Seite hinzufügen:
Beachten Sie, dass die Version 2.2 von exif-js Probleme zu haben scheint, also haben wir 2.1 verwendet
dann werden wir im Grunde genommen tun
a - Laden Sie das Bild mit
window.loadImage()
b - Exif-Tags mit lesen
window.EXIF.getData()
c - Konvertieren Sie das Bild in Leinwand und korrigieren Sie die Bildausrichtung mit
window.loadImage.scale()
d - Platzieren Sie die Leinwand im Dokument
Bitte schön :)
Natürlich können Sie das Bild auch als base64 vom Canvas-Objekt abrufen und in das Attribut img src einfügen, sodass Sie dies mit jQuery tun können;)
Hier ist der vollständige Code unter: github: https://github.com/digital-flowers/loadimage-exif-example
Lösung 2: Verwenden von HTML (Browser-Hack)
Es gibt einen sehr schnellen und einfachen Hack. Die meisten Browser zeigen das Bild in der richtigen Ausrichtung an, wenn das Bild in einem neuen Tab direkt ohne HTML geöffnet wird (LOL, ich weiß nicht warum). Sie können Ihr Bild also grundsätzlich mit iframe anzeigen indem Sie das iframe src-Attribut direkt als Bild-URL einfügen:
Lösung 3: Verwenden von CSS (nur Firefox & Safari auf iOS)
Es gibt ein CSS3-Attribut zum Korrigieren der Bildausrichtung, aber das Problem, dass es nur auf Firefox und Safari / iOS funktioniert, ist immer noch erwähnenswert, da es bald für alle Browser verfügbar sein wird (Browser-Support-Informationen von caniuse ).
quelle
Für diejenigen, die eine Datei von einem Eingabesteuerelement haben, nicht wissen, wie sie ausgerichtet ist, etwas faul sind und keine große Bibliothek hinzufügen möchten, ist der von @WunderBart bereitgestellte Code mit der Antwort verschmolzen, auf die er verweist ( https://stackoverflow.com/a/32490603 ), der die Ausrichtung findet.
was leicht so genannt werden kann
quelle
image/jpeg
anstelle der Standardeinstellungimage/png
und die Größenänderung des Ausgabebilds auf eine maximale Breite (in meinem Fall 400 Pixel) machten einen großen Unterschied. (Dies funktioniert gut für Miniaturansichten, aber wenn Sie das vollständige Bild anzeigen müssen, würde ich empfehlen, base64 zu vermeiden und einfach das Canvas-Element direkt in die SeiteWunderBarts Antwort war die beste für mich. Beachten Sie, dass Sie es erheblich beschleunigen können, wenn Ihre Bilder häufig richtig herum sind, indem Sie einfach zuerst die Ausrichtung testen und den Rest des Codes umgehen, wenn keine Drehung erforderlich ist.
Alle Informationen von wunderbart zusammenstellen, so etwas;
quelle
-2
und-1
von zurückzukehren,getOrientation
damit Sie nicht versuchen, Nicht-JPGs oder Bilder ohne Rotationsdaten zu drehen.file.slice()
Optimierung hinzugefügt , aber der eigentliche Schub liegt in der Verwendung kleinerer Bilder und desimage/jpeg
Ausgabeformats zum Erstellen kleinerer Daten-URLs. (Selbst bei 10-Megapixel-Bildern ist keine Verzögerung erkennbar.)file.slice()
, da Sie die Unterstützung von base64-Bildquellen verhindern.Ein Liner jemand?
Ich habe niemanden gesehen, der die
browser-image-compression
Bibliothek erwähnt hat . Es hat eine Helferfunktion, die perfekt dafür ist.Verwendung:
const orientation = await imageCompression.getExifOrientation(file)
Solch ein nützliches Werkzeug auch auf viele andere Arten.
quelle
File
Soweit ich weiß, können Sie keine Objekte erstellen . Das nächstbeste wäre, das Bild und die Ausrichtung an den Server zu senden und dort die Datei zu bearbeiten. Oder Sie können mitcanvas
und dietoDataURL
Methode einen base64-String generieren .Ich habe eine Klasse erstellt, die in ein ES6-Modul eingebunden ist, das genau dieses Problem löst.
Es besteht aus 103 Zeilen, keine Abhängigkeiten und ist recht gut strukturiert und dokumentiert. Es soll einfach zu ändern / wiederzuverwenden sein.
Behandelt alle 8 möglichen Ausrichtungen und basiert auf Versprechen.
Ich hoffe, das hilft noch jemandem: https://gist.github.com/vdavid/3f9b66b60f52204317a4cc0e77097913
quelle
Ich benutze gemischte Lösung (PHP + CSS).
Container werden benötigt für:
div.imgCont2
Behälter zum Drehen benötigt;div.imgCont1
Container zum Zoomen benötigt -width:150%
;div.imgCont
Container, der für Bildlaufleisten benötigt wird, wenn das Bild zoomOut ist..
quelle
Zusätzlich zu der Antwort von @fareed namrouti
Dies sollte verwendet werden, wenn das Bild von einem Dateieingabeelement aus durchsucht werden muss
quelle
Ich habe ein kleines PHP-Skript geschrieben, das das Bild dreht. Stellen Sie sicher, dass Sie das Bild speichern, um es bei jeder Anforderung neu zu berechnen.
Prost
quelle