Тег img отображает неправильную ориентацию


145

У меня есть изображение по этой ссылке: http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg

Как видите, это нормальное изображение с правильной ориентацией. Однако, когда я устанавливаю эту ссылку на атрибут src моего тега изображения, изображение становится перевернутым. http://jsfiddle.net/7j5xJ/

<img src="http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg" width="200"/>

Вы хоть понимаете, что происходит?


В firefox в обоих случаях он перевернут. Я думаю, что Chrome достаточно умен, чтобы автоматически вращать его на основе информации EXIF.
— dfsq 09

Хм действительно? В моем firefox оригинал все еще нормальный, а изображение в img перевернуто.
— Ленивый журнал

1
Я думаю, что само изображение перевернуто и cloudfrontможет вращаться на странице. Вы можете принудительно выполнить поворот через CSS jsfiddle.net/7j5xJ/1
— Кевин Линч

2
regex.info/... Он имеет Orientation: Rotate 180в EXIF.
— dfsq 09

1
Это проблема с метаданными фотографии, которые определяют ориентацию. Я не знаю, почему тег изображения не учитывает это. Я еще не нашел хороших ответов ...
— Чет

Ответы:


93

Я нашел часть решения. Теперь у изображений есть метаданные, которые определяют ориентацию фотографии. Есть новая спецификация CSS дляimage-orientation .

Просто добавьте это в свой CSS:

img {
    image-orientation: from-image;
}

Согласно спецификации от 25 января 2016 года, Firefox и iOS Safari (за префиксом) являются единственными браузерами, которые поддерживают это. Я все еще вижу проблемы с Safari и Chrome. Однако мобильный Safari, похоже, изначально поддерживает ориентацию без тега CSS.

Полагаю, нам придется подождать и посмотреть, начнут ли браузеры поддерживать image-orientation.


3
Как ни странно, браузеры, которые я тестировал (Safari, Chrome и Firefox на Mac в их последних воплощениях), правильно обрабатывают флаг, когда изображение отображается напрямую без какого-либо HTML-кода вокруг него.
— anw 08

2
Осторожно с этим, так как это экспериментально. Проверьте совместимость браузера, он не подходит для большинства браузеров. Надеюсь, они когда-нибудь разберутся с этим.
— lostintranslation

36
Это несовместимо с большинством современных браузеров caniuse.com/#search=image-orientation
— Gabriel C

2
Почему вообще у изображений есть метаданные ориентации? Если бы вы действительно хотели повернуть изображение, разве вы не могли бы просто переместить пиксели и поменять ширину на высоту?
— Джек Гиффин,

16
Откуда столько голосов? Он крайне не поддерживается и не работает ни с чем, кроме firefox caniuse.com/#search=image-orientation
— Друг

27

Ваше изображение на самом деле перевернуто. Но у него есть метаатрибут «Ориентация», который сообщает зрителю, что он должен быть повернут на 180 градусов. Некоторые устройства / зрители не соблюдают это правило.

Откройте его в Chrome: вверх ногами Откройте в FF: прямо вверх Откройте в IE: вверх ногами

Откройте его в Paint: вверх ногами. Откройте его в Photoshop: прямо вверх. и т.п.


1
Вы знаете, как мы можем предотвратить это, прежде чем пользователь загрузит изображение? Поскольку это изображение загружено непосредственно пользователем, мне нужно найти способ преодолеть это
— Ленивый журнал

Если это для службы, которая будет размещать изображения, вам все равно лучше перекодировать изображения из соображений размера, размера и безопасности, чтобы это могло исправить их в перекодированной версии.
— i-CONICA

Понимаю. Мне нужно будет найти лучший способ справиться с этим. Возможно, мне нужно обработать изображение после того, как оно было загружено на S3
— The Lazy Log

Вы можете использовать библиотеку GD в PHP.
— i-CONICA

5
Более простой способ - удалить метаданные ориентации и перевернуть изображение. Imagemagick предоставляет функцию convert -autoorient, которая сделает это.
— saurabheights 09

19

Если у вас есть доступ к Linux, откройте терминал, перейдите в каталог, содержащий ваши изображения, а затем запустите

mogrify -auto-orient *

Это должно навсегда исправить проблемы с ориентацией на всех изображениях.


4
Это сработало для меня, вам может потребоваться запустить brew install imagemagickна Mac, если у вас естьcommand not found: mogrify
— Кайл

До следующего изображения .. есть ли у него минусы?
— Гарри Бош

12

