djekl
1/20/2013 - 8:51 PM

Simple image rotation class

Simple image rotation class

<?php

// in this example we will use a remote file
$file = 'https://raw.github.com/recurser/exif-orientation-examples/master/Landscape_6.jpg';

// adjust orientation and save a local copy (or overrite the origional)
// AdjustImgOrientation::adjust($file, TRUE);

// adjust orientation and display the image
AdjustImgOrientation::adjust($file, FALSE);


class AdjustImgOrientation
{

    public function __construct($full_filename = FALSE)
    {
        if($full_filename !== FALSE)
            self::adjust($full_filename);
    }

    public static function adjust($full_filename = FALSE, $save = TRUE)
    {
        if(!$full_filename)
            return FALSE;

        $exif = exif_read_data($full_filename);

        if($exif && isset($exif['Orientation']))
        {
            $orientation = $exif['Orientation'];

            if($orientation !== 1)
            {
                // loop through the image formats so that we read the image correctly
                switch ($exif['FileType'])
                {
                    case 1:
                        $img = imagecreatefromgif($full_filename);
                        break;

                    case 2:
                        $img = imagecreatefromjpeg($full_filename);
                        break;

                    case 3:
                        $img = imagecreatefrompng($full_filename);
                        break;

                    case 6:
                    case 15:
                        $img = imagecreatefromwbmp($full_filename);
                        break;

                    default:
                        throw new Exception("File Type not supported", 1);
                        return FALSE;
                        break;
                }

                // define default options
                $mirror = FALSE;
                $deg    = 0;

                // loop through the orientations and set the options
                switch ($orientation)
                {
                  case 2:
                    $mirror = TRUE;
                    break;

                  case 3:
                    $deg = 180;
                    break;

                  case 4:
                    $deg = 180;
                    $mirror = TRUE;
                    break;

                  case 5:
                    $deg = 270;
                    $mirror = TRUE;
                    break;

                  case 6:
                    $deg = 270;
                    break;

                  case 7:
                    $deg = 90;
                    $mirror = TRUE;
                    break;

                  case 8:
                    $deg = 90;
                    break;
                }

                if($deg)
                    $img = imagerotate($img, $deg, 0);

                if($mirror)
                    $img = self::mirrorImage($img);


                // save or overwite the origional image
                if($save)
                {
                    // check if its a remote image that we are loading
                    if(stripos($full_filename, 'http') !== FALSE)
                    {
                        $file_uri = explode('/', $full_filename);
                        $full_filename = $file_uri[count($file_uri) - 1];
                    }
                }
                else
                {
                    $full_filename = NULL;
                }

                // just display the image
                switch ($exif['FileType'])
                {
                    case 1:
                        @header("Content-Type: Image/Gif");
                        imagegif($img, $full_filename);
                        break;

                    case 2:
                        @header("Content-Type: Image/Jpeg");
                        imagejpeg($img, $full_filename, 100);
                        break;

                    case 3:
                        @header("Content-Type: Image/Png");
                        imagepng($img, $full_filename, 100);
                        break;

                    case 6:
                    case 15:
                        @header("Content-Type: Image/Wbmp");
                        imagewbmp($img, $full_filename);
                        break;
                }

                // cleanup
                imagedestroy($img);
            }
        }
        return $full_filename;
    }

    private static function mirrorImage($imgsrc)
    {
        $width  = imagesx($imgsrc);
        $height = imagesy($imgsrc);

        $src_x      = $width - 1;
        $src_y      = 0;
        $src_width  =- $width;
        $src_height = $height;

        $imgdest = imagecreateTRUEcolor($width, $height);

        if(imagecopyresampled($imgdest, $imgsrc, 0, 0, $src_x, $src_y, $width, $height, $src_width, $src_height))
        {
            return $imgdest;
        }

        return $imgsrc;
    }

}

// eof.