Hi,
I need to generate thumbnails for pictures uploaded with my form. I want this to be reusable (so i can attach it to any file field in any form) so my question is - how to implement it? as a filter? validator? something else?
Hi,
I need to generate thumbnails for pictures uploaded with my form. I want this to be reusable (so i can attach it to any file field in any form) so my question is - how to implement it? as a filter? validator? something else?
I imagine the best way would be just to use a php script on upload to save a separate thumbnail.
And also, If you don't mind be sure to post your file upload system as I'm trying to refine the upload example in my code dump.
This is a basic code I made for my site
Maybe it will need some fixing to fit your needs.
I'm just learning yii so it will sure needs some improvements
<?php
class SThumbnail extends CComponent {
const JPG = 0;
const GIF = 1;
const PNG = 2;
private $_image;
private $_thumbnail;
private $_thumbnailWidth;
private $_thumbnailHeight;
private $_thumbnailDir;
private $_imageWidth;
private $_imageHeight;
private $_imageDir;
private $_imageType;
private $_imageBaseName;
private $_imageFileName;
private $_thumbnailBaseName;
private $_thumbnailFileName;
private $_thumbnailType;
private $_sourceImage;
private $_destinationImage;
/**
* Creates a thumbnail of an image
* @param String $image The full path of the original image
* @param String $thumbnail The full path of the thumbnail to create
* @param int $thumbWidth The thumbnail width
* @return boolean true if the thumbnailer was created
*/
public function __construct($image,$thumbnail = "" ,$thumbWidth = 150) {
$this->_image = $image;
$imageInfo = pathinfo($image);
$this->_imageBaseName = $imageInfo['basename'];
$this->_imageFileName = $imageInfo['filename'];
$this->_imageDir = $imageInfo['dirname'];
$this->_imageType= $this->getImageType(strtolower($imageInfo['extension']));
if(!$thumbnail) {
$this->_thumbnailBaseName = $this->_imageFileName."_thumb.".$this->getImageTypeText($this->_imageType);
$this->_thumbnailFileName = $this->_imageFileName."_thumb";
$this->_thumbnailDir = $this->_imageDir;
$this->_thumbnailType= $this->_imageType;
} else {
$thumbnailInfo = pathinfo($thumbnail);
$this->_thumbnailBaseName = $thumbnailInfo['basename'];
$this->_thumbnailFileName = $thumbnailInfo['filename'];
$this->_thumbnailDir = $thumbnailInfo['dirname'];
$this->_thumbnailType= $this->getImageType(strtolower($imageInfo['extension']));
}
$this->_thumbnailWidth = $thumbWidth;
switch ($this->_imageType) {
case 0:
$this->_sourceImage=imagecreatefromjpeg($this->_thumbnailDir."/".$this->_imageBaseName);
break;
case 1:
$this->_sourceImage=imagecreatefromgif($this->_thumbnailDir."/".$this->_imageBaseName);
break;
case 2:
$this->_sourceImage=imagecreatefrompng($this->_thumbnailDir."/".$this->_imageBaseName);
break;
default:
return false;
break;
}
return true;
}
public function createthumb() {
$this->_imageWidth = imageSX($this->_sourceImage);
$this->_imageHeight=imageSY($this->_sourceImage);
$this->_thumbnailHeight=$this->_imageHeight*($this->_thumbnailWidth/$this->_imageWidth);
$this->_destinationImage=ImageCreateTrueColor($this->_thumbnailWidth,$this->_thumbnailHeight);
imagecopyresampled($this->_destinationImage,
$this->_sourceImage,
0,0,0,0,
$this->_thumbnailWidth,
$this->_thumbnailHeight,
$this->_imageWidth,
$this->_imageHeight);
switch ($this->_thumbnailType) {
case 0:
imagejpeg($this->_destinationImage,$this->_thumbnailDir."/".$this->_thumbnailBaseName);
break;
case 1:
imagegif($this->_destinationImage,$this->_thumbnailDir."/".$this->_thumbnailBaseName);
break;
case 2:
imagepng($this->_destinationImage,$this->_thumbnailDir."/".$this->_thumbnailBaseName);
break;
default:
return false;
break;
}
imagedestroy($this->_destinationImage);
imagedestroy($this->_sourceImage);
}
private function getImageType($type) {
if (preg_match('/jpg|jpeg/',$type)) {
return self::JPG;
}
else if (preg_match('/png/',$type)) {
return self::PNG;
}
else if (preg_match('/gif/',$type)) {
return self::GIF;
}
}
private function getImageTypeText($type){
switch ($type) {
case 0:
return "jpg";
break;
case 1:
return "gif";
break;
case 2:
return "png";
break;
default:
return false;
break;
}
}
public function getThumbnailBaseName(){
return $this->_thumbnailBaseName;
}
}
?>
The usage is : (eg. for an image in news section)
const IMAGE_PATH = "images/news";
$imageFile = CUploadedFile::getInstanceByName("news[image]");
if($imageFile != "") {
$imageFile->saveAs(self::IMAGE_PATH . "/".$imageFile->getName(),false);
$this->image = $imageFile->getName(self::IMAGE_PATH . "/".$imageFile->getName());
$thumbnail = new SThumbnail(
self::IMAGE_PATH . "/".$imageFile->getName(),
"",
100);
$thumbnail->createthumb();
$this->thumbnail = $thumbnail->getThumbnailBaseName();
}
Thanks Spyros, this approach looks good, i haven’t thought about the simplest method ![]()
exactly what i was looking for, thanks!
you’re welcome
Anyway if you need to manage a multi image upload with autoresize you can take al look at this cookbook http://www.yiiframew…oc/cookbook/29/