Я забыл добавить сюда свой ответ. Я использовал Ruby on Rails, поэтому он может быть неприменим к вашим проектам на PHP или других фреймворках. В моем случае я использовал гем Carrierwave для загрузки изображений. Мое решение заключалось в том, чтобы добавить следующий код в класс загрузчика, чтобы исправить проблему EXIF ​​перед сохранением файла.

process :fix_exif_rotation
def fix_exif_rotation
  manipulate! do |img|
    img.auto_orient!
    img = yield(img) if block_given?
    img
  end
end

1
хороший ответ, но как я могу вызвать этот метод для существующего файла изображения?
— Matrix

Вам нужно воссоздать версии. Думаю, что-то вроде этого сработает: stackoverflow.com/a/9065832/461640
— Ленивый журнал

11

сохранить как png решило проблему для меня.


1
Это решение полезно только для изображений, которые не являются фотографиями: «Формат JPG - это формат файла со сжатием с потерями. Это делает его полезным для хранения фотографий меньшего размера, чем BMP. JPG - это обычный выбор для использования в Интернете, потому что он сжатый. Для хранения штриховых рисунков, текста и пиктограмм в файле меньшего размера лучше использовать GIF или PNG, поскольку они не содержат потерь ». - labnol.org/software/tutorials/…
— Kc Gibson

потрясающе,
— решено

2
Сохранил его как PNG, затем снова вернулся в JPG, который сохраняет небольшой размер файла и правильную ориентацию, спасибо.
— Mave

10

Этот ответ основан на ответе bsap с использованием Exif-JS , но не полагается на jQuery и довольно совместим даже со старыми браузерами. Ниже приведены примеры файлов html и js:

rotate.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
  <html>
  <head>
    <style>
      .rotate90 {
       -webkit-transform: rotate(90deg);
       -moz-transform: rotate(90deg);
       -o-transform: rotate(90deg);
       -ms-transform: rotate(90deg);
       transform: rotate(90deg);
      }
      .rotate180 {
       -webkit-transform: rotate(180deg);
       -moz-transform: rotate(180deg);
       -o-transform: rotate(180deg);
       -ms-transform: rotate(180deg);
       transform: rotate(180deg);
      }
      .rotate270 {
       -webkit-transform: rotate(270deg);
       -moz-transform: rotate(270deg);
       -o-transform: rotate(270deg);
       -ms-transform: rotate(270deg);
       transform: rotate(270deg);
      }
    </style>
  </head>
  <body>
    <img src="pic/pic03.jpg" width="200" alt="Cat 1" id="campic" class="camview">
    <script type="text/javascript" src="exif.js"></script>
    <script type="text/javascript" src="rotate.js"></script>
  </body>
  </html>

rotate.js:

window.onload=getExif;
var newimg = document.getElementById('campic');
function getExif() {
    EXIF.getData(newimg, function() {
            var orientation = EXIF.getTag(this, "Orientation");
            if(orientation == 6) {
                newimg.className = "camview rotate90";
            } else if(orientation == 8) {
                newimg.className = "camview rotate270";
            } else if(orientation == 3) {
                newimg.className = "camview rotate180";
            }
        });
};

exif-js сейчас настолько устарел и не обслуживается, что дает сбой в некоторых средах, например, везде, где включен строгий режим. Нам действительно нужно решение для этого. Мое приложение меня до чертиков расстраивает, и каждое обнаруженное мной решение имеет ряд недостатков.
— Методист

9

Вы можете использовать Exif-JS , чтобы проверить свойство «Ориентация» изображения. Затем примените преобразование css по мере необходимости.

EXIF.getData(imageElement, function() {
                var orientation = EXIF.getTag(this, "Orientation");

                if(orientation == 6)
                    $(imageElement).css('transform', 'rotate(90deg)')
});  

7

Это данные EXIF, которые использует ваш телефон Samsung.


1
Ах, так это происходит только с изображениями, сделанными телефоном Samsung?
— The Lazy Log

4
Бывает с несколькими. Я тоже видел это на iPhone.
— Trace DeCoy 09

Метаданные EXIF ​​могут включать информацию о самой фотографии (выдержка, диафрагма объектива, ISO-чувствительность, расстояние фокусировки и т. Д.), Контекстные данные (дата, время, температура, влажность) и могут содержать координаты GPS, а также округленный угол поворота. кратное до 90 °. Подавляющее большинство современных смартфонов и камер помещают эти метаданные в блок EXIF, поэтому, IMHO, это просто вопрос времени, когда браузеры автоматически применяют правильное вращение кадра.
— ManuelJE

