php实现的支持imagemagick及gd库两种处理的缩略图生成类

本文实例讲述了php实现的支持imagemagick及gd库两种处理的缩略图生成类及其用法实例,非常具有实用价值。分享给大家供大家参考。具体如下:

一、功能:

1.按比例缩小/放大
2.填充背景色
3.按区域裁剪
4.添加水印,包括水印的位置,透明度等

使用imagemagick/GD库实现,imagemagick地址:www.imagemagick.org
需要安装imagemagick,安装方法如下:http://www.jb51.net/article/55528.htm

二、实现方法:

PicThumb.class.php类文件如下:

<?php
/** 缩略图生成类,支持imagemagick及gd库两种处理
*  Date:  2013-07-15
*  Author: fdipzone
*  Ver:  1.2
*
*  Func:
*  public set_config: 设置参数
*  public create_thumb: 生成缩略图
*  private fit: 缩略图片
*  private crop: 裁剪图片
*  private gd_fit: GD库缩略图片
*  private gd_crop: GD库裁剪图片
*  private get_size: 获取要转换的size
*  private get_crop_offset: 获取裁图的偏移量
*  private add_watermark: 添加水印
*  private check_handler: 判断处理程序是否已安装
*  private create_dirs: 创建目录
*  private exists: 判断参数是否存在
*  private to_log: 记录log
*  private hex2rgb: hex颜色转rgb颜色
*  private get_file_ext: 获取图片类型
*
*  ver:  1.1 增加GD库处理
*  ver:  1.2 增加width,height错误参数处理
*        增加当图片colorspace不为RGB时作转RGB处理
*        修正使用crop保存为gif时出现透明无效区域问题,使用+repage参数,删除透明无效区域即可
*
*  tips:建议使用imagemagick
*    GD库不支持透明度水印,如果必须使用透明水印,请将水印图片做成有透明度。
*    GD库输出gif如加透明水印,会有问题。
*/ 

class PicThumb{ // class start 

  private $_log = null;      // log file
  private $_handler = null;    // 进行图片处理的程序,imagemagick/gd库
  private $_type = 'fit';     // fit or crop
  private $_source = null;     // 原图路径
  private $_dest = null;      // 缩略图路径
  private $_watermark = null;   // 水印图片
  private $_opacity = 75;     // 水印圖片透明度,gd库不支持
  private $_gravity = 'SouthEast'; // 水印摆放位置 NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
  private $_geometry = '+10+10';  // 水印定位,gd库不支持
  private $_croppos = 'TL';    // 截图的位置 TL TM TR ML MM MR BL BM BR
  private $_bgcolor = null;    // 填充的背景色
  private $_quality = 90;     // 生成的图片质量
  private $_width = null;     // 指定区域宽度
  private $_height = null;     // 指定区域高度 

  // 初始化
  public function __construct($logfile=''){
    if($logfile!=''){
      $this->_log = $logfile;
    }
  } 

  // 设置参数
  public function set_config($param=array()){
    $this->_handler = $this->exists($param, 'handler')? strtolower($param['handler']) : null;
    $this->_type = $this->exists($param, 'type')? strtolower($param['type']) : 'fit';
    $this->_watermark = $this->exists($param, 'watermark')? $param['watermark'] : null;
    $this->_opacity = $this->exists($param, 'opacity')? $param['opacity'] : 75;
    $this->_gravity = $this->exists($param, 'gravity')? $param['gravity'] : 'SouthEast';
    $this->_geometry = $this->exists($param, 'geometry')? $param['geometry'] : '+10+10';
    $this->_croppos = $this->exists($param, 'croppos')? $param['croppos'] : 'TL';
    $this->_bgcolor = $this->exists($param, 'bgcolor')? $param['bgcolor'] : null;
    $this->_quality = $this->exists($param, 'quality')? $param['quality'] : 90;
    $this->_width = $this->exists($param, 'width')? $param['width'] : null;
    $this->_height = $this->exists($param, 'height')? $param['height'] : null;
  } 

  /** 创建缩略图
  * @param String $source 原图
  * @param String $dest  目标图
  * @return boolean
  */
  public function create_thumb($source, $dest){
    // 检查使用的handler是否已安装
    if(!$this->check_handler()){
      $this->to_log('handler not installed');
      return false;
    }
    // 判断区域宽高是否正确
    if(!is_numeric($this->_width) || !is_numeric($this->_height) || $this->_width<=0 || $this->_height<=0){
      $this->to_log('width or height invalid');
      return false;
    } 

    // 判断源文件是否存在
    if(!file_exists($source)){
      $this->to_log($source.' not exists');
      return false;
    } 

    // 创建目标文件路径
    if(!$this->create_dirs($dest)){
      $this->to_log(dirname($dest).' create fail');
      return false;
    } 

    $this->_source = $source;  // 源文件
    $this->_dest = $dest;    // 目标文件 

    // 处理图片
    switch($this->_type){
      case 'fit':
        if($this->_handler=='imagemagick'){
          return $this->fit();
        }else{
          return $this->gd_fit();
        }
        break; 

      case 'crop':
        if($this->_handler=='imagemagick'){
          return $this->crop();
        }else{
          return $this->gd_crop();
        }
        break; 

      default:
        $this->to_log($this->_type.' not fit and crop');
        return false;
    }
  } 

  /** 按比例压缩或拉伸图片
  * @return boolean
  */
  private function fit(){ 

    // 判断是否填充背景
    $bgcolor = ($this->_bgcolor!=null)?
    sprintf(" -background '%s' -gravity center -extent '%sx%s' ", $this->_bgcolor, $this->_width, $this->_height) : ""; 

    // 判断是否要转为RGB
    $source_info = getimagesize($this->_source);
    $colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ' : ''; 

    // 命令行
    $cmd = sprintf("convert -resize '%sx%s' '%s' %s -quality %s %s '%s'", $this->_width, $this->_height, $this->_source, $bgcolor, $this->_quality, $colorspace, $this->_dest); 

    // 记录执行的命令
    $this->to_log($cmd); 

    // 执行命令
    exec($cmd); 

    // 添加水印
    $this->add_watermark($this->_dest); 

    return is_file($this->_dest)? true : false;
  } 

  /** 裁剪图片
  * @return boolean
  */
  private function crop(){
    // 获取生成的图片尺寸
    list($pic_w, $pic_h) = $this->get_size(); 

    // 获取截图的偏移量
    list($offset_w, $offset_h) = $this->get_crop_offset($pic_w, $pic_h); 

    // 判断是否要转为RGB
    $source_info = getimagesize($this->_source);
    $colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ' : ''; 

    // 命令行
    $cmd = sprintf("convert -resize '%sx%s' '%s' -quality %s %s -crop %sx%s+%s+%s +repage '%s'", $pic_w, $pic_h, $this->_source, $this->_quality, $colorspace, $this->_width, $this->_height, $offset_w, $offset_h, $this->_dest); 

    // 记录执行的命令
    $this->to_log($cmd); 

    // 执行命令
    exec($cmd); 

    // 添加水印
    $this->add_watermark($this->_dest); 

    return is_file($this->_dest)? true : false;
  } 

