2013-04-10 14 views
5

Ho bisogno di uno script PHP per ruotare le mie immagini caricate sul server con iPad. Ho un problema con l'orientamento dei dati immagine e exif. Provo forse un 10 soluzioni e non ho una soluzione. Quando il "pulsante" è sul lato destro, l'immagine caricata era OK, ma se ruoto iPad, le immagini ruotano e non riesco a visualizzarle in modo normale. Qualsiasi aiuto?La foto caricata con iPad è ruotata

+0

Non ho capito la domanda, cosa intendi per ruotare l'immagine caricata sul server con iPad? –

+1

il mio inglese è brutto, ma se faccio una foto con Ipad e AD poi caricherò sul server, l'immagine non è nel normale orientamento, capisci il mio problema? – mare23

+0

Ancora nebbioso, penso che riguardi il tuo iPad, non il server ... forse dalla rotazione della videocamera, puoi semplicemente modificarlo all'interno dell'iPad e ruotarlo. –

risposta

6

Qui si va, ho deciso di avere un gioco da quando ho avuto un ricambio 30 minuti per uccidere

https://github.com/leesherwood/Orientation-Fix-PHP

Basta passare il percorso del file nella funzione fix_orientation, e dovrebbe funzionare (controllare il codice e la funzione commenti, probabilmente si desidera modificare come finalmente salva l'immagine come il nome o qualsiasi altra cosa)

e per coloro che vogliono solo il codice o github muore, ecco il file funzione principale per voi

<?php 
/* 
* PHP Orientation Fix (GD) v1.0.0 
* https://github.com/leesherwood/Orientation-Fix-PHP 
* 
* Copyright 2013, "leesherwood" Lee Sherwood 
* 
* Licensed under the MIT license: 
* http://www.opensource.org/licenses/MIT 
* 
* AKA: I couldn't care less what you do with it, 
*  im just a nice guy and i want to share. 
*  But it would be nice if you left me a little credit :) 
* 
* If you use this, then let me know at: [email protected] 
*/ 

/** 
* The main function that does the actual job 
* 
* Pass a string representing the image path and filename such as /var/www/images/image.jpg 
* And it will change the name of the image to include "orig." (for the sake of not deleting your image if something goes wrong) 
* and then create a new image with the same filename, with the orientation fixed 
* The return bool is not informative and should only be used to to tell your script that there is a proper orientated image available (or not) 
* If you want to know why it failed (theres many reason) then you need to make the return values for informative, or use exceptions.  
* 
* @param string the path to the file including the file iteself (absolute path would be advised) 
* @return bool true if successful, false if not 
*/ 
function fix_orientation($fileandpath) { 

    // Does the file exist to start with? 
    if(!file_exists($fileandpath)) 
    return false; 

    // Get all the exif data from the file 
    $exif = read_exif_data($fileandpath, 'IFD0'); 

    // If we dont get any exif data at all, then we may as well stop now 
    if(!$exif || !is_array($exif)) 
    return false; 

    // I hate case juggling, so we're using loweercase throughout just in case 
    $exif = array_change_key_case($exif, CASE_LOWER); 

    // If theres no orientation key, then we can give up, the camera hasn't told us the 
    // orientation of itself when taking the image, and i'm not writing a script to guess at it! 
    if(!array_key_exists('orientation', $exif)) 
    return false; 

    // Gets the GD image resource for loaded image 
    $img_res = get_image_resource($fileandpath); 

    // If it failed to load a resource, give up 
    if(is_null($img_res)) 
    return false; 

    // The meat of the script really, the orientation is supplied as an integer, 
    // so we just rotate/flip it back to the correct orientation based on what we 
    // are told it currently is 
    switch($exif['orientation']) { 

    // Standard/Normal Orientation (no need to do anything, we'll return true as in theory, it was successful) 
    case 1: return true; break; 

    // Correct orientation, but flipped on the horizontal axis (might do it at some point in the future) 
    case 2: 
     $final_img = imageflip($img_res, IMG_FLIP_HORIZONTAL); 
    break; 

    // Upside-Down 
    case 3: 
     $final_img = imageflip($img_res, IMG_FLIP_VERTICAL); 
    break; 

    // Upside-Down & Flipped along horizontal axis 
    case 4: 
     $final_img = imageflip($img_res, IMG_FLIP_BOTH); 
    break; 

    // Turned 90 deg to the left and flipped 
    case 5: 
     $final_img = imagerotate($img_res, -90, 0); 
     $final_img = imageflip($img_res, IMG_FLIP_HORIZONTAL); 
    break; 

    // Turned 90 deg to the left 
    case 6: 
     $final_img = imagerotate($img_res, -90, 0); 
    break; 

    // Turned 90 deg to the right and flipped 
    case 7: 
     $final_img = imagerotate($img_res, 90, 0); 
     $final_img = imageflip($img_res,IMG_FLIP_HORIZONTAL); 
    break; 

    // Turned 90 deg to the right 
    case 8: 
     $final_img = imagerotate($img_res, 90, 0); 
    break; 

    } 

    // If theres no final image resource to output for whatever reason, give up 
    if(!isset($final_img)) 
    return false; 

    //-- rename original (very ugly, could probably be rewritten, but i can't be arsed at this stage) 
    $parts = explode("/", $fileandpath); 
    $oldname = array_pop($parts); 
    $path = implode('/', $parts); 
    $oldname_parts = explode(".", $oldname); 
    $ext = array_pop($oldname_parts); 
    $newname = implode('.', $oldname_parts).'.orig.'.$ext; 

    rename($fileandpath, $path.'/'.$newname); 

    // Save it and the return the result (true or false) 
    $done = save_image_resource($final_img,$fileandpath); 

    return $done; 

} 

/** 
* Simple function which takes the filepath, grabs the extension and returns the GD resource for it 
* Not fool-proof nor the best, but it does the job for now 
*/ 
function get_image_resource($file) { 

    $img = null; 
    $p = explode(".", strtolower($file)); 
    $ext = array_pop($p); 
    switch($ext) { 

     case "png": 
     $img = imagecreatefrompng($file); 
     break; 

     case "jpg": 
     case "jpeg": 
     $img = imagecreatefromjpeg($file); 
     break; 
     case "gif": 
     $img = imagecreatefromgif($file); 
     break; 

    } 

    return $img; 

} 

/** 
* Saves the final image resource to the given location 
* As above it works out the extension and bases its output command on that, not fool proof, but works nonetheless 
*/ 
function save_image_resource($resource, $location) { 

    $success = false; 
    $p = explode(".", strtolower($location)); 
    $ext = array_pop($p); 
    switch($ext) { 

     case "png": 
     $success = imagepng($resource,$location); 
     break; 

     case "jpg": 
     case "jpeg": 
     $success = imagejpeg($resource,$location); 
     break; 
     case "gif": 
     $success = imagegif($resource,$location); 
     break; 

    } 

    return $success; 

} 


/** 
* My Dev environment is not the latest on this machine. which is lucky as i never bothered to check if imageflip needed a specific version 
* (been using imagerotate for ages and assumed imageflip would surely be included to) 
* But as it turns out, you need a fairly recent version of PHP for imageflip, so i cobbled together a quick replacement function for those that don't have it 
*/ 
if(!function_exists('imageflip')) { 

    // These are the same constants so this script should be upgrade safe, the values are different no doubt, but that won't hurt! 
    define("IMG_FLIP_HORIZONTAL", 1); 
    define("IMG_FLIP_VERTICAL", 2); 
    define("IMG_FLIP_BOTH", 3); 

    /** 
    * Simple function that takes a gd image resource and the flip mode, and uses rotate 180 instead to do the same thing... Simples! 
    */  
    function imageflip($resource, $mode) { 

     if($mode == IMG_FLIP_VERTICAL || $mode == IMG_FLIP_BOTH) 
     $resource = imagerotate($resource, 180, 0); 

     if($mode == IMG_FLIP_HORIZONTAL || $mode == IMG_FLIP_BOTH) 
     $resource = imagerotate($resource, 90, 0); 

     return $resource; 

    } 

} 


?> 
+1

Grazie mille! Script molto utile – mare23

+0

Grazie. save_image_resource potrebbe impostare il terzo parametro (ad esempio quality = 0..9 per png) per non perdere la qualità dell'immagine: imagejpeg ($ resource, $ location, 100); imagepng ($ resource, $ location, 0); per disattivare la compressione. –

Problemi correlati