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 判断字符串中是否包含html标签
Feb 17 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php采用curl实现伪造IP来源的方法
Nov 21 PHP
php中explode的负数limit用法分析
Feb 27 PHP
php从字符串创建函数的方法
Mar 16 PHP
PHP连接操作access数据库实例
Mar 30 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
关于laravel5.5的定时任务详解(demo)
Oct 23 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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/07/17 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
优秀毕业生求职推荐信范文
2013/11/21 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
投资入股协议书
2016/03/22 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书