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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
PHP中uploaded_files函数使用方法详解
Mar 09 PHP
php数据库配置文件一般做法分享
Jul 07 PHP
input file获得文件根目录简单实现
Apr 26 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
php实现的日历程序
Jun 18 PHP
php实现分页显示
Nov 03 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
python3之模块psutil系统性能信息使用
2018/05/30 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
职业生涯规划设计步骤
2014/01/12 职场文书
客服部班长工作责任制
2014/02/25 职场文书
广告词串烧
2014/03/19 职场文书
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript