PHP自动生成缩略图函数的源码示例


Posted in PHP onMarch 18, 2019

一个简单但功能比较完善的自动生成缩略图的函数,可以按需要对图片进行缩放、裁切、锁定宽或高、使用空白填充

以下为源码,比较简单,相信很容易看明白,记得打开 GD 库的支持哦:

<?php
/**
 * 生成缩略图
 * @param string   源图绝对完整地址{带文件名及后缀名}
 * @param string   目标图绝对完整地址{带文件名及后缀名}
 * @param int    缩略图宽{值设为0时目标高度不能为0,目标宽度为源图宽*(目标高度/源图高)}
 * @param int    缩略图高{值设为0时目标宽度不能为0,目标高度为源图高*(目标宽度/源图宽)}
 * @param int    是否裁切{宽,高必须非0}
 * @param int/float 缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
 * @return boolean
 */
function img2thumb($src_img, $dst_img, $width = 75, $height = 75, $cut = 0, $proportion = 0)
{
  if(!is_file($src_img))
  {
    return false;
  }
  $ot = fileext($dst_img);
  $otfunc = 'image' . ($ot == 'jpg' ? 'jpeg' : $ot);
  $srcinfo = getimagesize($src_img);
  $src_w = $srcinfo[0];
  $src_h = $srcinfo[1];
  $type = strtolower(substr(image_type_to_extension($srcinfo[2]), 1));
  $createfun = 'imagecreatefrom' . ($type == 'jpg' ? 'jpeg' : $type);
  $dst_h = $height;
  $dst_w = $width;
  $x = $y = 0;
  /**
   * 缩略图不超过源图尺寸(前提是宽或高只有一个)
   */
  if(($width> $src_w && $height> $src_h) || ($height> $src_h && $width == 0) || ($width> $src_w && $height == 0))
  {
    $proportion = 1;
  }
  if($width> $src_w)
  {
    $dst_w = $width = $src_w;
  }
  if($height> $src_h)
  {
    $dst_h = $height = $src_h;
  }
  if(!$width && !$height && !$proportion)
  {
    return false;
  }
  if(!$proportion)
  {
    if($cut == 0)
    {
      if($dst_w && $dst_h)
      {
        if($dst_w/$src_w> $dst_h/$src_h)
        {
          $dst_w = $src_w * ($dst_h / $src_h);
          $x = 0 - ($dst_w - $width) / 2;
        }
        else
        {
          $dst_h = $src_h * ($dst_w / $src_w);
          $y = 0 - ($dst_h - $height) / 2;
        }
      }
      else if($dst_w xor $dst_h)
      {
        if($dst_w && !$dst_h) //有宽无高
        {
          $propor = $dst_w / $src_w;
          $height = $dst_h = $src_h * $propor;
        }
        else if(!$dst_w && $dst_h) //有高无宽
        {
          $propor = $dst_h / $src_h;
          $width = $dst_w = $src_w * $propor;
        }
      }
    }
    else
    {
      if(!$dst_h) //裁剪时无高
      {
        $height = $dst_h = $dst_w;
      }
      if(!$dst_w) //裁剪时无宽
      {
        $width = $dst_w = $dst_h;
      }
      $propor = min(max($dst_w / $src_w, $dst_h / $src_h), 1);
      $dst_w = (int)round($src_w * $propor);
      $dst_h = (int)round($src_h * $propor);
      $x = ($width - $dst_w) / 2;
      $y = ($height - $dst_h) / 2;
    }
  }
  else
  {
    $proportion = min($proportion, 1);
    $height = $dst_h = $src_h * $proportion;
    $width = $dst_w = $src_w * $proportion;
  }
  $src = $createfun($src_img);
  $dst = imagecreatetruecolor($width ? $width : $dst_w, $height ? $height : $dst_h);
  $white = imagecolorallocate($dst, 255, 255, 255);
  imagefill($dst, 0, 0, $white);
  if(function_exists('imagecopyresampled'))
  {
    imagecopyresampled($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
  }
  else
  {
    imagecopyresized($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
  }
  $otfunc($dst, $dst_img);
  imagedestroy($dst);
  imagedestroy($src);
  return true;
}
function fileext($file)
{
  return pathinfo($file, PATHINFO_EXTENSION);
}
?>

使用示例:

<?php
$src_img = "./test.jpg"; //原图片完整路径和名称,带图片扩展名
$dst_img = "./test_thumb.jpg"; //生成的缩略图存放的完整路径和名称
/* 生成宽300px,高200px的缩略图,不进行裁切,空白部分将会使用背景色填充 */
$stat = img2thumb($src_img, $dst_img, $width = 300, $height = 200, $cut = 0, $proportion = 0);
if($stat){
  echo 'Resize Image Success!<br />';
  echo '<img src="'.$dst_img.'" />';  
}else{
  echo 'Resize Image Fail!'; 
}
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
PHP 无限分类三种方式 非函数的递归调用!
Aug 26 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
PHP中返回引用类型的方法
Apr 03 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 #PHP
PHP实现对数字分隔加千分号的方法
Mar 18 #PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 #PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 #PHP
PHP标准库(PHP SPL)详解
Mar 16 #PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 #PHP
You might like
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
python实现简易学生信息管理系统
2020/04/05 Python
python支持多线程的爬虫实例
2019/12/21 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python实现点云投影到平面显示
2020/01/18 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
使用springMVC所需要的pom配置
2021/09/15 Java/Android