TalkPHP
 
 
Account Login
Latest Articles
» The basic usage of PHPTAL, a XML/XHTML template library for PHP
» Vulnerable methods and the areas they are commonly trusted in.
» Simple way to protect a form from bot
» The Basics On: How Session Stealing Works
» How to keep your forms from double posting data
IRC Channel
IRC Speech Bubble Join the friendly bunch on IRC...
(#TalkPHP on Freenode)

...Also available via a web interface.

See this thread for information on the TalkPHP Free Hugs Initiative™. Subject to availability.
Associates
Associates
CSS Tutorials
Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old 03-03-2009, 05:33 PM   #1 (permalink)
The Contributor
 
tego10122's Avatar
 
Join Date: Sep 2008
Location: Miami
Posts: 39
Thanks: 7
tego10122 is on a distinguished road
Default Help making this a class

PHP Code:
<?php
// Smart Image Resizer 1.4.1
// Resizes images, intelligently sharpens, crops based on width:height ratios, color fills
// transparent GIFs and PNGs, and caches variations for optimal performance

// Created by: Joe Lencioni (http://shiftingpixel.com)
// Date: August 6, 2008
// Based on: http://veryraw.com/history/2005/03/image-resizing-with-php/

/////////////////////
// LICENSE
/////////////////////

// I love to hear when my work is being used, so if you decide to use this, feel encouraged
// to send me an email. Smart Image Resizer is released under a Creative Commons
// Attribution-Share Alike 3.0 United States license
// (http://creativecommons.org/licenses/by-sa/3.0/us/). All I ask is that you include a link
// back to Shifting Pixel (either this page or shiftingpixel.com), but don’t worry about
// including a big link on each page if you don’t want to–one will do just nicely. Feel
// free to contact me to discuss any specifics (joe@shiftingpixel.com).

/////////////////////
// REQUIREMENTS
/////////////////////

// PHP and GD

/////////////////////
// PARAMETERS
/////////////////////

// Parameters need to be passed in through the URL's query string:
// image        absolute path of local image starting with "/" (e.g. /images/toast.jpg)
// width        maximum width of final image in pixels (e.g. 700)
// height        maximum height of final image in pixels (e.g. 700)
// color        (optional) background hex color for filling transparent PNGs (e.g. 900 or 16a942)
// cropratio    (optional) ratio of width to height to crop final image (e.g. 1:1 or 3:2)
// nocache        (optional) does not read image from the cache
// quality        (optional, 0-100, default: 90) quality of output image

/////////////////////
// EXAMPLES
/////////////////////

// Resizing a JPEG:
// <img src="/image.php/image-name.jpg?width=100&amp;height=100&amp;image=/path/to/image.jpg" alt="Don't forget your alt text" />

// Resizing and cropping a JPEG into a square:
// <img src="/image.php/image-name.jpg?width=100&amp;height=100&amp;cropratio=1:1&amp;image=/path/to/image.jpg" alt="Don't forget your alt text" />

// Matting a PNG with #990000:
// <img src="/image.php/image-name.png?color=900&amp;image=/path/to/image.png" alt="Don't forget your alt text" />

/////////////////////
// CODE STARTS HERE
/////////////////////

if (!isset($_GET['image']))
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: no image was specified';
    exit();
}

define('MEMORY_TO_ALLOCATE',    '100M');
define('DEFAULT_QUALITY',        90);
define('CURRENT_DIR',            dirname(__FILE__));
define('CACHE_DIR_NAME',        '/images/cache/');
define('CACHE_DIR',                CURRENT_DIR CACHE_DIR_NAME);
define('DOCUMENT_ROOT',            $_SERVER['DOCUMENT_ROOT']);

// Images must be local files, so for convenience we strip the domain if it's there
$image            preg_replace('/^(s?f|ht)tps?:\/\/[^\/]+/i''', (string) $_GET['image']);

// For security, directories cannot contain ':', images cannot contain '..' or '<', and
// images must start with '/'
if ($image{0} != '/' || strpos(dirname($image), ':') || preg_match('/(\.\.|<|>)/'$image))
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: malformed image path. Image paths must begin with \'/\'';
    exit();
}

// If the image doesn't exist, or we haven't been told what it is, there's nothing
// that we can do
if (!$image)
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: no image was specified';
    exit();
}

