侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

常用的php图片处理类(水印、等比缩放、固定高宽)分享

php  /  管理员 发布于 7年前   225

常用的php图片处理类(水印、等比缩放、固定高宽)分享

typeList = array(1=>'gif',2=>'jpg',3=>'png');     $ginfo = getimagesize($source);     $this->source_width = $ginfo[0];     $this->source_height = $ginfo[1];     $this->source_type_id = $ginfo[2];     $this->orign_url = $source;     $this->orign_name = basename($source);     $this->orign_dirname = dirname($source);   }       //判断图片的文件的格式,返回PHP可识别的编码   public function judgeType($type,$source){     if($type == 1){       return imagecreatefromgif($source); //gif     }else if($type == 2){       return imagecreatefromjpeg($source); //jpg     }else if($type == 3){       return imagecreatefrompng($source); //png     }else{       return false;     }   }       //生成水印图片   public function waterMakeImage($logo){     $linfo = getimagesize($logo);     $logo_width = $linfo[0];     $logo_height = $linfo[1];     $logo_type_id = $linfo[2];     $sourceHandle = $this->judgeType($this->source_type_id,$this->orign_url);     $logoHandle = $this->judgeType($logo_type_id,$logo);     if(!$sourceHandle || !$logoHandle){       return false;     }     $x = ($this->source_width - $logo_width)/2;     $y = ($this->source_height - $logo_height)/2;     imagecopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_height);     $newPic = $this->orign_dirname.'\water_'.time().'.'.$this->typeList[$this->source_type_id];     if($this->saveImage($sourceHandle,$newPic)){       imagedestroy($sourceHandle);       imagedestroy($logoHandle);     }   }       //固定高度宽度   public function fixSizeImage($width,$height){     if($width > $this->source_width) $this->source_width;     if($height > $this->source_height) $this->source_height;     if($width === false){       $width = floor($this->source_width / ($this->source_height / $height));     }     if($height === false){       $height = floor($this->source_height / ($this->source_width / $width));     }     $this->tinyImage($width,$height);   }       //等比例缩放图片   public function scaleImage($scale){     $width = floor($this->source_width * $scale);     $height = floor($this->source_height * $scale);     $this->tinyImage($width, $height);   }       //创建缩略图   public function tinyImage($width,$height){     $tinyImage = imagecreatetruecolor($width,$height);     $handle = $this->judgeType($this->source_type_id,$this->orign_url);     if(function_exists('imagecopyresampled')){       imagecopyresampled($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height);     }else{       imagecopyresized($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height);     }     $newPic = $this->orign_dirname.'\thumb_'.time().'_'.$width."_".$height.".".$this->typeList[$this->source_type_id];     if($this->saveImage($tinyImage,$newPic)){       imagedestroy($tinyImage);       imagedestroy($handle);     }   }   //保存图片   private function saveImage($image,$url){     if(imagejpeg($image,$url)){       return true;     }   } } $imgHandle = new Image_process('D:\AppServ\www\test\getimg\14061907445601.jpg'); //$imgHandle->waterMakeImage('D:\AppServ\www\test\getimg\shougongke.png');  //生成水印图片 //$imgHandle->fixSizeImage(200,150); //固定长度图片 $imgHandle->scaleImage(0.2); //等比例缩放 ?>

示例二:

xx,'height'=>xxx) * @internal * 我们一般的压缩图片方法,在图片过长或过宽时生成的图片 * 都会被“压扁”,针对这个应采用先裁剪后按比例压缩的方法 */ public function thumb_img($src_img, $save_img = '', $option) { if (empty ( $option ['width'] ) or empty ( $option ['height'] )) {  return array ('flag' => False, 'msg' => '原图长度与宽度不能小于0' ); } $org_ext = $this->is_img ( $src_img ); if (! $org_ext ['flag']) {  return $org_ext; } //如果有保存路径,则确定路径是否正确 if (! empty ( $save_img )) {  $f = $this->check_dir ( $save_img );  if (! $f ['flag'])  {  return $f;  } } //获取出相应的方法 $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); //获取原大小 $source = $org_funcs ['create_func'] ( $src_img ); $src_w = imagesx ( $source ); $src_h = imagesy ( $source ); //调整原始图像(保持图片原形状裁剪图像) $dst_scale = $option ['height'] / $option ['width']; //目标图像长宽比 $src_scale = $src_h / $src_w; // 原图长宽比 if ($src_scale >= $dst_scale) { // 过高  $w = intval ( $src_w );  $h = intval ( $dst_scale * $w );  $x = 0;  $y = ($src_h - $h) / 3; } else { // 过宽  $h = intval ( $src_h );  $w = intval ( $h / $dst_scale );  $x = ($src_w - $w) / 2;  $y = 0; } // 剪裁 $croped = imagecreatetruecolor ( $w, $h ); imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h ); // 缩放 $scale = $option ['width'] / $w; $target = imagecreatetruecolor ( $option ['width'], $option ['height'] ); $final_w = intval ( $w * $scale ); $final_h = intval ( $h * $scale ); imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h ); imagedestroy ( $croped ); //输出(保存)图片 if (! empty ( $save_img )) {  $org_funcs ['save_func'] ( $target, $save_img ); } else {  header ( $org_funcs ['header'] );  $org_funcs ['save_func'] ( $target ); } imagedestroy ( $target ); return array ('flag' => True, 'msg' => '' ); } /** *  * 等比例缩放图像 * @param $src_img 原图片 * @param $save_img 需要保存的地方 * @param $option 参数设置 array('width'=>xx,'height'=>xxx) *  */ function resize_image($src_img, $save_img = '', $option) { $org_ext = $this->is_img ( $src_img ); if (! $org_ext ['flag']) {  return $org_ext; } //如果有保存路径,则确定路径是否正确 if (! empty ( $save_img )) {  $f = $this->check_dir ( $save_img );  if (! $f ['flag'])  {  return $f;  } } //获取出相应的方法 $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); //获取原大小 $source = $org_funcs ['create_func'] ( $src_img ); $src_w = imagesx ( $source ); $src_h = imagesy ( $source ); if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height'])) {  if ($option ['width'] && $src_w > $option ['width'])  {  $widthratio = $option ['width'] / $src_w;  $resizewidth_tag = true;  }  if ($option ['height'] && $src_h > $option ['height'])  {  $heightratio = $option ['height'] / $src_h;  $resizeheight_tag = true;  }  if ($resizewidth_tag && $resizeheight_tag)  {  if ($widthratio < $heightratio)   $ratio = $widthratio;  else   $ratio = $heightratio;  }  if ($resizewidth_tag && ! $resizeheight_tag)  $ratio = $widthratio;  if ($resizeheight_tag && ! $resizewidth_tag)  $ratio = $heightratio;  $newwidth = $src_w * $ratio;  $newheight = $src_h * $ratio;  if (function_exists ( "imagecopyresampled" ))  {  $newim = imagecreatetruecolor ( $newwidth, $newheight );  imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );  } else  {  $newim = imagecreate ( $newwidth, $newheight );  imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );  } } //输出(保存)图片 if (! empty ( $save_img )) {  $org_funcs ['save_func'] ( $newim, $save_img ); } else {  header ( $org_funcs ['header'] );  $org_funcs ['save_func'] ( $newim ); } imagedestroy ( $newim ); return array ('flag' => True, 'msg' => '' ); } /** *  * 生成水印图片 * @param $org_img 原图像 * @param $mark_img 水印标记图像 * @param $save_img 当其目录不存在时,会试着创建目录 * @param array $option 为水印的一些基本设置包含: * x:水印的水平位置,默认为减去水印图宽度后的值 * y:水印的垂直位置,默认为减去水印图高度后的值 * alpha:alpha值(控制透明度),默认为50 */ public function water_mark($org_img, $mark_img, $save_img = '', $option = array()) { //检查图片 $org_ext = $this->is_img ( $org_img ); if (! $org_ext ['flag']) {  return $org_ext; } $mark_ext = $this->is_img ( $mark_img ); if (! $mark_ext ['flag']) {  return $mark_ext; } //如果有保存路径,则确定路径是否正确 if (! empty ( $save_img )) {  $f = $this->check_dir ( $save_img );  if (! $f ['flag'])  {  return $f;  } } //获取相应画布 $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); $org_img_im = $org_funcs ['create_func'] ( $org_img ); $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] ); $mark_img_im = $mark_funcs ['create_func'] ( $mark_img ); //拷贝水印图片坐标 $mark_img_im_x = 0; $mark_img_im_y = 0; //拷贝水印图片高宽 $mark_img_w = imagesx ( $mark_img_im ); $mark_img_h = imagesy ( $mark_img_im ); $org_img_w = imagesx ( $org_img_im ); $org_img_h = imagesx ( $org_img_im ); //合成生成点坐标 $x = $org_img_w - $mark_img_w; $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x; $org_img_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x < 0) ? $x : $org_img_im_x; $y = $org_img_h - $mark_img_h; $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y; $org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y < 0) ? $y : $org_img_im_y; //alpha $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50; $alpha = ($alpha > 100 or $alpha < 0) ? 50 : $alpha; //合并图片 imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha ); //输出(保存)图片 if (! empty ( $save_img )) {  $org_funcs ['save_func'] ( $org_img_im, $save_img ); } else {  header ( $org_funcs ['header'] );  $org_funcs ['save_func'] ( $org_img_im ); } //销毁画布 imagedestroy ( $org_img_im ); imagedestroy ( $mark_img_im ); return array ('flag' => True, 'msg' => '' ); } /** *  * 检查图片 * @param unknown_type $img_path * @return array('flag'=>true/false,'msg'=>ext/错误信息)  */ private function is_img($img_path) { if (! file_exists ( $img_path )) {  return array ('flag' => False, 'msg' => "加载图片 $img_path 失败!" ); } $ext = explode ( '.', $img_path ); $ext = strtolower ( end ( $ext ) ); if (! in_array ( $ext, $this->exts )) {  return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" ); } return array ('flag' => True, 'msg' => $ext ); } /** *  * 返回正确的图片函数 * @param unknown_type $ext */ private function get_img_funcs($ext) { //选择 switch ($ext) {  case 'jpg' :  $header = 'Content-Type:image/jpeg';  $createfunc = 'imagecreatefromjpeg';  $savefunc = 'imagejpeg';  break;  case 'jpeg' :  $header = 'Content-Type:image/jpeg';  $createfunc = 'imagecreatefromjpeg';  $savefunc = 'imagejpeg';  break;  case 'gif' :  $header = 'Content-Type:image/gif';  $createfunc = 'imagecreatefromgif';  $savefunc = 'imagegif';  break;  case 'bmp' :  $header = 'Content-Type:image/bmp';  $createfunc = 'imagecreatefrombmp';  $savefunc = 'imagebmp';  break;  default :  $header = 'Content-Type:image/png';  $createfunc = 'imagecreatefrompng';  $savefunc = 'imagepng'; } return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header ); } /** *  * 检查并试着创建目录 * @param $save_img */ private function check_dir($save_img) { $dir = dirname ( $save_img ); if (! is_dir ( $dir )) {  if (! mkdir ( $dir, 0777, true ))  {  return array ('flag' => False, 'msg' => "图片保存目录 $dir 无法创建!" );  } } return array ('flag' => True, 'msg' => '' ); }}if (! empty ( $_FILES ['test'] ['tmp_name'] )){ //例子 $img = new Img (); //原图 $name = explode ( '.', $_FILES ['test'] ['name'] ); $org_img = 'D:/test.' . end ( $name ); move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img ); $option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] ); if ($_POST ['type'] == 1) { $s = $img->resize_image ( $org_img, '', $option ); } else { $img->thumb_img ( $org_img, '', $option ); } unlink ( $org_img );}

以上所述就是本文的全部内容了,希望大家能够喜欢。

您可能感兴趣的文章:

  • PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
  • php使用imagick模块实现图片缩放、裁剪、压缩示例
  • PHP中图片等比缩放的实例
  • php实现按指定大小等比缩放生成上传图片缩略图的方法
  • php图片的裁剪与缩放生成符合需求的缩略图
  • PHP图片等比例缩放生成缩略图函数分享
  • PHP自定义图片缩放函数实现等比例不失真缩放的方法
  • php实现等比例不失真缩放上传图片的方法
  • php缩放图片(根据宽高的等比例缩放)实例介绍
  • php实现图片缩放功能类
  • PHP图片裁剪与缩放示例(无损裁剪图片)
  • PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例


  • 上一条:
    PHP实现获取中英文首字母
    下一条:
    php打造智能化的柱状图程序,用于报表等
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客