7

Эта проблема тоже сводила меня с ума. Я использовал PHP на стороне моего сервера, поэтому я не мог использовать решения @The Lazy Log (ruby) и @deweydb (python). Однако он указал мне правильное направление. Я исправил это на подложке с помощью Imagick getImageOrientation ().

<?php 
// Note: $image is an Imagick object, not a filename! See example use below. 
function autoRotateImage($image) { 
    $orientation = $image->getImageOrientation(); 

    switch($orientation) { 
        case imagick::ORIENTATION_BOTTOMRIGHT: 
            $image->rotateimage("#000", 180); // rotate 180 degrees 
        break; 

        case imagick::ORIENTATION_RIGHTTOP: 
            $image->rotateimage("#000", 90); // rotate 90 degrees CW 
        break; 

        case imagick::ORIENTATION_LEFTBOTTOM: 
            $image->rotateimage("#000", -90); // rotate 90 degrees CCW 
        break; 
    } 

    // Now that it's auto-rotated, make sure the EXIF data is correct in case the EXIF gets saved with the image! 
    $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); 
} 
?> 

Вот ссылка, если вы хотите узнать больше. http://php.net/manual/en/imagick.getimageorientation.php


6

Пока CSS: не image-orientation:from-image;будет поддерживаться повсеместно, мы делаем серверное решение с помощью python. Вот его суть. Вы проверяете ориентацию данных exif, затем соответствующим образом поворачиваете изображение и повторно сохраняете.

Мы предпочитаем это решение решениям на стороне клиента, поскольку оно не требует загрузки дополнительных библиотек на стороне клиента, и эта операция должна выполняться только один раз при загрузке файла.

if fileType == "image":
    exifToolCommand = "exiftool -j '%s'" % filePath
    exif = json.loads(subprocess.check_output(shlex.split(exifToolCommand), stderr=subprocess.PIPE))
    if 'Orientation' in exif[0]:
        findDegrees, = re.compile("([0-9]+)").search(exif[0]['Orientation']).groups()
        if findDegrees:
            rotateDegrees = int(findDegrees)
            if 'CW' in exif[0]['Orientation'] and 'CCW' not in exif[0]['Orientation']:
                rotateDegrees = rotateDegrees * -1
            # rotate image
            img = Image.open(filePath)
            img2 = img.rotate(rotateDegrees)
            img2.save(filePath)

3

Это происходит потому, что исходная ориентация изображения отличается от той, которую мы видим в программе просмотра изображений. В таких случаях в средстве просмотра изображений изображение отображается вертикально по отношению к нам, но на самом деле оно горизонтальное.

Чтобы решить эту проблему, выполните следующие действия:

  1. Откройте изображение в редакторе изображений, например Paint (в Windows) или ImageMagick (в Linux).

  2. Поверните изображение влево / вправо.

  3. Сохраните изображение.

Это должно навсегда решить проблему.


1

Я думаю, что есть некоторые проблемы с автоматическим исправлением ориентации изображения в браузере, например, если я посещаю изображение напрямую, оно показывает правильную ориентацию, но показывает неправильную ориентацию на некоторых выходах html-страницы.


0

Простой способ решить проблему без кодирования - использовать функцию экспорта Photoshop «Сохранить для Интернета». В диалоговом окне можно выбрать удаление всех или большей части данных EXIF ​​изображения. Обычно я просто сохраняю авторские права и контактную информацию. Кроме того, поскольку изображения, поступающие непосредственно с цифровой камеры, имеют слишком большой размер для отображения в Интернете, в любом случае рекомендуется уменьшить их размер с помощью функции «Сохранить для Интернета». Для тех, кто не разбирается в Photoshop, я не сомневаюсь, что есть онлайн-ресурсы для изменения размера изображения и удаления из него любых ненужных данных EXIF.


4
Но если вы разрабатываете приложение, в котором пользователи могут выбрать любое изображение для загрузки, как в этом случае использовать Photoshop? :)
— The Lazy Log

-19

Используйте внешнюю укладку. в листе html присвойте тегу имя класса. в таблице стилей используйте оператор точки, которому предшествует имя класса, а затем напишите следующий код

.rotate180 {
 -webkit-transform: rotate(180deg);
 -moz-transform: rotate(180deg);
 -o-transform: rotate(180deg);
 -ms-transform: rotate(180deg);
 transform: rotate(180deg);
 }

Это не обобщенное решение. Будет работать конкретно над изображением, о котором идет речь
— th3pirat3 09
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.