gest366/lib/photo.class.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;
}
}
}
?>