  /** GD库按比例压缩或拉伸图片
  * @return boolean
  */
  private function gd_fit(){
    // 获取生成的图片尺寸
    list($pic_w, $pic_h) = $this->get_size(); 

    list($owidth, $oheight, $otype) = getimagesize($this->_source); 

    switch($otype){
      case 1: $source_img = imagecreatefromgif($this->_source); break;
      case 2: $source_img = imagecreatefromjpeg($this->_source); break;
      case 3: $source_img = imagecreatefrompng($this->_source); break;
      default: return false;
    } 

    // 按比例缩略/拉伸图片
    $new_img = imagecreatetruecolor($pic_w, $pic_h);
    imagecopyresampled($new_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight); 

    // 判断是否填充背景
    if($this->_bgcolor!=null){
      $bg_img = imagecreatetruecolor($this->_width, $this->_height);
      $rgb = $this->hex2rgb($this->_bgcolor);
      $bgcolor =imagecolorallocate($bg_img, $rgb['r'], $rgb['g'], $rgb['b']);
      imagefill($bg_img, 0, 0, $bgcolor);
      imagecopy($bg_img, $new_img, (int)(($this->_width-$pic_w)/2), (int)(($this->_height-$pic_h)/2), 0, 0, $pic_w, $pic_h);
      $new_img = $bg_img;
    } 

    // 获取目标图片的类型
    $dest_ext = $this->get_file_ext($this->_dest); 

    // 生成图片
    switch($dest_ext){
      case 1: imagegif($new_img, $this->_dest, $this->_quality); break;
      case 2: imagejpeg($new_img, $this->_dest, $this->_quality); break;
      case 3: imagepng($new_img, $this->_dest, (int)(($this->_quality-1)/10)); break;
    } 

    if(isset($source_img)){
      imagedestroy($source_img);
    } 

    if(isset($new_img)){
      imagedestroy($new_img);
    } 

    // 添加水印
    $this->add_watermark($this->_dest); 

    return is_file($this->_dest)? true : false;
  } 

  /** GD库裁剪图片
  * @return boolean
  */
  private function gd_crop(){ 

    // 获取生成的图片尺寸
    list($pic_w, $pic_h) = $this->get_size(); 

    // 获取截图的偏移量
    list($offset_w, $offset_h) = $this->get_crop_offset($pic_w, $pic_h); 

    list($owidth, $oheight, $otype) = getimagesize($this->_source); 

    switch($otype){
      case 1: $source_img = imagecreatefromgif($this->_source); break;
      case 2: $source_img = imagecreatefromjpeg($this->_source); break;
      case 3: $source_img = imagecreatefrompng($this->_source); break;
      default: return false;
    } 

    // 按比例缩略/拉伸图片
    $tmp_img = imagecreatetruecolor($pic_w, $pic_h);
    imagecopyresampled($tmp_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight); 

    // 裁剪图片
    $new_img = imagecreatetruecolor($this->_width, $this->_height);
    imagecopyresampled($new_img, $tmp_img, 0, 0, $offset_w, $offset_h, $this->_width, $this->_height, $this->_width, $this->_height); 

    // 获取目标图片的类型
    $dest_ext = $this->get_file_ext($this->_dest); 

    // 生成图片
    switch($dest_ext){
      case 1: imagegif($new_img, $this->_dest, $this->_quality); break;
      case 2: imagejpeg($new_img, $this->_dest, $this->_quality); break;
      case 3: imagepng($new_img, $this->_dest, (int)(($this->_quality-1)/10)); break;
    } 

    if(isset($source_img)){
      imagedestroy($source_img);
    } 

    if(isset($tmp_img)){
      imagedestroy($tmp_img);
    } 

    if(isset($new_img)){
      imagedestroy($new_img);
    } 

    // 添加水印
    $this->add_watermark($this->_dest); 

    return is_file($this->_dest)? true : false;
  } 

  /** 获取目标图生成的size
  * @return Array $width, $height
  */
  private function get_size(){
    list($owidth, $oheight) = getimagesize($this->_source);
    $width = (int)($this->_width);
    $height = (int)($this->_height); 

    switch($this->_type){
      case 'fit':
        $pic_w = $width;
        $pic_h = (int)($pic_w*$oheight/$owidth);
        if($pic_h>$height){
          $pic_h = $height;
          $pic_w = (int)($pic_h*$owidth/$oheight);
        }
        break;
      case 'crop':
        if($owidth>$oheight){
          $pic_h = $height;
          $pic_w = (int)($pic_h*$owidth/$oheight);
        }else{
          $pic_w = $width;
          $pic_h = (int)($pic_w*$oheight/$owidth);
        }
        break;
    }
    return array($pic_w, $pic_h);
  } 

