您当前的位置: 首页 > 网站编程 > PHP教程 > php 将图片保存为不同规格的图片

php 将图片保存为不同规格的图片

作者:不详 来源:网络 发布时间: 2014-08-21 21:47 点击:
1.图片处理类.imagecls.php ?php /** 图片处理类 */ class imagecls { /** * 文件信息 */ var $file = array(); /** * 保存目录 */ var $dir = ''; /** * 错误代码 */ var $error_code = 0; /** * 文件上传最大KB */ var $max_size = -1; function es_imagecls() { } p

php 将图片保存为不同规格的图片

  1.图片处理类.imagecls.php

  <?php

  /**

  图片处理类

  */

  class imagecls

  {

  /**

  * 文件信息

  */

  var $file = array();

  /**

  * 保存目录

  */

  var $dir = '';

  /**

  * 错误代码

  */

  var $error_code = 0;

  /**

  * 文件上传最大KB

  */

  var $max_size = -1;

  function es_imagecls()

  {

  }

  private function checkSize($size)

  {

  return !($size > $this->max_size) || (-1 == $this->max_size);

  }

  /**

  * 处理上传文件

  * @param array $file 上传的文件

  * @param string $dir 保存的目录

  * @return bool

  */

  function init($file, $dir = 'temp')

  {

  if(!is_array($file) || empty($file)

  || !$this->isUploadFile($file['tmp_name']) || trim($file['name']) == '' || $file['size'] == 0)

  {

  $this->file = array();

  $this->error_code = -1;

  return false;

  }

  else

  {

  $file['size'] = intval($file['size']);

  $file['name'] = trim($file['name']);

  $file['thumb'] = '';

  $file['ext'] = $this->fileExt($file['name']);

  $file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);

  $file['is_image'] = $this->isImageExt($file['ext']);

  $file['file_dir'] = $this->getTargetDir($dir);

  $file['prefix'] = md5(microtime(true)).rand(10,99);

  $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //相对

  $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';//物理

  $this->file = &$file;

  $this->error_code = 0;

  return true;

  }

  }

  /**

  * 保存文件

  * @return bool

  */

  function save()

  {

  if(empty($this->file) || empty($this->file['tmp_name']))

  $this->error_code = -101;

  elseif(!$this->checkSize($this->file['size']))

  $this->error_code = -105;

  elseif(!$this->file['is_image'])

  $this->error_code = -102;

  elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))

  $this->error_code = -103;

  elseif($this->file['is_image'] &&

  (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))

  {

  $this->error_code = -104;

  @unlink($this->file['local_target']);

  }

  else

  {

  $this->error_code = 0;

  return true;

  }

  return false;

  }

  /**

  * 获取错误代码

  * @return number

  */

  function error()

  {

  return $this->error_code;

  }

  /**

  * 获取文件扩展名

  * @return string

  */

  function fileExt($file_name)

  {

  return addslashes(strtolower(substr(strrchr($file_name, '.'), 1, 10)));

  }

  /**

  * 根据扩展名判断文件是否为图像

  * @param string $ext 扩展名

  * @return bool

  */

  function isImageExt($ext)

  {

  static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif','giff');

  return in_array($ext, $img_ext) ? 1 : 0;

  }

  /**

  * 获取图像信息

  * @param string $target 文件路径

  * @return mixed

  */

  function getImageInfo($target)

  {

  $ext = es_imagecls::fileExt($target);

  $is_image = es_imagecls::isImageExt($ext);

  if(!$is_image)

  return false;

  elseif(!is_readable($target))

  return false;

  elseif($image_info = @getimagesize($target))

  {

  list($width, $height, $type) = !empty($image_info) ? $image_info :

  array('', '', '');

  $size = $width * $height;

  if($is_image && !in_array($type, array(1,2,3,6,13)))

  return false;

  $image_info['type'] =

  strtolower (substr(image_type_to_extension($image_info[2]),1));

  return $image_info;

  }

  else

  return false;

  }

  /**

  * 获取是否充许上传文件

  * @param string $source 文件路径

  * @return bool

  */

  function isUploadFile($source)

  {

  return $source && ($source != 'none') &&

  (is_uploaded_file($source) || is_uploaded_file(str_replace('', '', $source)));

  }

  /**

  * 获取保存的路径

  * @param string $dir 指定的保存目录

  * @return string

  */

  function getTargetDir($dir)

  {

  if (!is_dir(APP_ROOT_PATH."public/".$dir)) {

  @mkdir(APP_ROOT_PATH."public/".$dir);

  @chmod(APP_ROOT_PATH."public/".$dir, 0777);

  }

  return $dir;

  }

  /**

  * 保存文件

  * @param string $source 源文件路径

  * @param string $target 目录文件路径

  * @return bool

  */

  private function saveFile($source, $target)

  {

  if(!es_imagecls::isUploadFile($source))

  $succeed = false;

  elseif(@copy($source, $target))

  $succeed = true;

  elseif(function_exists('move_uploaded_file') &&

  @move_uploaded_file($source, $target))

  $succeed = true;

  elseif (@is_readable($source) &&

  (@$fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))

  {

  while (!feof($fp_s))

  {

  $s = @fread($fp_s, 1024 * 512);

  @fwrite($fp_t, $s);

  }

  fclose($fp_s);

  fclose($fp_t);

  $succeed = true;

  }

  if($succeed)

  {

  $this->error_code = 0;

  @chmod($target, 0644);

  @unlink($source);

  }

  else

  {

  $this->error_code = 0;

  }

  return $succeed;

  }

  public function thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,

  $interlace=true,$filepath = '',$is_preview = true)

  {

  $info = es_imagecls::getImageInfo($image);

  if($info !== false)

  {

  $srcWidth = $info[0];

  $srcHeight = $info[1];

  $type = $info['type'];

  $interlace = $interlace? 1:0;

  unset($info);

  if($maxWidth > 0 && $maxHeight > 0)

  $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);

  // 计算缩放比例

  elseif($maxWidth == 0)

  $scale = $maxHeight/$srcHeight;

  elseif($maxHeight == 0)

  $scale = $maxWidth/$srcWidth;

  $paths = pathinfo($image);

  $paths['filename'] = trim(strtolower($paths['basename']),

  ".".strtolower($paths['extension']));

  $basefilename = explode("_",$paths['filename']);

  $basefilename = $basefilename[0];

  if(empty($filepath))

  {

  if($is_preview)

  $thumbname = $paths['dirname'].'/'.$basefilename.

  '_'.$maxWidth.'x'.$maxHeight.'.jpg';

  else

  $thumbname = $paths['dirname'].'/'.$basefilename.

  'o_'.$maxWidth.'x'.$maxHeight.'.jpg';

  }

  else

  $thumbname = $filepath;

  $thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);

  if($scale >= 1)

  {

  // 超过原图大小不再缩略

  $width = $srcWidth;

  $height = $srcHeight;

  if(!$is_preview)

  {

  //非预览模式写入原图

  file_put_contents($thumbname,file_get_contents($image)); //用原图写入

  return array('url'=>$thumburl,'path'=>$thumbname);

  }

  }

  else

  {

  // 缩略图尺寸

  $width = (int)($srcWidth*$scale);

  $height = (int)($srcHeight*$scale);

  }

  if($gen == 1)

  {

  $width = $maxWidth;

  $height = $maxHeight;

  }

  // 载入原图

  $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);

  if(!function_exists($createFun))

  $createFun = 'imagecreatefromjpeg';

  $srcImg = $createFun($image);

  //创建缩略图

  if($type!='gif' && function_exists('imagecreatetruecolor'))

  $thumbImg = imagecreatetruecolor($width, $height);

  else

  $thumbImg = imagecreate($width, $height);

  $x = 0;

  $y = 0;

  if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

  {

  $resize_ratio = $maxWidth/$maxHeight;

  $src_ratio = $srcWidth/$srcHeight;

  if($src_ratio >= $resize_ratio)

  {

  $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;

  $width = ($height * $srcWidth) / $srcHeight;

  }

  else

  {

  $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;

  $height = ($width * $srcHeight) / $srcWidth;

  }

  }

  // 复制图片

  if(function_exists("imagecopyresampled"))

  imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,

  $srcWidth,$srcHeight);

  else

  imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,

  $srcWidth,$srcHeight);

  if('gif'==$type || 'png'==$type) {

  $background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一个绿色

  imagecolortransparent($thumbImg,$background_color);

  // 设置为透明色,若注释掉该行则输出绿色的图

  }

  // 对jpeg图形设置隔行扫描

  if('jpg'==$type || 'jpeg'==$type)

  imageinterlace($thumbImg,$interlace);

  // 生成图片

  imagejpeg($thumbImg,$thumbname,100);

  imagedestroy($thumbImg);

  imagedestroy($srcImg);

  return array('url'=>$thumburl,'path'=>$thumbname);

  }

  return false;

  }

  public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,

  $maxHeight=50,$gen = 0)

  {

  $interlace = $interlace? 1:0;

  if($maxWidth > 0 && $maxHeight > 0)

  $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);

  // 计算缩放比例

  elseif($maxWidth == 0)

  $scale = $maxHeight/$srcHeight;

  elseif($maxHeight == 0)

  $scale = $maxWidth/$srcWidth;

  if($scale >= 1)

  {

  // 超过原图大小不再缩略

  $width = $srcWidth;

  $height = $srcHeight;

  }

  else

  {

  // 缩略图尺寸

  $width = (int)($srcWidth*$scale);

  $height = (int)($srcHeight*$scale);

  }

  if($gen == 1)

  {

  $width = $maxWidth;

  $height = $maxHeight;

  }

  //创建缩略图

  if($type!='gif' && function_exists('imagecreatetruecolor'))

  $thumbImg = imagecreatetruecolor($width, $height);

  else

  $thumbImg = imagecreatetruecolor($width, $height);

  $x = 0;

  $y = 0;

  if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

  {

  $resize_ratio = $maxWidth/$maxHeight;

  $src_ratio = $srcWidth/$srcHeight;

  if($src_ratio >= $resize_ratio)

  {

  $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;

  $width = ($height * $srcWidth) / $srcHeight;

  }

  else

  {

  $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;

  $height = ($width * $srcHeight) / $srcWidth;

  }

  }

  // 复制图片

  if(function_exists("imagecopyresampled"))

  imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,

  $srcWidth,$srcHeight);

  else

  imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,

  $srcWidth,$srcHeight);

  if('gif'==$type || 'png'==$type) {

  $background_color = imagecolorallocate($thumbImg, 255,255,255);

  // 指派一个绿色

  imagecolortransparent($thumbImg,$background_color);

  // 设置为透明色,若注释掉该行则输出绿色的图

  }

  // 对jpeg图形设置隔行扫描

  if('jpg'==$type || 'jpeg'==$type)

  imageinterlace($thumbImg,$interlace);

  return $thumbImg;

  }

  public function water($source,$water,$alpha=80,$position="0")

  {

  //检查文件是否存在

  if(!file_exists($source)||!file_exists($water))

  return false;

  //图片信息

  $sInfo = es_imagecls::getImageInfo($source);

  $wInfo = es_imagecls::getImageInfo($water);

  //如果图片小于水印图片,不生成图片

  if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])

  return false;

  if(is_animated_gif($source))

  {

  require_once APP_ROOT_PATH."system/utils/gif_encoder.php";

  require_once APP_ROOT_PATH."system/utils/gif_reader.php";

  $gif = new GIFReader();

  $gif->load($source);

  foreach($gif->IMGS['frames'] as $k=>$img)

  {

  $im = imagecreatefromstring($gif->getgif($k));

  //为im加水印

  $sImage=$im;

  $wCreateFun="imagecreatefrom".$wInfo['type'];

  if(!function_exists($wCreateFun))

  $wCreateFun = 'imagecreatefromjpeg';

  $wImage=$wCreateFun($water);

  //设定图像的混色模式

  imagealphablending($wImage, true);

  switch (intval($position))

  {

  case 0: break;

  //左上

  case 1:

  $posY=0;

  $posX=0;

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //右上

  case 2:

  $posY=0;

  $posX=$sInfo[0]-$wInfo[0];

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //左下

  case 3:

  $posY=$sInfo[1]-$wInfo[1];

  $posX=0;

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //右下

  case 4:

  $posY=$sInfo[1]-$wInfo[1];

  $posX=$sInfo[0]-$wInfo[0];

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //居中

  case 5:

  $posY=$sInfo[1]/2-$wInfo[1]/2;

  $posX=$sInfo[0]/2-$wInfo[0]/2;

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  }

  //end im加水印

  ob_start();

  imagegif($sImage);

  $content = ob_get_contents();

  ob_end_clean();

  $frames [ ] = $content;

  $framed [ ] = $img['frameDelay'];

  }

  $gif_maker = new GIFEncoder (

  $frames,

  $framed,

  0,

  2,

  0, 0, 0,

  "bin" //bin为二进制 url为地址

  );

  $image_rs = $gif_maker->GetAnimation ( );

  //如果没有给出保存文件名,默认为原图像名

  @unlink($source);

  //保存图像

  file_put_contents($source,$image_rs);

  return true;

  }

  //建立图像

  $sCreateFun="imagecreatefrom".$sInfo['type'];

  if(!function_exists($sCreateFun))

  $sCreateFun = 'imagecreatefromjpeg';

  $sImage=$sCreateFun($source);

  $wCreateFun="imagecreatefrom".$wInfo['type'];

  if(!function_exists($wCreateFun))

  $wCreateFun = 'imagecreatefromjpeg';

  $wImage=$wCreateFun($water);

  //设定图像的混色模式

  imagealphablending($wImage, true);

  switch (intval($position))

  {

  case 0: break;

  //左上

  case 1:

  $posY=0;

  $posX=0;

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //右上

  case 2:

  $posY=0;

  $posX=$sInfo[0]-$wInfo[0];

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //左下

  case 3:

  $posY=$sInfo[1]-$wInfo[1];

  $posX=0;

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //右下

  case 4:

  $posY=$sInfo[1]-$wInfo[1];

  $posX=$sInfo[0]-$wInfo[0];

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  //居中

  case 5:

  $posY=$sInfo[1]/2-$wInfo[1]/2;

  $posX=$sInfo[0]/2-$wInfo[0]/2;

  //生成混合图像

  imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);

  break;

  }

  //如果没有给出保存文件名,默认为原图像名

  @unlink($source);

  //保存图像

  imagejpeg($sImage,$source,100);

  imagedestroy($sImage);

  }

  }

  if(!function_exists('image_type_to_extension'))

  {

  function image_type_to_extension($imagetype)

  {

  if(empty($imagetype))

  return false;

  switch($imagetype)

  {

  case IMAGETYPE_GIF : return '.gif';

  case IMAGETYPE_JPEG : return '.jpeg';

  case IMAGETYPE_PNG : return '.png';

  case IMAGETYPE_SWF : return '.swf';

  case IMAGETYPE_PSD : return '.psd';

  case IMAGETYPE_BMP : return '.bmp';

  case IMAGETYPE_TIFF_II : return '.tiff';

  case IMAGETYPE_TIFF_MM : return '.tiff';

  case IMAGETYPE_JPC : return '.jpc';

  case IMAGETYPE_JP2 : return '.jp2';

  case IMAGETYPE_JPX : return '.jpf';

  case IMAGETYPE_JB2 : return '.jb2';

  case IMAGETYPE_SWC : return '.swc';

  case IMAGETYPE_IFF : return '.aiff';

  case IMAGETYPE_WBMP : return '.wbmp';

  case IMAGETYPE_XBM : return '.xbm';

  default : return false;

  }

  }

  }

  ?>

  

2.get_spec_img()调用图片类,然后再用下面的方法保存不同规格的图片并返回图片连接

  //获取相应规格的图片地址

  //gen=0:保持比例缩放,不剪裁,如高为0,则保证宽度按比例缩放 gen=1:保证长宽,剪裁

  function get_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true)

  {

  if($width==0)

  $new_path = $img_path;

  else

  {

  $img_name = substr($img_path,0,-4);

  $img_ext = substr($img_path,-3);

  if($is_preview)

  $new_path = $img_name."_".$width."x".$height.".jpg";

  else

  $new_path = $img_name."o_".$width."x".$height.".jpg";

  if(!file_exists($new_path))

  {

  require_once "imagecls.php";

  $imagec = new imagecls();

  $thumb = $imagec->thumb($img_path,$width,$height,$gen,true,"

  ",$is_preview);

  if(app_conf("PUBLIC_DOMAIN_ROOT")!='')

  {

  $paths = pathinfo($new_path);

  $path = str_replace("./","",$paths['dirname']);

  $filename = $paths['basename'];

  $pathwithoupublic = str_replace("public/","",$path);

  $file_data = @file_get_contents($path.$file);

  $img = @imagecreatefromstring($file_data);

  if($img!==false)

  {

  $save_path = "public/".$path;

  if(!is_dir($save_path))

  {

  @mk_dir($save_path);

  }

  @file_put_contents($save_path.$name,$file_data);

  }

  }

  }

  }

  return $new_path;

  }

  3.使用方法:

  //im:将店铺图片保存为3种规格:小图:48x48,中图120x120,大图200x200

  $small_url=get_spec_image($data['image'],48,48,0);

  $<span id="result_box" class="short_text" lang="en">

  <span>middle_url</span></span>=get_spec_image($data['image'],120,120,0);

  $big_url=get_spec_image($data['image'],200,200,0);

  

分享到:
本文"php 将图片保存为不同规格的图片"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4