256 lines
8.3 KiB
PHP
256 lines
8.3 KiB
PHP
<?php
|
|
/*
|
|
By Joyce Johnston
|
|
http://www.uncontentio.us
|
|
April 18, 2009
|
|
http://fourmilestomay.com/2009/resize-crop-photos-php-gd-library/
|
|
*/
|
|
class Photo {
|
|
|
|
private $tmp_name;
|
|
private $name;
|
|
private $error;
|
|
private $max_size = 500000;
|
|
private $accepted_mime_types = array('image/jpeg','image/png','image/gif');
|
|
private $tmp;
|
|
private $src;
|
|
private $directory;
|
|
private $src_x;
|
|
private $src_y;
|
|
private $dst_x;
|
|
private $dst_y;
|
|
private $orig_width;
|
|
private $orig_height;
|
|
private $src_width;
|
|
private $src_height;
|
|
private $dst_width;
|
|
private $dst_height;
|
|
|
|
function __construct($file_info, $max_size='') {
|
|
|
|
$this->tmp_name = $file_info['tmp_name'];
|
|
$this->name = $file_info['name'];
|
|
$this->size = $file_info['size'];
|
|
$this->error = $file_info['error'];
|
|
$info = getimagesize($this->tmp_name);
|
|
$this->mime = $info['mime'];
|
|
$this->orig_width = $info[0];
|
|
$this->orig_height = $info[1];
|
|
if($max_size != '') { $this->max_size = $max_size; }
|
|
|
|
}
|
|
|
|
function validate() {
|
|
|
|
$errors = array();
|
|
if(!isset($error) || $this->error == 0 ) {
|
|
if (!in_array($this->mime,$this->accepted_mime_types)) {
|
|
$errors[] = 'Hold it! You may upload files of type .jpg, .jpeg, .gif, or .png. What you tried to upload was something else.';
|
|
}
|
|
if($photo->size > $photo->max_size) {
|
|
$errors[] = 'Whoa! Your photo is too big. File size cannot exceed '.($this->max_size/1000).'KB.';
|
|
}
|
|
}
|
|
else {
|
|
$errors[] = "There was a problem uploading your photo.
|
|
It may be that your photo is too big or that
|
|
something bad happened during upload. If your photo is less
|
|
than ".($this->max_size/1000)." in size, please try again.";
|
|
}
|
|
return $errors;
|
|
}
|
|
|
|
function getFileType() {
|
|
return $this->mime;
|
|
}
|
|
|
|
function getWidth() {
|
|
return $this->orig_width;
|
|
}
|
|
|
|
function getHeight() {
|
|
return $this->orig_height;
|
|
}
|
|
|
|
function getDimensionRatio() {
|
|
return $this->orig_width/$this->orig_height;
|
|
}
|
|
|
|
public function doResize($max_dimension,$directory) {
|
|
|
|
$errors = array();
|
|
$this->setDimensions($max_dimension);
|
|
$success = $this->resize($directory);
|
|
if(!$success) { $errors[] = 'Sorry! I couldn\'t resize your photo. Please try again later.'; }
|
|
return $errors;
|
|
}
|
|
|
|
public function doThumb($thumb_size,$directory) {
|
|
|
|
$errors = array();
|
|
$this->setThumbDimensions($thumb_size);
|
|
$success = $this->resize($directory);
|
|
if(!$success) { $errors[] = 'Sorry! I couldn\'t make a thumbnail for your image. Please try again later.'; }
|
|
return $errors;
|
|
}
|
|
|
|
public function doCenterCrop($x,$y,$directory='') {
|
|
|
|
$errors = array();
|
|
$success = $this->setCenterCropDimensions($x,$y);
|
|
$success = $success && $this->resize($directory);
|
|
if(!$success) { $errors[] = 'Sorry! I couldn\'t crop your image. Check your image dimensions.
|
|
If it is less than '.$x.'px by '.$y.'px, it is too small to crop.'; }
|
|
return $errors;
|
|
}
|
|
|
|
public function doFullCrop($x,$y,$width,$height,$directory='') {
|
|
|
|
$errors = array();
|
|
$success = $this->setFullCropDimensions($x,$y,$width,$height);
|
|
$success = $success && $this->resize($directory);
|
|
if(!$success) { $errors[] = 'Sorry! I couldn\'t crop your image. Check your image dimensions.
|
|
If it is less than '.$x.'px by '.$y.'px, it is too small to crop.'; }
|
|
return $errors;
|
|
}
|
|
|
|
|
|
public function move($directory) {
|
|
$errors = array();
|
|
$success = @move_uploaded_file($this->tmp_name, $directory.$this->name);
|
|
if(!$success) { $errors[] = 'Sorry! I couldn\'t store your image. Please try again later.'; }
|
|
return $errors;
|
|
}
|
|
|
|
private function setDimensions($max_dimension) {
|
|
if($this->getDimensionRatio() > 1) {
|
|
//our image is wider than it is tall
|
|
$this->dst_width = $max_dimension;
|
|
$this->dst_height=($this->orig_height/$this->orig_width)*$this->dst_width;
|
|
}
|
|
else {
|
|
$this->dst_height = $max_dimension;
|
|
$this->dst_width = ($this->orig_width*$this->dst_height)/$this->orig_height;
|
|
|
|
}
|
|
$this->src_width = $this->orig_width;
|
|
$this->src_height = $this->orig_height;
|
|
$this->src_x = 0;
|
|
$this->src_y = 0;
|
|
$this->dst_x = 0;
|
|
$this->dst_y = 0;
|
|
}
|
|
|
|
private function setThumbDimensions($thumb_size) {
|
|
|
|
//find the larger dimension, height or width
|
|
if($this->getDimensionRatio() > 1) {
|
|
//our src image is wider than it is tall
|
|
$this->src_x = 0 + (($this->orig_width-$this->orig_height)/2);
|
|
$this->src_y = 0;
|
|
$this->src_width = $this->orig_height;
|
|
$this->src_height = $this->orig_height;
|
|
|
|
}
|
|
else {
|
|
$this->src_x = 0;
|
|
$this->src_y = 0 + (($this->orig_height-$this->orig_width)/2);
|
|
$this->src_height = $this->orig_width;
|
|
$this->src_width = $this->orig_width;
|
|
}
|
|
$this->dst_width = $thumb_size;
|
|
$this->dst_height = $thumb_size;
|
|
$this->dst_x = 0;
|
|
$this->dst_y = 0;
|
|
|
|
}
|
|
|
|
private function setCenterCropDimensions($x,$y) {
|
|
|
|
//if the image is smaller than crop size
|
|
//if($this->orig_width < $x || $this->orig_height < $y) {
|
|
// return false;
|
|
// exit;
|
|
//}
|
|
//we're always going to crop from center
|
|
$this->src_x = 0 + (($this->orig_width-$x)/2);
|
|
$this->src_y = 0 + (($this->orig_height-$y)/2);
|
|
$this->dst_x = 0;
|
|
$this->dst_y = 0;
|
|
$this->dst_width = $x;
|
|
$this->dst_height = $y;
|
|
$this->src_width = $x;
|
|
$this->src_height = $y;
|
|
return true;
|
|
}
|
|
|
|
private function setFullCropDimensions($x,$y,$width,$height) {
|
|
|
|
$this->src_x = $x;
|
|
$this->src_y = $y;
|
|
$this->dst_x = 0;
|
|
$this->dst_y = 0;
|
|
$this->dst_width = $width;
|
|
$this->dst_height = $height;
|
|
$this->src_width = $width;
|
|
$this->src_height = $height;
|
|
return true;
|
|
}
|
|
|
|
private function resize($directory) {
|
|
|
|
|
|
// create an Image to resize
|
|
//$this->src = imagecreatefromjpeg($this->tmp_name);
|
|
$this->createImage();
|
|
|
|
// get all of the sizes
|
|
$width=$this->src_width;
|
|
$height=$this->src_height;
|
|
$newheight=$this->dst_height;
|
|
$newwidth=$this->dst_width;
|
|
$src_x = $this->src_x;
|
|
$src_y = $this->src_y;
|
|
$this->tmp= @imagecreatetruecolor($newwidth,$newheight);
|
|
$whiteimg = @imagecreatetruecolor($newwidth,$newheight);
|
|
|
|
$white = imagecolorallocate($whiteimg, 255, 255, 255);
|
|
|
|
//Make the background white
|
|
imagefill($this->tmp, 0, 0, $white);
|
|
|
|
// resize image
|
|
|
|
$success = @imagecopyresampled($this->tmp,$this->src,0,0,$src_x,$src_y,$newwidth,$newheight,$width,$height);
|
|
|
|
// write the resized image to disk.
|
|
$filename = $directory.$this->name;
|
|
$success = @imagejpeg($this->tmp,$filename, 90);
|
|
// clean up
|
|
imagedestroy($this->src);
|
|
imagedestroy($this->tmp);
|
|
return $success;
|
|
}
|
|
|
|
|
|
|
|
private function createImage() {
|
|
|
|
switch ($this->mime) {
|
|
case 'image/jpeg':
|
|
$this->src = @imagecreatefromjpeg($this->tmp_name);
|
|
break;
|
|
case 'image/gif':
|
|
$this->src = @imagecreatefromgif($this->tmp_name);
|
|
break;
|
|
case 'image/png':
|
|
$this->src = @imagecreatefrompng($this->tmp_name);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
?>
|