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 include的妙用,实现路径加密
Jul 29 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
PHP检测用户语言的方法
Jun 15 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
php简单实现多语言切换的方法
May 09 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHPMailer发送邮件
Dec 28 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
php接口实现拖拽排序功能
Apr 23 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 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
一个多文件上传的例子(原创)
2006/10/09 PHP
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
php定界符
2014/06/19 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
javascript canvas API内容整理
2020/02/16 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
.NET初级开发工程师面试题
2014/04/18 面试题
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
入职担保书范文
2014/05/21 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
Python数据结构之队列详解
2022/03/21 Python