img wyświetla nieprawidłową orientację


142

Mam obraz pod tym linkiem: http://d38daqc8ucuvuv.cloudfront.net/avatars/216/2014-02-19%2017.13.48.jpg

Jak widać, jest to normalny obraz z prawidłową orientacją. Jednak kiedy ustawię ten link na atrybut src mojego tagu obrazu, obraz stanie się do góry nogami. http://jsfiddle.net/7j5xJ/

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

Czy masz pojęcie, co się dzieje?


W przeglądarce Firefox w obu przypadkach jest do góry nogami. Myślę, że Chrome jest wystarczająco inteligentny, aby obracać go automatycznie na podstawie informacji EXIF.
— dfsq

Hmm, naprawdę? W moim Firefoksie oryginał jest nadal normalny, a obraz w img jest do góry nogami.
— The Lazy Log

1
Myślę, że sam obraz jest do góry nogami i cloudfrontmoże obracać go na stronie. Można wymusić obracać za pomocą CSS jsfiddle.net/7j5xJ/1
— Kevin Lynch

2
regex.info/ ... Ma Orientation: Rotate 180w EXIF.
— dfsq,

1
Jest to problem z metadanymi zdjęcia, które określają orientację. Nie wiem, dlaczego tag obrazu nie uwzględnia tego. Nie znalazłem jeszcze żadnych dobrych odpowiedzi ...
— Chet

Odpowiedzi:


91

Znalazłem część rozwiązania. Obrazy mają teraz metadane określające orientację zdjęcia. Dostępna jest nowa specyfikacja CSS dlaimage-orientation .

Po prostu dodaj to do swojego CSS:

img {
    image-orientation: from-image;
}

Zgodnie ze specyfikacją z 25 stycznia 2016 r., Firefox i iOS Safari (za prefiksem) są jedynymi przeglądarkami, które to obsługują. Nadal widzę problemy z przeglądarką Safari i Chrome. Jednak mobilna Safari wydaje się natywnie obsługiwać orientację bez tagu CSS.

Przypuszczam, że będziemy musieli poczekać i zobaczyć, czy przeglądarki zaczną wspierać image-orientation.


3
Dziwne przeglądarki, które testowałem (Safari, Chrome i Firefox na Macu w ich ostatnich wcieleniach) poprawnie obsługują flagę, gdy obraz jest wyświetlany bezpośrednio, bez żadnego HTMLa wokół niego.
— anw

2
Ostrożnie z tym, ponieważ jest to eksperymentalne. Sprawdź zgodność przeglądarki, która nie wygląda dobrze dla większości przeglądarek. Mam nadzieję, że kiedyś to rozwiążą.
— Lostintranslation

35
Nie jest to zgodne z większością dzisiejszych przeglądarek caniuse.com/#search=image-orientation
— Gabriel C

2
Dlaczego na świecie obrazy mają nawet metadane orientacji? Gdybyś naprawdę chciał obrócić obraz, czy nie przesuwałbyś po prostu wokół pikseli i zamieniał szerokość na wysokość?
— Jack Giffin

15
Skąd wzięło się tak wiele głosów pozytywnych? Jest bardzo nieobsługiwany i nie działa na nic poza firefox caniuse.com/#search=image-orientation
— A Friend

26

Twój obraz jest faktycznie do góry nogami. Ale ma meta atrybut „Orientacja”, który mówi widzowi, że powinien być obrócony o 180 stopni. Niektóre urządzenia / przeglądarki nie przestrzegają tej zasady.

Otwórz w Chrome: w prawo w górę Otwórz w FF: w prawo w górę Otwórz w IE: do góry nogami

Otwórz w programie Paint: do góry nogami Otwórz w Photoshopie: od razu do góry. itp.


1
Czy masz pomysł, jak możemy temu zapobiec, zanim użytkownik załaduje obraz? Ponieważ ten obraz jest przesyłany bezpośrednio przez użytkownika, muszę znaleźć sposób, aby temu zaradzić
— The Lazy Log,

Jeśli jest to usługa, która będzie hostować obrazy, i tak najlepiej ponownie zakodować obrazy ze względu na wymiary, rozmiar pliku i ze względów bezpieczeństwa, więc może to naprawić je w ponownie zakodowanej wersji.
— i-CONICA

Widzę. Będę musiał znaleźć lepszy sposób, aby sobie z tym poradzić. Może muszę przetworzyć obraz po przesłaniu go do S3
— The Lazy Log,

Możesz skorzystać z biblioteki GD w PHP.
— i-CONICA,

5
Prostszym sposobem byłoby usunięcie metadanych orientacji i odwrócenie obrazu. Imagemagick zapewnia funkcję konwersji automatycznej, która to zrobi.
— saurabheights

19

Jeśli masz dostęp do Linuksa, otwórz terminal, przejdź do katalogu zawierającego obrazy, a następnie uruchom

mogrify -auto-orient *

Powinno to trwale rozwiązać problemy z orientacją na wszystkich obrazach.


4
To zadziałało dla mnie, być może będziesz musiał uruchomić brew install imagemagickna komputerze Mac, jeśli dostanieszcommand not found: mogrify
— Kyle

Do następnego obrazu… czy ma jakieś wady?
— Harry Bosh

12

Zapomniałem dodać tutaj własną odpowiedź. Używałem Ruby on Rails, więc może nie mieć zastosowania do twoich projektów w PHP lub innych frameworkach. W moim przypadku do przesyłania zdjęć korzystałem z klejnotu Carrierwave. Moim rozwiązaniem było dodanie następującego kodu do klasy uploader, aby naprawić problem EXIF ​​przed zapisaniem pliku.

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

1
dobra odpowiedź, ale jak mogę wywołać tę metodę na istniejącym pliku obrazu?
— Matrix,

Musisz odtworzyć wersje. Myślę, że coś takiego by zadziałało: stackoverflow.com/a/9065832/461640
— The Lazy Log,

11

zapisz jako png rozwiązał problem za mnie.


1
To rozwiązanie jest przydatne tylko w przypadku obrazów, które nie są zdjęciami: „Format JPG jest formatem plików z kompresją stratną. Dzięki temu jest przydatny do przechowywania zdjęć w mniejszym rozmiarze niż BMP. JPG jest często wybieranym do użytku w Internecie, ponieważ jest skompresowane. Do przechowywania rysunków liniowych, tekstu i ikonicznych grafik w mniejszym rozmiarze pliku GIF lub PNG są lepszym wyborem, ponieważ są bezstratne ”. - labnol.org/software/tutorials/…
— Kc Gibson

niesamowite, rozwiązane Dzięki
— T. Shashwat,

2
Zapisałem go jako PNG, a następnie ponownie z powrotem do JPG, który utrzymuje mały rozmiar pliku i poprawnie zapisał orientację, dzięki.
— MDave

10

Ta odpowiedź opiera się na odpowiedzi bsap przy użyciu Exif-JS , ale nie opiera się na jQuery i jest dość kompatybilna nawet ze starszymi przeglądarkami. Oto przykładowe pliki html i 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 jest teraz tak przestarzały i nieobsługiwany, że zawodzi w niektórych środowiskach, takich jak wszędzie, gdzie włączony jest tryb ścisły. Naprawdę potrzebujemy rozwiązania tego problemu. Moja aplikacja jest frustrująca, a każde obejście, które znalazłem, ma wiele wad.
— Methodician

9

Możesz użyć Exif-JS , aby sprawdzić właściwość „Orientation” obrazu. Następnie zastosuj transformację CSS w razie potrzeby.

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

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

7

Ten problem też doprowadzał mnie do szału. Używałem PHP po stronie serwera, więc nie mogłem użyć rozwiązań @The Lazy Log (ruby) i @deweydb (python). Jednak wskazało mi to właściwy kierunek. Naprawiłem to na kopii zapasowej za pomocą getImageOrientation () firmy 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); 
} 
?> 

