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.MVC的模板标签系统(一)
Sep 05 PHP
海河写的 Discuz论坛帖子调用js的php代码
Aug 23 PHP
PHP读取MySQL数据代码
Jun 05 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
destoon二次开发常用数据库操作
Jun 21 PHP
Codeigniter购物车类不能添加中文的解决方法
Nov 29 PHP
教大家制作简单的php日历
Nov 17 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 PHP
PHP数组array类常见操作示例
May 15 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
php教程之phpize使用方法
2014/02/12 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
VSCode launch.json配置详细教程
2020/06/18 Javascript
Python中字符串的修改及传参详解
2016/11/30 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python中的逆序遍历实例
2019/12/25 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
python实现在线翻译
2020/06/18 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
技校个人求职信范文
2014/01/25 职场文书
小学美术教学反思
2014/02/01 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
小学英语课后反思
2014/04/26 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
美丽心灵观后感
2015/06/01 职场文书
东京审判观后感
2015/06/01 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL
Go语言测试库testify使用学习
2022/07/23 Golang