From 81cfeb5b1c06cc28693c771ea3236dfaa2b11038 Mon Sep 17 00:00:00 2001 From: Andrey Kutejko Date: Mon, 22 Apr 2013 00:14:44 +0300 Subject: [PATCH] image class --- ipf/image.php | 232 ++++++++++++++++++++++++++++++++++++++++ ipf/image/thumbnail.php | 178 ------------------------------ 2 files changed, 232 insertions(+), 178 deletions(-) create mode 100644 ipf/image.php delete mode 100644 ipf/image/thumbnail.php diff --git a/ipf/image.php b/ipf/image.php new file mode 100644 index 0000000..504054d --- /dev/null +++ b/ipf/image.php @@ -0,0 +1,232 @@ +image = $image; + $this->width = ($width !== null) ? $width : imagesx($image); + $this->height = ($height !== null) ? $height : imagesy($image); + $this->type = $type; + $this->path = $path; + } + + public function __destruct() + { + imagedestroy($this->image); + } + + private static function detectType($filename) + { + if (preg_match('/\.je?pg$/i', $filename)) + return IMAGETYPE_JPEG; + if (preg_match('/\.gif$/i', $filename)) + return IMAGETYPE_GIF; + if (preg_match('/\.png$/i', $filename)) + return IMAGETYPE_PNG; + return null; + } + + public function save($filename=null) + { + $type = null; + if ($filename) { + $type = self::detectType($filename); + } else { + $filename = $this->path; + if ($this->type) + $type = $this->type; + else + $type = self::detectType($filename); + } + + if (!$filename) + throw new Exception('No filename given.'); + + if ($type == IMAGETYPE_JPEG) + imagejpeg($this->image, $filename); + else if ($type == IMAGETYPE_GIF) + imagegif($this->image, $filename); + else if ($type == IMAGETYPE_PNG) + imagepng($this->image, $filename); + else + throw new Exception('Unknown file type.'); + } + + private function color($color) + { + return imagecolorallocatealpha($this->image, + ($color >> 16) & 0xFF, + ($color >> 8) & 0xFF, + $color & 0xFF, + ($color >> 24) & 0x7F); + } + + public function fill($x, $y, $width, $height, $color) + { + imagefilledrectangle($this->image, $x, $y, $width, $height, $this->color($color)); + } + + public function rotate($angle, $color=0x7F000000) + { + $image = imagerotate($this->image, $angle, $color); + return new IPF_Image($image); + } + + public function copy(IPF_Image $image, $dstX, $dstY) + { + imagecopy($this->image, $image->image, $dstX, $dstY, 0, 0, $image->width, $image->height); + } + + public function copyPart(IPF_Image $image, $dstX, $dstY, $srcX, $srcY, $width, $height) + { + imagecopy($this->image, $image->image, $dstX, $dstY, $srcX, $srcY, $width, $height); + } + + public function copyScale(IPF_Image $image, $dstX=0, $dstY=0, $dstWidth=null, $dstHeight=null, $srcX=0, $srcY=0, $srcWidth=null, $srcHeight=null) + { + if ($dstWidth === null) + $dstWidth = $this->width; + if ($dstHeight === null) + $dstHeight = $this->height; + if ($srcWidth === null) + $srcWidth = $image->width; + if ($srcHeight === null) + $srcHeight = $image->height; + imagecopyresampled($this->image, $image->image, $dstX, $dstY, $srcX, $srcY, $dstWidth, $dstHeight, $srcWidth, $srcHeight); + } + + public function diagonalWatermark(IPF_Image $watermark) + { + $result = IPF_Image::create($this->width, $this->height); + $result->copy($this, 0, 0); + + $w_repeat = ceil(hypot($this->width, $this->height) / (float)$watermark->width); + $angle = atan2($this->height, $this->width); + $wmr = $watermark->rotate(-$angle * 180 / M_PI); + + $dx = $watermark->width * cos($angle); + $dy = $watermark->width * sin($angle); + + for ($i = 0; $i < $w_repeat; ++$i) { + $result->copy($wmr, $dx * ($i - 0.5), $dy * ($i - 0.5)); + } + return $result; + } + + public function fitWidth($width, $expand=true, $shrink=true) + { + if ($this->width == $width) + return $this; + if (!$expand && $this->width < $width) + return $this; + if (!$shrink && $this->width > $width) + return $this; + + $height = $width * $this->height / $this->width; + + $result = IPF_Image::create($width, $height); + $result->copyScale($this); + return $result; + } + + public function fitHeight($height, $expand=true, $shrink=true) + { + if ($this->height == $height) + return $this; + if (!$expand && $this->height < $height) + return $this; + if (!$shrink && $this->height > $height) + return $this; + + $width = $height * $this->width / $this->height; + + $result = IPF_Image::create($width, $height); + $result->copyScale($this); + return $result; + } + + public function fit($width, $height, $expand=true, $shrink=true) + { + if (!$expand && $this->width < $width && $this->height < $height) + return $this; + if (!$shrink && $this->width > $width && $this->height > $height) + return $this; + + if ($this->height * $width >= $this->width * $height) { + $w = $height * $this->width / $this->height; + $h = $height; + } else { + $w = $width; + $h = $width * $this->height / $this->width; + } + + $result = IPF_Image::create($w, $h); + $result->copyScale($this); + return $result; + } + + public function thumbnailCrop($width, $height, $gravityX=0.5, $gravityY=0.5) + { + if ($this->height * $width >= $this->width * $height) { + $w = $this->width; + $h = $this->width * $height / $width; + } else { + $w = $this->height * $width / $height; + $h = $this->height; + } + $x = ($this->width - $w) * $gravityX; + $y = ($this->height - $h) * $gravityY; + + $result = IPF_Image::create($width, $height); + $result->copyScale($this, 0, 0, $width, $height, $x, $y, $w, $h); + return $result; + } + + public function thumbnailFill($width, $height, $color=0x7F000000, $gravityX=0.5, $gravityY=0.5) + { + if ($this->height * $width >= $this->width * $height) { + $w = $height * $this->width / $this->height; + $h = $height; + } else { + $w = $width; + $h = $width * $this->height / $this->width; + } + $x = ($width - $w) * $gravityX; + $y = ($height - $h) * $gravityY; + + $result = IPF_Image::create($width, $height); + $result->fill(0, 0, $width, $height, $color); + $result->copyScale($this, $x, $y, $w, $h); + return $result; + } +} + diff --git a/ipf/image/thumbnail.php b/ipf/image/thumbnail.php deleted file mode 100644 index a651943..0000000 --- a/ipf/image/thumbnail.php +++ /dev/null @@ -1,178 +0,0 @@ -Source = $source; - if ($thumbnail) - $this->Thumbnail = $thumbnail; - else - $this->Thumbnail = $source; - - if (($width==null) && ($height==null)) - throw new IPF_Exception_Image(__('Please Specify width or height')); - - $this->ThumbnailWidth = $width; - $this->ThumbnailHeight = $height; - - if ($dir_permission) - $this->dir_permission = $dir_permission; - else - $this->dir_permission = IPF::get('dir_permission'); - - if ($file_permission) - $this->file_permission = $file_permission; - else - $this->file_permission = IPF::get('file_permission'); - - $this->sourceRemove = $sourceRemove; - } - - public function execute($keepTransparency=false){ - $ImageInfo = getimagesize($this->Source); - if(!$ImageInfo) - throw new IPF_Exception_Image(sprintf(__('Cannot open %s image file'), $this->Source)); - - $this->SourceWidth = $ImageInfo[0]; - $this->SourceHeight = $ImageInfo[1]; - $this->SourceType = $ImageInfo[2]; - - if($this->SourceType==IMAGETYPE_JPEG) - $im = ImageCreateFromJPEG($this->Source); - else if($this->SourceType==IMAGETYPE_GIF) - $im = ImageCreateFromGIF($this->Source); - else if($this->SourceType==IMAGETYPE_PNG) - $im = ImageCreateFromPNG($this->Source); - else - throw new IPF_Exception_Image(sprintf(__('Unknown image format %s'), $this->Source)); - - if($this->ThumbnailWidth) - $c1 = $this->SourceWidth/abs($this->ThumbnailWidth); - else - $c1 = 0; - - if($this->ThumbnailHeight) - $c2 = $this->SourceHeight/abs($this->ThumbnailHeight); - else - $c2 = 0; - - $c = $c1>$c2 ? $c1 : $c2; - - if($c<=1){ - $this->ThumbnailWidth = $this->SourceWidth; - $this->ThumbnailHeight = $this->SourceHeight; - if($this->Source<>$this->Thumbnail) - if (!@copy($this->Source, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot copy %s to %s'), $this->Source, $this->Thumbnail)); - } - else{ - if($this->ThumbnailWidth<0 and $this->SourceWidth/$c<(-$this->ThumbnailWidth)) - $c = $this->SourceWidth/(-$this->ThumbnailWidth); - if($this->ThumbnailHeight<0 and $this->SourceHeight/$c<(-$this->ThumbnailHeight)) - $c = $this->SourceHeight/(-$this->ThumbnailHeight); - - $this->ThumbnailWidth = $this->SourceWidth/$c; - $this->ThumbnailHeight = $this->SourceHeight/$c; - - $tn = imagecreatetruecolor($this->ThumbnailWidth, $this->ThumbnailHeight); - - if ($keepTransparency && $this->SourceType==IMAGETYPE_PNG) - { - imagealphablending($tn, false); - imagefill($tn, 0, 0, imagecolortransparent($tn, imagecolorallocatealpha($tn, 0, 0, 0, 127))); - imagesavealpha($tn, true); - } - - imagecopyresampled( - $tn, $im, 0, 0, 0, 0, - $this->ThumbnailWidth, $this->ThumbnailHeight, - $this->SourceWidth, $this->SourceHeight - ); - if ($this->sourceRemove){ - if (!@unlink($this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot delete %s'), $this->Thumbnail)); - } - $dir_thumbnail = dirName($this->Thumbnail); - if (!IPF_Utils::makeDirectories(dirName($this->Thumbnail), $this->dir_permission)) - throw new IPF_Exception_Image(sprintf(__('Cannot create path %s'), $dir_thumbnail)); - - if($this->SourceType==IMAGETYPE_JPEG){ - if (!ImageJPEG($tn, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot create JPEG %s'), $this->Thumbnail)); - } - else if($this->SourceType==IMAGETYPE_GIF){ - if (!ImageGIF($tn, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot create GIF %s'), $this->Thumbnail)); - } - else if($this->SourceType==IMAGETYPE_PNG){ - if (!ImagePNG($tn, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot create PNG %s'), $this->Thumbnail)); - } - else - throw new IPF_Exception_Image(sprintf(__('Unknown image format %s'), $this->Source)); - - if (!@chmod($this->Thumbnail, $this->file_permission)) - throw new IPF_Exception_Image(sprintf(__('Cannot change permission %s'), $this->Thumbnail)); - } - } - - public function execDumb(){ - $ImageInfo = getimagesize($this->Source); - if(!$ImageInfo) - throw new IPF_Exception_Image(sprintf(__('Cannot open %s image file'), $this->Source)); - - $this->SourceWidth = $ImageInfo[0]; - $this->SourceHeight = $ImageInfo[1]; - $this->SourceType = $ImageInfo[2]; - - if($this->SourceType==IMAGETYPE_JPEG) - $im = ImageCreateFromJPEG($this->Source); - else if($this->SourceType==IMAGETYPE_GIF) - $im = ImageCreateFromGIF($this->Source); - else if($this->SourceType==IMAGETYPE_PNG) - $im = ImageCreateFromPNG($this->Source); - else - throw new IPF_Exception_Image(sprintf(__('Unknown image format %s'), $this->Source)); - - $tn = imagecreatetruecolor($this->ThumbnailWidth, $this->ThumbnailHeight); - - imagecopyresampled( - $tn, $im, 0, 0, 0, 0, - $this->ThumbnailWidth, $this->ThumbnailHeight, - $this->SourceWidth, $this->SourceHeight - ); - - if ($this->sourceRemove){ - if (!@unlink($this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot delete %s'), $this->Thumbnail)); - } - $dir_thumbnail = dirName($this->Thumbnail); - if (!IPF_Utils::makeDirectories(dirName($this->Thumbnail), $this->dir_permission)) - throw new IPF_Exception_Image(sprintf(__('Cannot create path %s'), $dir_thumbnail)); - - if($this->SourceType==IMAGETYPE_JPEG){ - if (!ImageJPEG($tn, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot create JPEG %s'), $this->Thumbnail)); - } - else if($this->SourceType==IMAGETYPE_GIF){ - if (!ImageGIF($tn, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot create GIF %s'), $this->Thumbnail)); - } - else if($this->SourceType==IMAGETYPE_PNG){ - if (!ImagePNG($tn, $this->Thumbnail)) - throw new IPF_Exception_Image(sprintf(__('Cannot create PNG %s'), $this->Thumbnail)); - } - else - throw new IPF_Exception_Image(sprintf(__('Unknown image format %s'), $this->Source)); - - if (!@chmod($this->Thumbnail, $this->file_permission)) - throw new IPF_Exception_Image(sprintf(__('Cannot change permission %s'), $this->Thumbnail)); - } -} -?> -- 2.49.0