  /** 获取截图的偏移量
  * @param int $pic_w 图宽度
  * @param int $pic_h 图高度
  * @return Array $offset_w, $offset_h
  */
  private function get_crop_offset($pic_w, $pic_h){
    $offset_w = 0;
    $offset_h = 0; 

    switch(strtoupper($this->_croppos)){
      case 'TL':
        $offset_w = 0;
        $offset_h = 0;
        break; 

      case 'TM':
        $offset_w = (int)(($pic_w-$this->_width)/2);
        $offset_h = 0;
        break; 

      case 'TR':
        $offset_w = (int)($pic_w-$this->_width);
        $offset_h = 0;
        break; 

      case 'ML':
        $offset_w = 0;
        $offset_h = (int)(($pic_h-$this->_height)/2);
        break; 

      case 'MM':
        $offset_w = (int)(($pic_w-$this->_width)/2);
        $offset_h = (int)(($pic_h-$this->_height)/2);
        break; 

      case 'MR':
        $offset_w = (int)($pic_w-$this->_width);
        $offset_h = (int)(($pic_h-$this->_height)/2);
        break; 

      case 'BL':
        $offset_w = 0;
        $offset_h = (int)($pic_h-$this->_height);
        break; 

      case 'BM':
        $offset_w = (int)(($pic_w-$this->_width)/2);
        $offset_h = (int)($pic_h-$this->_height);
        break; 

      case 'BR':
        $offset_w = (int)($pic_w-$this->_width);
        $offset_h = (int)($pic_h-$this->_height);
        break;
    }
    return array($offset_w, $offset_h);
  } 

  /** 添加水印
  * @param String $dest 图片路径
  */
  private function add_watermark($dest){
    if($this->_watermark!=null && file_exists($this->_watermark) && file_exists($dest)){
      list($owidth, $oheight, $otype) = getimagesize($dest);
      list($w, $h, $wtype) = getimagesize($this->_watermark); 

      // 水印图比原图要小才加水印
      if($w<=$owidth && $h<=$oheight){ 

        if($this->_handler=='imagemagick'){ // imagemagick 添加水印 

          $cmd = sprintf("composite -gravity %s -geometry %s -dissolve %s '%s' %s %s", $this->_gravity, $this->_geometry, $this->_opacity, $this->_watermark, $dest, $dest); 

          $this->to_log($cmd); 

          exec($cmd); 

        }else{ // gd 添加水印 

          switch($wtype){
            case 1: $water_img = imagecreatefromgif($this->_watermark); break;
            case 2: $water_img = imagecreatefromjpeg($this->_watermark); break;
            case 3: $water_img = imagecreatefrompng($this->_watermark); break;
            default: return false;
          } 

          switch($otype){
            case 1: $dest_img = imagecreatefromgif($dest); break;
            case 2: $dest_img = imagecreatefromjpeg($dest); break;
            case 3: $dest_img = imagecreatefrompng($dest); break;
            default: return false;
          } 

          // 水印位置
          switch(strtolower($this->_gravity)){
            case 'northwest':
              $posX = 0;
              $posY = 0;
              break;
            case 'north':
              $posX = ($owidth - $w) / 2;
              $posY = 0;
              break;
            case 'northeast':
              $posX = $owidth - $w;
              $posY = 0;
              break;
            case 'west':
              $posX = 0;
              $posY = ($oheight - $h) / 2;
              break;
            case 'center':
              $posX = ($owidth - $w) / 2;
              $posY = ($oheight - $h) / 2;
              break;
            case 'east':
              $posX = $owidth - $w;
              $posY = ($oheight - $h) / 2;
              break;
            case 'southwest':
              $posX = 0;
              $posY = $oheight - $h;
              break;
            case 'south':
              $posX = ($owidth - $w) / 2;
              $posY = $oheight - $h;
              break;
            case 'southeast':
              $posX = $owidth - $w;
              $posY = $oheight - $h;
              break;
          } 

          imagealphablending($dest_img, true);
          imagecopy($dest_img, $water_img, $posX, $posY, 0, 0, $w, $h); 

          switch($otype){
            case 1:imagegif($dest_img, $dest, $this->_quality); break;
            case 2:imagejpeg($dest_img, $dest, $this->_quality); break;
            case 3:imagepng($dest_img, $dest, (int)(($this->_quality-1)/10)); break;
          } 

          if(isset($water_img)){
            imagedestroy($water_img);
          } 

          if(isset($dest_img)){
            imagedestroy($dest_img);
          }
        }
      }
    }
  } 

  /** 判断处理程序是否已安装
  * @return boolean
  */
  private function check_handler(){ 

    $handler = $this->_handler; 

    if(!in_array($handler, array('imagemagick', 'gd', null))){
      return false;
    } 

    // 检查是否有安装imagemagick
    $imagemagick_installed = strstr(shell_exec('convert -version'),'Version: ImageMagick')!=''? true : false; 

    // 检查是否有安装gd库
    $gd_installed = function_exists('gd_info')? true : false; 

    switch($handler){
      case 'imagemagick':
        return $imagemagick_installed;
        break; 

      case 'gd':
        return $gd_installed;
        break; 

      case null:
        if($imagemagick_installed){
          $this->_handler = 'imagemagick';
          return true;
        } 

        if($gd_installed){
          $this->_handler = 'gd';
          return true;
        }
        break;
    }
    return false;
  } 

  /** 创建图片目录
  * @param String $path
  * @return boolean
  */
  private function create_dirs($dest){
    if(!is_dir(dirname($dest))){
      return mkdir(dirname($dest), 0777, true);
    }
    return true;
  } 

  /** 判断参数是否存在
  * @param Array  $obj 数组对象
  * @param String $key 要查找的key
  * @return boolean
  */
  private function exists($obj,$key=''){
    if($key==''){
      return isset($obj) && !empty($obj);
    }else{
      $keys = explode('.',$key);
      for($i=0,$max=count($keys); $i<$max; $i++){
        if(isset($obj[$keys[$i]])){
          $obj = $obj[$keys[$i]];
        }else{
          return false;
        }
      }
      return isset($obj) && !empty($obj);
    }
  } 

  /** 记录log
  * @param String $msg 要记录的log讯息
  */
  private function to_log($msg){
    if($this->_log){
      $msg = '['.date('Y-m-d H:i:s').']'.$msg."\r\n";
      file_put_contents($this->_log, $msg, FILE_APPEND);
    }
  } 

  /** hex颜色转rgb颜色
  * @param String $color hex颜色
  * @return Array
  */
  private function hex2rgb($hexcolor){
    $color = str_replace('#', '', $hexcolor);
    if (strlen($color) > 3) {
      $rgb = array(
        'r' => hexdec(substr($color, 0, 2)),
        'g' => hexdec(substr($color, 2, 2)),
        'b' => hexdec(substr($color, 4, 2))
      );
    } else {
      $r = substr($color, 0, 1) . substr($color, 0, 1);
      $g = substr($color, 1, 1) . substr($color, 1, 1);
      $b = substr($color, 2, 1) . substr($color, 2, 1);
      $rgb = array(
        'r' => hexdec($r),
        'g' => hexdec($g),
        'b' => hexdec($b)
      );
    }
    return $rgb;
  } 

  /** 获取图片类型
  * @param String $file 图片路径
  * @return int
  */
  private function get_file_ext($file){
    $filename = basename($file);
    list($name, $ext)= explode('.', $filename); 

    $ext_type = 0; 

    switch(strtolower($ext)){
      case 'jpg':
      case 'jpeg':
        $ext_type = 2;
        break;
      case 'gif':
        $ext_type = 1;
        break;
      case 'png':
        $ext_type = 3;
        break;
    }
    return $ext_type;
  } 

} // class end
?>

demo示例代码如下:

<?php
define('ROOT', dirname(__FILE__)); 

require(ROOT."/PicThumb.class.php"); 

$logfile = ROOT.'/PicThumb.log';
$source1 = ROOT.'/pic/source.jpg';
$dest1 = ROOT.'/pic/1.jpg';
$dest2 = ROOT.'/pic/2.gif';
$dest3 = ROOT.'/pic/3.png'; 

$source2 = ROOT.'/pic/source_cmyk.jpg';
$dest4 = ROOT.'/pic/4.jpg';
$dest5 = ROOT.'/pic/5.gif';
$dest6 = ROOT.'/pic/6.png'; 

$watermark = ROOT.'/pic/watermark.png'; 

// 按比例生成缩略图
$param = array(
  'type' => 'fit',
  'width' => 100,
  'height' => 100,
); 

$obj = new PicThumb($logfile);
$obj->set_config($param);
$flag = $obj->create_thumb($source1, $dest1); 

if($flag){
  echo '<img src="pic/'.basename($dest1).'">';
}else{
  echo 'create thumb fail';
} 

// 按比例生成缩略图,不足部分用#FF0000填充
$param = array(
  'type' => 'fit',
  'width' => 100,
  'height' => 100,
  'bgcolor' => '#FFFF00'
); 

$obj = new PicThumb($logfile);
$obj->set_config($param);
$flag = $obj->create_thumb($source1, $dest2); 

if($flag){
  echo '<img src="pic/'.basename($dest2).'">';
}else{
  echo 'create thumb fail';
} 

// 裁剪250x250的缩略图,裁剪位置是底部中间,水印位置西南,透明度50
$param = array(
  'type' => 'crop',
  'croppos' => 'BM',
  'width' => 250,
  'height' => 250,
  'watermark' => $watermark,
  'opacity' => 50,
  'gravity' => 'SouthWest'
); 

$obj = new PicThumb($logfile);
$obj->set_config($param);
$flag = $obj->create_thumb($source1, $dest3); 

if($flag){
  echo '<img src="pic/'.basename($dest3).'">';
}else{
  echo 'create thumb fail';
} 

// 按比例生成缩略图 CMYK格式
$param = array(
  'type' => 'fit',
  'width' => 100,
  'height' => 100,
); 

$obj = new PicThumb($logfile);
$obj->set_config($param);
$flag = $obj->create_thumb($source2, $dest4); 

if($flag){
  echo '<img src="pic/'.basename($dest4).'">';
}else{
  echo 'create thumb fail';
} 

// 按比例生成缩略图,不足部分用#FF0000填充 CMYK格式
$param = array(
  'type' => 'fit',
  'width' => 100,
  'height' => 100,
  'bgcolor' => '#FFFF00'
); 

$obj = new PicThumb($logfile);
$obj->set_config($param);
$flag = $obj->create_thumb($source2, $dest5); 

if($flag){
  echo '<img src="pic/'.basename($dest5).'">';
}else{
  echo 'create thumb fail';
} 

// 裁剪250x250的缩略图,裁剪位置是底部中间,水印位置西南,透明度50 CMYK格式
$param = array(
  'type' => 'crop',
  'croppos' => 'BM',
  'width' => 250,
  'height' => 250,
  'watermark' => $watermark,
  'opacity' => 50,
  'gravity' => 'SouthWest'
); 

$obj = new PicThumb($logfile);
$obj->set_config($param);
$flag = $obj->create_thumb($source2, $dest6); 

if($flag){
  echo '<img src="pic/'.basename($dest6).'">';
}else{
  echo 'create thumb fail';
}
?>

本文完整实例代码点击此处本站下载。

希望本文所述对大家的PHP程序设计有所帮助

(0)

