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.
Уменьшает по ширине и высоте, обрезает лишнее с краёв, приводит к одному размеру, кеширует... Рекомендую.