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 相关文章推荐
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
处理php自动反斜杠的函数代码
Jan 05 PHP
php学习之变量的使用
May 29 PHP
调整PHP的性能
Oct 30 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
php生成图片缩略图功能示例
Feb 22 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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仿盗链代码
2012/06/03 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
Laravel实现表单提交
2017/05/07 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
Python函数和模块的使用总结
2019/05/20 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
什么是lambda函数
2013/09/17 面试题
旅游管理专业学生求职信
2013/09/28 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
vue项目支付功能代码详解
2022/02/18 Vue.js
Python作用域和名称空间的详细介绍
2022/04/13 Python