相关推荐

  • 使用ThinkPHP生成缩略图及显示

    使用ThinkPHP生成缩略图及显示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先了解父类Image.class.php(ThinkPHP/Library/Think/Image.class.php)中的一些函数 1:open() 打开被处理的图片 2:thumb() 生成缩略图 默认1等比缩放  (其中2,3,4,5,6代表的含义参见父类文件Image.class.php) 3:save() 缩略图到服务器 生成缩略图步骤分以下四步 * 1.实例化 * 2.打开图片open() *

  • thinkphp3.2.2实现生成多张缩略图的方法

    本文实例讲述了thinkphp3.2.2实现生成多张缩略图的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: public function dz_upload() { //上传多张缩略图   上传2张缩略图     if (isset($_FILES['ori_img'])){     $upload = new \Think\UploadFile();// 实例化上传类     $upload->maxSize = 3000000 ;// 设置附件上传大小  C('UP

  • PHP实现生成透明背景的PNG缩略图函数分享

    之前在WEB开发笔记写过一个PHP生成缩略图的函数,虽然那个函数能够生成缩略图,但是有一定的缺陷,在生成PNG缩略图的时候,背景是黑色,今天又写了一个函数来弥补一下.代码很简单,就是imagealphablending($thumb,false);与imagesavealpha($thumb,true);很重要.主要就是把PNG的alpha值保存,不要丢失而已. 函数如下: <?PHP /* *$sourePic:原图路径 * $smallFileName:小图名称 * $width:小图宽 *

  • 完美实现GIF动画缩略图的php代码

    下面通过一个取自CS警匪游戏的GIF动画来说明问题: GIF动画图片:old.gif 为了让问题更加清晰,我们先还原动画各帧: 选择一:用PHP中的Imagick模块: 复制代码 代码如下: <?php $image = new Imagick('old.gif'); $i = 0; foreach ($image as $frame) { $frame->writeImage('old_' . $i++ . '.gif'); } ?> 选择二:用ImageMagick提供的conver

  • php实现根据url自动生成缩略图的方法

    本文实例讲述了php实现根据url自动生成缩略图的方法,是非常实用的功能.分享给大家供大家参考.具体方法如下: 原理:设置apache rewrite ,当图片不存在时,调用php创建图片. 例如: 原图路径为:http://localhost/upload/news/2013/07/21/1.jpg 缩略图路径为:http://localhost/supload/news/2013/07/21/1.jpg 当访问 http://localhost/supload/news/2013/07/21

  • 超级好用的一个php上传图片类(随机名,缩略图,加水印)

    Upimages.class.php php上传类 复制代码 代码如下: <?php class UpImages { var $annexFolder = "upload";//附件存放点,默认为:annex var $smallFolder = "small";//缩略图存放路径,注:必须是放在 $annexFolder下的子目录,默认为:smallimg var $markFolder = "mark";//水印图片存放处 var $

  • PHP中使用FFMPEG获取视频缩略图和视频总时长实例

    复制代码 代码如下: //获得视频文件的缩略图function getVideoCover($file,$time,$name) {     if(empty($time))$time = '1';//默认截取第一秒第一帧     $strlen = strlen($file);     // $videoCover = substr($file,0,$strlen-4);     // $videoCoverName = $videoCover.'.jpg';//缩略图命名     //exe

  • php实现上传图片生成缩略图示例

    功能很简单,代码中有注释,直接给大家上代码了 复制代码 代码如下: <?php/** * 上传图片生成缩略图 *  * 需要GD2库的支持 *  * 初始化时需要参数new thumbnails('需要缩略的图片的原始地址','缩略图的宽度','缩略图的高度','(可选参数)缩略图的保存路径'); * 如果最后一个参数不指定,那么缩略图就默认保存在原始图片的所在目录里的small文件夹里, * 如果不存在small文件夹,则会自动创建small文件夹 *  * 初始化之后需要调用方法produc

  • Thinkphp调用Image类生成缩略图的方法

    本文实例讲述了Thinkphp调用Image类生成缩略图的方法.分享给大家供大家参考.具体分析如下: Thinkphp的Image类 在ThinkPHP/Extend/Library/ORG/Util/Image.class.php中. 调用方法如下: import("ORG.Util.Image"); $Img = new Image();//实例化图片类对象 $image_path = './图片路径'; //若当前php文件在Thinkphp的中APP_PATH路径中 //'./

  • 使用gd库实现php服务端图片裁剪和生成缩略图功能分享

    裁剪示例: 最终裁剪成的图片: 其中虚线框内就是要裁剪出来的图片,最终保存成100宽的图片.代码如下: 复制代码 代码如下: $src_path = '1.jpg';//创建源图的实例$src = imagecreatefromstring(file_get_contents($src_path)); //裁剪开区域左上角的点的坐标$x = 100;$y = 12;//裁剪区域的宽和高$width = 200;$height = 200;//最终保存成图片的宽和高,和源要等比例,否则会变形$fi

随机推荐