Oto link, jeśli chcesz przeczytać więcej. http://php.net/manual/en/imagick.getimageorientation.php


6

To dane EXIF, które zawiera Twój telefon Samsung.


1
Ach, więc dzieje się tak tylko w przypadku zdjęć wykonanych telefonem Samsung?
— The Lazy Log,

4
Dzieje się z kilkoma. Widziałem to również na iPhone'ach.
— Trace DeCoy

Metadane EXIF ​​mogą zawierać informacje o samym zdjęciu (czas otwarcia migawki, apertura obiektywu, czułość izo, odległość ogniskowania itp.), Dane kontekstowe (data, godzina, temperatura, wilgotność) i mogą zawierać współrzędne GPS oraz zaokrąglony kąt obrotu do 90 ° wielokrotność. Zdecydowana większość dzisiejszych smartfonów i aparatów umieszcza te metadane w bloku EXIF, więc IMHO to tylko kwestia czasu, aby przeglądarki automatycznie zastosowały prawidłową rotację klatek.
— ManuelJE

5

Dopóki CSS: nie image-orientation:from-image;jest bardziej uniwersalnie obsługiwany, robimy rozwiązanie po stronie serwera w Pythonie. Oto sedno tego. Sprawdzasz orientację danych exif, a następnie odpowiednio obracasz obraz i ponownie zapisujesz.

Preferujemy to rozwiązanie od rozwiązań po stronie klienta, ponieważ nie wymaga ładowania dodatkowych bibliotek po stronie klienta, a operacja ta musi się odbyć tylko raz podczas przesyłania pliku.

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

Dzieje się tak, ponieważ oryginalna orientacja obrazu nie jest taka, jaką widzimy w przeglądarce obrazów. W takich przypadkach obraz jest wyświetlany pionowo względem nas w przeglądarce obrazów, ale w rzeczywistości jest poziomy.

Aby rozwiązać ten problem, wykonaj następujące czynności:

  1. Otwórz obraz w edytorze obrazów, takim jak paint (w systemie Windows) lub ImageMagick (w systemie Linux).

  2. Obróć obraz w lewo / w prawo.

  3. Zapisz obraz.

Powinno to trwale rozwiązać problem.


1

Łatwym sposobem rozwiązania problemu bez kodowania jest użycie funkcji eksportu programu Photoshop Save for Web. W oknie dialogowym można wybrać usunięcie wszystkich lub większości danych EXIF ​​obrazu. Zwykle po prostu zachowuję prawa autorskie i dane kontaktowe. Ponadto, ponieważ obrazy pochodzące bezpośrednio z aparatu cyfrowego są znacznie większe, aby można je było wyświetlić w Internecie, dobrym pomysłem jest zmniejszenie ich rozmiaru za pomocą funkcji Save for the Web. Dla tych, którzy nie są obeznani z Photoshopem, nie mam wątpliwości, że istnieją zasoby online do zmiany rozmiaru obrazu i pozbycia się z niego niepotrzebnych danych EXIF.


4
Ale jeśli tworzysz aplikację, w której użytkownicy mogą wybrać dowolny obraz do przesłania, jak w takim przypadku użyć programu Photoshop? :)
— The Lazy Log

1

Myślę, że są pewne problemy z automatyczną poprawką orientacji obrazu w przeglądarce, na przykład, jeśli odwiedzę zdjęcie bezpośrednio, pokazuje ono właściwą orientację, ale pokazuje niewłaściwą orientację na niektórych wyjściach ze strony html.


-19

Użyj stylizacji zewnętrznej. w arkuszu html podaj nazwę klasy do tagu. w arkuszu stylów użyj operatora kropki poprzedzonego nazwą klasy, a następnie napisz następujący kod

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

Nie jest to uogólnione rozwiązanie. Będzie działać specjalnie na podanym obrazie
— th3pirat3
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.