// Strip the possible trailing slash off the document root
$docRoot    preg_replace('/\/$/'''DOCUMENT_ROOT);

if (!
file_exists($docRoot $image))
{
    
header('HTTP/1.1 404 Not Found');
    echo 
'Error: image does not exist: ' $docRoot $image;
    exit();
}

// Get the size and MIME type of the requested image
$size    GetImageSize($docRoot $image);
$mime    $size['mime'];

// Make sure that the requested file is actually an image
if (substr($mime06) != 'image/')
{
    
header('HTTP/1.1 400 Bad Request');
    echo 
'Error: requested file is not an accepted type: ' $docRoot $image;
    exit();
}

$width            $size[0];
$height            $size[1];

$maxWidth        = (isset($_GET['width'])) ? (int) $_GET['width'] : 0;
$maxHeight        = (isset($_GET['height'])) ? (int) $_GET['height'] : 0;

if (isset(
$_GET['color']))
    
$color        preg_replace('/[^0-9a-fA-F]/''', (string) $_GET['color']);
else
    
$color        FALSE;

// If either a max width or max height are not specified, we default to something
// large so the unspecified dimension isn't a constraint on our resized image.
// If neither are specified but the color is, we aren't going to be resizing at
// all, just coloring.
if (!$maxWidth && $maxHeight)
{
    
$maxWidth    99999999999999;
}
elseif (
$maxWidth && !$maxHeight)
{
    
$maxHeight    99999999999999;
}
elseif (
$color && !$maxWidth && !$maxHeight)
{
    
$maxWidth    $width;
    
$maxHeight    $height;
}

// If we don't have a max width or max height, OR the image is smaller than both
// we do not want to resize it, so we simply output the original image and exit
if ((!$maxWidth && !$maxHeight) || (!$color && $maxWidth >= $width && $maxHeight >= $height))
{
    
$data    file_get_contents($docRoot '/' $image);
    
    
$lastModifiedString    gmdate('D, d M Y H:i:s'filemtime($docRoot '/' $image)) . ' GMT';
    
$etag                md5($data);
    
    
doConditionalGet($etag$lastModifiedString);
    
    
header("Content-type: $mime");
    
header('Content-Length: ' strlen($data));
    echo 
$data;
    exit();
}

// Ratio cropping
$offsetX    0;
$offsetY    0;

if (isset(
$_GET['cropratio']))
{
    
$cropRatio        explode(':', (string) $_GET['cropratio']);
    if (
count($cropRatio) == 2)
    {
        
$ratioComputed        $width $height;
        
$cropRatioComputed    = (float) $cropRatio[0] / (float) $cropRatio[1];
        
        if (
$ratioComputed $cropRatioComputed)
        { 
// Image is too tall so we will crop the top and bottom
            
$origHeight    $height;
            
$height        $width $cropRatioComputed;
            
$offsetY    = ($origHeight $height) / 2;
        }
        else if (
$ratioComputed $cropRatioComputed)
        { 
// Image is too wide so we will crop off the left and right sides
            
$origWidth    $width;
            
$width        $height $cropRatioComputed;
            
$offsetX    = ($origWidth $width) / 2;
        }
    }
}

// Setting up the ratios needed for resizing. We will compare these below to determine how to
// resize the image (based on height or based on width)
$xRatio        $maxWidth $width;
$yRatio        $maxHeight $height;

if (
$xRatio $height $maxHeight)
// Resize the image based on width
    
$tnHeight    ceil($xRatio $height);
    
$tnWidth    $maxWidth;
}
else 
// Resize the image based on height
{
    
$tnWidth    ceil($yRatio $width);
     
$tnHeight    $maxHeight;
}

// Determine the quality of the output image
$quality    = (isset($_GET['quality'])) ? (int) $_GET['quality'] : DEFAULT_QUALITY;

// Before we actually do any crazy resizing of the image, we want to make sure that we
// haven't already done this one at these dimensions. To the cache!
// Note, cache must be world-readable

// We store our cached image filenames as a hash of the dimensions and the original filename
$resizedImageSource        $tnWidth 'x' $tnHeight 'x' $quality;
if (
$color)
    
$resizedImageSource    .= 'x' $color;
if (isset(
$_GET['cropratio']))
    
