Фотографии с цифровых камер часто сохраняются в формате JPEG с тегом «ориентации» EXIF. Для правильного отображения изображения необходимо поворачивать / отражать в зависимости от установленной ориентации, но браузеры игнорируют эту информацию, отображающую изображение. Даже в крупных коммерческих веб-приложениях поддержка ориентации EXIF может быть неочевидной 1 . Тот же источник также предоставляет хорошее резюме 8 различных ориентаций, которые может иметь JPEG:
Образцы изображений доступны на 4 .
Вопрос в том, как повернуть / отразить изображение на стороне клиента, чтобы оно отображалось правильно и могло быть обработано при необходимости?
Для анализа EXIF-данных доступны библиотеки JS, в том числе атрибут ориентации 2 . Flickr отметил возможную проблему с производительностью при разборе больших изображений, требующую использования веб-работников 3 .
Консольные инструменты могут правильно переориентировать изображения 5 . Сценарий PHP, решающий проблему, доступен на 6
источник
canvas.toDataURL()
декодировать и сохранять их на стороне сервера.<img>
тег?Контекстное преобразование Медера работает отлично. Если вам нужно извлечь ориентацию, используйте только эту функцию - вам не нужны никакие библиотеки для чтения EXIF. Ниже приведена функция для переустановки ориентации в изображении base64. Вот скрипка для этого . Я также подготовил скрипку с демонстрацией извлечения ориентации .
источник
switch
не требуется, так как это преобразование ничего не делает. Кроме того, рассмотрите возможность использованияsrcOrientation > 4 && srcOrientation < 9
вместо[5,6,7,8].indexOf(srcOrientation) > -1
, потому что это быстрее и менее ресурсоемким (как ОЗУ и ЦП). Там нет необходимости иметь массив там. Это важно при пакетировании большого количества изображений, где каждый бит считается. В остальном довольно неплохой ответ. Upvoted!indexOf
быть то, что вы предложили. Я запустил простой цикл с 10M итерациями, и он был на 1400% быстрее. Приятно: D Спасибо большое!getOrientation
мне интересно, насколько это эффективно с точки зрения производительности.getOrientation
звонкиfileReader.readAsArrayBuffer
, а затем мы вызываемURL.createObjectURL
и передаем результат вresetOrientation
, который загружает этот URL-адрес как изображение. Означает ли это, что файл изображения будет «загружен» / прочитан браузером не один, а два раза, или я неправильно понял?image-orientation: from-image
когда он используется.Если
Затем вы можете использовать эти преобразования, чтобы превратить изображение в ориентацию 1
Из ориентации:
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);
Перед нанесением изображения на ctx
источник
Хорошо, в дополнение к ответу @ user3096626, я думаю, будет более полезно, если кто-то предоставит пример кода, следующий пример покажет вам, как исправить ориентацию изображения, полученную из URL (удаленные изображения):
Решение 1: использование JavaScript (рекомендуется)
поскольку библиотека load-image не извлекает теги exif только из изображений url (file / blob), мы будем использовать библиотеки javascript exif-js и load-image , поэтому сначала добавьте эти библиотеки на свою страницу следующим образом:
Обратите внимание, что версия 2.2 exif-js кажется имеет проблемы, поэтому мы использовали 2.1
тогда в основном то, что мы будем делать, это
а - загрузить изображение с помощью
window.loadImage()
b - читать теги exif, используя
window.EXIF.getData()
c - преобразовать изображение в холст и исправить ориентацию изображения, используя
window.loadImage.scale()
d - поместить холст в документ
Ну вот :)
конечно, вы также можете получить изображение как base64 из объекта canvas и поместить его в атрибут img src, так что вы можете использовать jQuery;)
вот полный код на: github: https://github.com/digital-flowers/loadimage-exif-example
Решение 2: использование HTML (взлом браузера)
есть очень быстрый и легкий способ взлома, большинство браузеров отображают изображение в правильной ориентации, если изображение открывается внутри новой вкладки напрямую без HTML (LOL, я не знаю почему), поэтому в основном вы можете отображать свое изображение с помощью iframe поместив атрибут iframe src в качестве URL изображения:
Решение 3: использование CSS (только Firefox и Safari на IOS)
есть атрибут css3 для исправления ориентации изображения, но проблема, с которой он работает только в firefox и safari / ios, все же стоит упомянуть, потому что скоро он будет доступен для всех браузеров (информация о поддержке браузера из caniuse )
источник
Для тех, у кого есть файл из элемента управления вводом, не знают, какова его ориентация, немного ленивы и не хотят включать большую библиотеку ниже, это код, предоставленный @WunderBart, объединенный с ответом, на который он ссылается ( https://stackoverflow.com/a/32490603 ), который находит ориентацию.
который можно легко назвать таким
источник
image/jpeg
вместо значения по умолчаниюimage/png
и изменение размера выходного изображения до максимальной ширины (в моем случае 400 пикселей) имели огромное значение. (это хорошо работает для миниатюр, но если вам нужно отобразить полное изображение, я бы рекомендовал избегать base64 и просто вставлять элемент canvas прямо в страницу ...)Ответ WunderBart был лучшим для меня. Обратите внимание, что вы можете значительно ускорить его, если ваши изображения часто бывают правильными, просто проверяя ориентацию в первую очередь и обходя остальную часть кода, если вращение не требуется.
Собираем всю информацию из вундербарта, что-то вроде этого;
источник
-2
и-1
возврата из,getOrientation
чтобы не пытаться вращать не-jpgs или изображения без данных поворота.file.slice()
оптимизацию, но реальное преимущество дает использование меньших изображений иimage/jpeg
выходного формата для создания меньших URL-адресов данных. (нет заметной задержки даже для 10-мегапиксельных изображений.)file.slice()
, как вы предотвратите поддержку источников изображений base64.Один лайнер кто-нибудь?
Я не видел, чтобы кто-нибудь упоминал
browser-image-compression
библиотеку . У него есть вспомогательная функция, идеально подходящая для этого.Использование:
const orientation = await imageCompression.getExifOrientation(file)
Такой полезный инструмент и во многих других отношениях.
источник
File
объекты, насколько я знаю. Следующим лучшим вариантом будет отправить изображение и ориентацию на сервер и выполнить там манипулирование файлами. Или вы можете создать строку base64 , используяcanvas
иtoDataURL
метод.Я создал класс в модуле ES6, который решает именно это.
Это 103 строки, без зависимостей, и довольно хорошо структурированные и документированные, которые легко модифицировать / использовать повторно.
Обрабатывает все 8 возможных ориентаций и основан на обещаниях.
Вот, пожалуйста, надеюсь, это кому-то еще поможет: https://gist.github.com/vdavid/3f9b66b60f52204317a4cc0e77097913
источник
Я использую смешанный раствор (php + css).
Контейнеры необходимы для:
div.imgCont2
контейнер необходимо вращать;div.imgCont1
контейнер, необходимый для zoomOut -width:150%
;div.imgCont
Контейнер необходим для полос прокрутки, когда изображение является zoomOut.,
источник
В дополнение к ответу @fareed namrouti,
Это следует использовать, если изображение нужно просматривать из элемента ввода файла
источник
Я написал небольшой скрипт php, который вращает изображение. Обязательно сохраняйте изображение в пользу, просто пересчитывайте его при каждом запросе.
ура
источник