Come smettere di PHP iMagick auto-rotazione delle immagini basato su EXIF di ‘orientamento’ di dati

Attualmente lavorando con PHP e iMagick per sviluppare un poster stampa di applicazioni Web.

Questa è l’immagine di esempio sto usando per il test di upload/image editing caratteristiche dell’applicazione:

Come smettere di PHP iMagick auto-rotazione delle immagini basato su EXIF di 'orientamento' di dati

L’immagine contiene i seguenti dati EXIF:

[FileName] => 1290599108_IMG_6783.JPG
    [FileDateTime] => 1290599109
    [FileSize] => 4275563
    [FileType] => 2
    [MimeType] => image/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP, MAKERNOTE
    [COMPUTED] => Array
        (
            [html] => width="3504" height="2336"
            [Height] => 2336
            [Width] => 3504
            [IsColor] => 1
            [ByteOrderMotorola] => 0
            [CCDWidth] => 22mm
            [ApertureFNumber] => f/5.6
            [UserComment] => 
            [UserCommentEncoding] => UNDEFINED
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )

    [Make] => Canon
    [Model] => Canon EOS 30D
    [Orientation] => 6
    [XResolution] => 72/1
    [YResolution] => 72/1
    [ResolutionUnit] => 2
    [DateTime] => 2009:08:31 08:23:49
    [YCbCrPositioning] => 2
    [Exif_IFD_Pointer] => 196

Tuttavia – iMagick, quando __costruire cantando con questa immagine, automaticamente la ruota di un ulteriore di 90 gradi in senso ANTIORARIO, come per [Orientation] => 6 (penso!). Il risultato è un…

Come smettere di PHP iMagick auto-rotazione delle immagini basato su EXIF di 'orientamento' di dati

Quello che vorrei sapere è…

Come posso mantenere l’orientamento originale dell’immagine visto in cima alla pagina? E questo è possibile attraverso disabilitare l’auto-rotazione, eseguita da iMagick?

Molte grazie

AGGIORNAMENTO: Ecco la soluzione che mi è venuta in mente… Che correggere l’orientamento in base all’orientamento nei dati EXIF

   public function fixOrientation() {

       $exif = exif_read_data($this->imgSrc);
       $orientation = $exif['Orientation'];
       switch($orientation) {

           case 6: //rotate 90 degrees CW
               $this->image->rotateimage("#FFF", 90);
           break;

           case 8: //rotate 90 degrees CCW
              $this->image->rotateimage("#FFF", -90);
           break;

       }

 }
InformationsquelleAutor kaese | 2010-11-24



4 Replies
  1. 3

    Provare Imagick::setImageOrientation. Esperimento con il disponibile costanti.

    • grazie izym. Hai qualche info in più su come queste costanti possono essere utilizzati?
    • Essere consapevoli del fatto che Imagick::setImageOrientation() in realtà non ruotare l’immagine, cambia solo il EXIF rotazione info che verrà salvato con l’immagine. In alcuni casi, che può essere quello che vuoi fare, ma di solito è meglio fisicamente a ruotare l’immagine (vedere il codice di esempio che ho postato come risposta). Il problema con affidamento sugli EXIF rotazione info è che non tutti i browser web e la visualizzazione dell’immagine del software verrà automaticamente orientarlo correttamente.
  2. 46

    “Tuttavia – iMagick, quando __costruire cantando con questa immagine, automaticamente la ruota di un ulteriore di 90 gradi in senso ANTIORARIO, come per [Orientamento] => 6 (penso!).”

    Il problema in realtà è l’opposto. Imagick non rotazione automatica dell’immagine. Sei solo vederlo correttamente in altri software /web browser, perché quei programmi di rotazione automatica in base alle informazioni EXIF. Alcune operazioni in Imagick causerà la perdita di corrette informazioni EXIF (copia l’immagine, miniaturaimmagine(), stripImage(), e altre manipolazioni). Così che cosa dovete fare in questo caso è in realtà fisicamente ruotare l’immagine.

    La risposta da ajmicek è buona, ma potrebbe essere un po ‘ migliorate utilizzando Imagick proprie funzioni, piuttosto che il PHP EXIF funzioni. Anche quel frammento sembra essere stato parte di una classe, quindi non può essere utilizzato come una funzione separata come-è. E ‘ anche una buona idea per impostare il corretto orientamento EXIF con setImageOrientation() dopo la rotazione.

    //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);
    }

    Esempio di uso:

    $image = new Imagick('my-image-file.jpg');
    autoRotateImage($image);
    //- Do other stuff to the image here -
    $image->writeImage('result-image.jpg');
    • grande spiegazione — questo funziona come desiderato.
    • Tante ore salvato.
    • Per favore puoi convertire in CodeIgniter
    • Ho passato ore a fare scherzi con le rotazioni cercando di soddisfare tutti i cellulari e dispositivi e questo è stato risolto in un colpo solo, grazie!
    • Funziona come un fascino
    • 2h di debug, poi ha trovato questo.. una leggenda! 🙂

  3. 1

    Buon inizio-un paio di aggiunte per rendere la funzione più robusto. Primo, caso 3 si verifica quando l’immagine viene visualizzata a testa in giù. C’è una GRANDE illustrazione del diverso orientamento codici Calvin Hass.
    È possibile che l’orientamento può apparire in una parte diversa del exif_read_data array (a seconda del modello di fotocamera, credo), quindi ho provato a tenerne conto nel mio codice di esempio.

    Qualcosa di simile a questo:

    public function fixOrientation() {
    
        $exif = exif_read_data($this->imgSrc);
    
        if( isset($exif['Orientation']) )
            $orientation = $exif['Orientation'];
        elseif( isset($exif['IFD0']['Orientation']) )
            $orientation = $exif['IFD0']['Orientation'];
        else
            return false;
    
        switch($orientation) {
            case 3: //rotate 180 degrees
                $this->image->rotateimage("#FFF", 180);
            break;
    
            case 6: //rotate 90 degrees CW
                $this->image->rotateimage("#FFF", 90);
            break;
    
            case 8: //rotate 90 degrees CCW
                $this->image->rotateimage("#FFF", -90);
            break;
        }
    }

    La trasformazione & save ti lascia senza precedenti di informazioni EXIF, tra cui Orientation. Il mancanza di Orientation nell’immagine trasformata impedirà l’ulteriore elaborazione da tentare di ‘correggere’ le cose, ruotando di nuovo. Io non vorrei che Imagick aveva il supporto per ImageMagick è -auto-orient, ma oh, va bene.

    Oh, anche: la rotazione è un operazione in perdita (a meno che non si utilizza jpegtran), così si dovrebbe cercare di farlo solo in combinazione con un ridimensionamento o qualsiasi altra trasformazione.

    • Grandi aggiunte alla funzione originale – grazie!
    • Perché FFF non 000? C’è qualche differenza in termini di prestazioni?
    • Che il primo argomento è il colore dell’area di lavoro.
  4. 0

    Questo codice orrd eccellente risposta richiede iMagick versione 6.3+.:

    $immagine->setImageOrientation(imagick::ORIENTATION_TOPLEFT);

    Funziona perfettamente e si prende cura di os/dispositivo di orientamento differenze. Non avrebbe funzionato con 6.2.

    Avevo codificato per ottenere il dispositivo. Qui, nel caso qualcuno ne ha bisogno.

    $ua = $_SERVER['HTTP_USER_AGENT'];
    $strcut = stristr($ua, '(')."<br>";
    $textlen = strpos($strcut,";");
    $deviceos = substr($strcut,1,($textlen-1));
    echo "Device O/S: * $deviceos"."<br>";

Lascia un commento