$resizedImageSource    .= 'x' . (string) $_GET['cropratio'];
$resizedImageSource        .= '-' $image;

$resizedImage    md5($resizedImageSource);
    
$resized        CACHE_DIR $resizedImage;

// Check the modified times of the cached file and the original file.
// If the original file is older than the cached file, then we simply serve up the cached file
if (!isset($_GET['nocache']) && file_exists($resized))
{
    
$imageModified    filemtime($docRoot $image);
    
$thumbModified    filemtime($resized);
    
    if(
$imageModified $thumbModified) {
        
$data    file_get_contents($resized);
    
        
$lastModifiedString    gmdate('D, d M Y H:i:s'$thumbModified) . ' GMT';
        
$etag                md5($data);
        
        
doConditionalGet($etag$lastModifiedString);
        
        
header("Content-type: $mime");
        
header('Content-Length: ' strlen($data));
        echo 
$data;
        exit();
    }
}

// We don't want to run out of memory
ini_set('memory_limit'MEMORY_TO_ALLOCATE);

// Set up a blank canvas for our resized image (destination)
$dst    imagecreatetruecolor($tnWidth$tnHeight);

// Set up the appropriate image handling functions based on the original image's mime type
switch ($size['mime'])
{
    case 
'image/gif':
        
// We will be converting GIFs to PNGs to avoid transparency issues when resizing GIFs
        // This is maybe not the ideal solution, but IE6 can suck it
        
$creationFunction    'ImageCreateFromGif';
        
$outputFunction        'ImagePng';
        
$mime                'image/png'// We need to convert GIFs to PNGs
        
$doSharpen            FALSE;
        
$quality            round(10 - ($quality 10)); // We are converting the GIF to a PNG and PNG needs a compression level of 0 (no compression) through 9
    
break;
    
    case 
'image/x-png':
    case 
'image/png':
        
$creationFunction    'ImageCreateFromPng';
        
$outputFunction        'ImagePng';
        
$doSharpen            FALSE;
        
$quality            round(10 - ($quality 10)); // PNG needs a compression level of 0 (no compression) through 9
    
break;
    
    default:
        
$creationFunction    'ImageCreateFromJpeg';
        
$outputFunction         'ImageJpeg';
        
$doSharpen            TRUE;
    break;
}

// Read in the original image
$src    $creationFunction($docRoot $image);

if (
in_array($size['mime'], array('image/gif''image/png')))
{
    if (!
$color)
    {
        
// If this is a GIF or a PNG, we need to set up transparency
        
imagealphablending($dstfalse);
        
imagesavealpha($dsttrue);
    }
    else
    {
        
// Fill the background with the specified color for matting purposes
        
if ($color[0] == '#')
            
$color substr($color1);
        
        
$background    FALSE;
        
        if (
strlen($color) == 6)
            
$background    imagecolorallocate($dsthexdec($color[0].$color[1]), hexdec($color[2].$color[3]), hexdec($color[4].$color[5]));
        else if (
strlen($color) == 3)
            
$background    imagecolorallocate($dsthexdec($color[0].$color[0]), hexdec($color[1].$color[1]), hexdec($color[2].$color[2]));
        if (
$background)
            
imagefill($dst00$background);
    }
}

// Resample the original image into the resized canvas we set up earlier
ImageCopyResampled($dst$src00$offsetX$offsetY$tnWidth$tnHeight$width$height);

if (
$doSharpen)
{
    
// Sharpen the image based on two things:
    //    (1) the difference between the original size and the final size
    //    (2) the final size
    
$sharpness    findSharp($width$tnWidth);
    
    
$sharpenMatrix    = array(
        array(-
1, -2, -1),
        array(-
2$sharpness 12, -2),
        array(-
1, -2, -1)
    );
    
$divisor        $sharpness;
    
$offset            0;
    
imageconvolution($dst$sharpenMatrix$divisor$offset);
}

// Make sure the cache exists. If it doesn't, then create it
if (!file_exists(CACHE_DIR))
    
mkdir(CACHE_DIR0755);

// Make sure we can read and write the cache directory
if (!is_readable(CACHE_DIR))
{
    
header('HTTP/1.1 500 Internal Server Error');
    echo 
'Error: the cache directory is not readable';
    exit();
}
else if (!
is_writable(CACHE_DIR))
{
    
header('HTTP/1.1 500 Internal Server Error');
    echo 
'Error: the cache directory is not writable';
    exit();
}

