тег img отображает неправильную ориентацию
У меня есть изображение по этой ссылке:http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg
Как вы можете видеть, это нормальное изображение с правильной ориентацией. Однако, когда я устанавливаю эту ссылку на атрибут src моего тега image, изображение становится вверх ногами. http://jsfiddle.net/7j5xJ/
<body>
<img src="http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg" width="200"/>
</body>
есть ли у вас какие-либо идеи, что происходит?
11 ответов:
Я нашел часть решения. Изображения теперь имеют метаданные, которые определяют ориентацию фотографии. Есть новый CSS spec для
image-orientation
.просто добавьте это в ваш CSS:
img { image-orientation: from-image; }
согласно спецификации от 25 января 2016 года, Firefox и iOS Safari (за префиксом) являются единственными браузерами, которые поддерживают это. Я вижу проблемы с Safari и Chrome по-прежнему. Однако mobile Safari, похоже, изначально поддерживает ориентацию без CSS метка.
полагаю, нам придется подождать и посмотреть, начнут ли браузеры поддерживать
image-orientation
.
ваше изображение на самом деле вверх ногами. Но у него есть мета-атрибут "ориентация", который говорит зрителю, что он должен быть повернут на 180 градусов. Некоторые устройства / зрители не подчиняются этому правилу.
открыть его в Chrome: правильный путь Откройте его в FF: правильный путь вверх Откройте его в IE: вверх ногами
раскройте его в краске: вверх ногами Откройте его в Photoshop: правильный путь вверх. так далее.
Я забыл добавить мой собственный ответ. Я использовал Ruby on Rails, поэтому он может быть неприменим к вашим проектам в PHP или других фреймворках. В моем случае, я использовал Carrierwave gem для загрузки изображений. Мое решение состояло в том, чтобы добавить следующий код в класс uploader, чтобы исправить проблему EXIF перед сохранением файла.
process :fix_exif_rotation def fix_exif_rotation manipulate! do |img| img.auto_orient! img = yield(img) if block_given? img end end
можно использовать Exif-JS, чтобы проверить свойство "ориентация" изображения. Затем примените преобразование css по мере необходимости.
EXIF.getData(imageElement, function() { var orientation = EXIF.getTag(this, "Orientation"); if(orientation == 6) $(imageElement).css('transform', 'rotate(90deg)') });
простой способ исправить проблему, без кодирования, заключается в использовании функции сохранения Photoshop для веб-экспорта. В диалоговом окне можно выбрать удаление всех или большинства данных EXIF изображения. Я обычно просто сохраняю авторские права и контактную информацию. Кроме того, поскольку изображения, поступающие непосредственно с цифровой камеры, значительно увеличены для веб-дисплея, рекомендуется уменьшить их с помощью Save for the Web в любом случае. Для тех, кто не разбирается в Photoshop, я не сомневаюсь, что есть онлайн-ресурсы для изменения размера изображение и удаление из него любых ненужных данных EXIF.
пока 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)
эта проблема сводила меня с ума тоже. Я использовал PHP на своей стороне сервера, поэтому я не смог использовать решения @the Lazy Log(ruby) & @deweydb(python). Однако он указал мне в правильном направлении. Я исправил его на задней панели, используя getImageOrientation Imagick ().
<?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
этот ответ основан на ответе bsap с помощью Exif-JS, но не полагается на jQuery и довольно совместим даже со старыми браузерами. Ниже приведены примеры html и js файлов:
поворот.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>
поворот.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"; } }); };
использовать внешний стайлинг. в html-листе дайте имя класса тегу. в таблице стилей используйте оператор точки, предшествующий имени класса, а затем напишите следующий код
.rotate180 { -webkit-transform: rotate(180deg); -moz-transform: rotate(180deg); -o-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); }