PHP « Создание превьюшек изображений
Каким образом лучше всего создавать превьюшки картинок не используя Imagick? именно native средствами PHP. Если приведете кусочек кода буду счастлив :)
1 ответов
недавно нашёл в сети очень приятный класс, слегка доработал и заюзал:
class sImg {
var $image;
var $image_type;
function load( $filename )
{
$image_info = getimagesize( $filename );
$this->image_type = $image_info[2];
unset($image_info);
if( $this->image_type == IMAGETYPE_JPEG ) $this->image = imagecreatefromjpeg( $filename );
elseif( $this->image_type == IMAGETYPE_GIF ) $this->image = imagecreatefromgif ( $filename );
elseif( $this->image_type == IMAGETYPE_PNG ) $this->image = imagecreatefrompng ( $filename );
}
function save( $filename, $compression = 95, $permissions = 0666 )
{
imagejpeg( $this->image, $filename, $compression );
if( $permissions != null ) chmod( $filename, $permissions );
}
function getWidth()
{
return imagesx( $this->image );
}
function getHeight()
{
return imagesy( $this->image );
}
function getRatio()
{
$i = ($this->getWidth()) / ($this->getHeight());
return substr($i,0,4);
unset($i);
}
function resizeToHeight( $height )
{
$ratio = $height / $this->getHeight();
$width = $this->getWidth() * $ratio;
$this->resize( $width, $height );
}
function resizeToWidth( $width )
{
$ratio = $width / $this->getWidth();
$height = $this->getheight() * $ratio;
$this->resize( $width, $height );
}
function scale( $scale )
{
$width = $this->getWidth() * $scale/100;
$height = $this->getheight() * $scale/100;
$this->resize( $width, $height );
}
function resize( $width, $height )
{
$new_image = imagecreatetruecolor( $width, $height );
imagecopyresampled( $new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight() );
$this->image = $new_image;
ImageDestroy($new_image);
}
function crop( $width, $height )
{
$new_image = imagecreatetruecolor( $width, $height );
imagecopy( $new_image, $this->image, 0, 0, 0, 0, $width, $height );
$this->image = $new_image;
ImageDestroy($new_image);
}
}
Вот кусок куда для примера. Думаю, разберетесь.
$_image_ = "/usr/local/www/site/img/3.jpg";
$cached_filename = "/tmp/3.jpg";
$_size_ = 80; // preview size = 80px
$imagedata = @getimagesize($_image_);
if($imagedata === FALSE || !$imagedata[0]) exit();
$new_h = (int)($imagedata[1]*($new_w/$imagedata[0]));
if(($_size_) AND ($new_h > $_size_))
{
$new_h = $_size_;
$new_w = (int)($imagedata[0]*($new_h/$imagedata[1]));
}
header("Content-type: image/jpg");
$dst_img=ImageCreate($new_w,$new_h);
$src_img=ImageCreateFromJpeg($_image_);
$dst_img=ImageCreateTruecolor($new_w, $new_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
Imagejpeg($dst_img, $cached_filename, $_quality_);
readfile ($cached_filename);
ImageDestroy($dst_img);
ImageDestroy($src_img);
Думаю следует уточнить, что native все равно не получится, нужна библиотека gd, правда во всех виндовых сборках она идет по дефолту.
Есть хороший скрипт в тему - www.image-resizer.ru
Использует библиотеку GD2.
Уменьшает по ширине и высоте, обрезает лишнее с краёв, приводит к одному размеру, кеширует... Рекомендую.