// Write the resized image to the cache
$outputFunction($dst$resized$quality);

// Put the data of the resized image into a variable
ob_start();
$outputFunction($dstnull$quality);
$data    ob_get_contents();
ob_end_clean();

// Clean up the memory
ImageDestroy($src);
ImageDestroy($dst);

// See if the browser already has the image
$lastModifiedString    gmdate('D, d M Y H:i:s'filemtime($resized)) . ' GMT';
$etag                md5($data);

doConditionalGet($etag$lastModifiedString);

// Send the image to the browser with some delicious headers
header("Content-type: $mime");
header('Content-Length: ' strlen($data));
echo 
$data;

function 
findSharp($orig$final// function from Ryan Rud (http://adryrun.com)
{
    
$final    $final * (750.0 $orig);
    
$a        52;
    
$b        = -0.27810650887573124;
    
$c        .00047337278106508946;
    
    
$result $a $b $final $c $final $final;
    
    return 
max(round($result), 0);
// findSharp()

function doConditionalGet($etag$lastModified)
{
    
header("Last-Modified: $lastModified");
    
header("ETag: \"{$etag}\"");
        
    
$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
        
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
        
false;
    
    
$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
        
stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
        
false;
    
    if (!
$if_modified_since && !$if_none_match)
        return;
    
    if (
$if_none_match && $if_none_match != $etag && $if_none_match != '"' $etag '"')
        return; 
// etag is there but doesn't match
    
    
if ($if_modified_since && $if_modified_since != $lastModified)
        return; 
// if-modified-since is there but doesn't match
    
    // Nothing has changed since their last request - serve a 304 and exit
    
header('HTTP/1.1 304 Not Modified');
    exit();
// doConditionalGet()

// old pond
// a frog jumps
// the sound of water

// —Matsuo Basho
?>
I need help creating this into a class so I can do the following.

PHP Code:
$this->resize($source$with$height); 
__________________
You're Everyday Graphic Artist
Twitter|GigPark|Linked In
Send a message via MSN to tego10122
tego10122 is offline  
Reply With Quote
Old 03-03-2009, 08:31 PM   #2 (permalink)
The Prestige
Upcoming Programmer Inquisitive 
 
Tanax's Avatar
 
Join Date: Sep 2007
Location: Sweden, Stockholm
Posts: 1,080
Thanks: 115
Tanax is on a distinguished road
Default

Well, first of all $this-> can only be used within the class itself, and I doubt you mean that you want to call the resize from within the class.

Secondly, that's alot of code, and I don't think anyone will "make this a class". Someone might link you to a class that can do this, but to write a class of exactly this code, will probably take too long for anyone to do.

Try checking out some of the image classes released on talkphp, and check out pixel2life and other tutorial sites about image classes.
__________________
Tanax is offline  
Reply With Quote
Old 11-12-2012, 07:44 AM   #3 (permalink)
The Contributor
 
Join Date: Oct 2012
Posts: 46
Thanks: 0
ww628815 is on a distinguished road
Default

True Religion Canada the late 1980’s the designer jeans lost its popularity even so the trend of designer jeans begun to retort in early 2000. The designer jeans for men and females are created to fit our bodies, http://www.truereligionoutletcanada.ca/ are more fitted versus the traditional jeans.True Religion Outlet days there are designer jeans to comprehend relaxed fitting.
ww628815 is offline  
Reply With Quote
Reply



Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Similar Threads
Thread Thread Starter Forum Replies Last Post
[Tutorial] How to organize your classes | Part 1 Tanax Advanced PHP Programming 10 03-01-2009 10:08 PM
A Generic Singleton Base Class Theo Advanced PHP Programming 7 08-18-2008 02:25 AM
[Tutorial] Basic tutorial about class basics Tanax Absolute Beginners 14 07-24-2008 01:37 PM
PHP5 Classes A to Z Part 1 quantumkangaroo Advanced PHP Programming 11 04-01-2008 04:21 AM
Tutorial: PHP and OOP, a beginners guide Village Idiot Tips & Tricks 0 09-06-2007 04:23 PM


All times are GMT. The time now is 12:17 AM.

 
     

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0
Inactive Reminders By Icora Web Design