0

0

PHP实现图片裁剪与缩放的几种方法

php中文网

php中文网

发布时间:2016-06-08 17:22:27

|

1607人浏览过

|

来源于php中文网

原创

图片指定大小然后由php相关函数来实现图片裁剪功能,前段的js效果在这里就不介绍了,大家可以到网上找有很多这类代码,我只整理了php操作部份。

<script>ec(2);</script>

方法一

 代码如下 复制代码

图片裁剪缩放函数,支持方位裁剪和自定义坐标裁剪
    /**
     * 图片裁剪函数,支持指定定点裁剪和方位裁剪两种裁剪模式
     * @param   $src_file       原图片路径
     * @param      $new_width      裁剪后图片宽度(当宽度超过原图片宽度时,去原图片宽度)
     * @param      $new_height     裁剪后图片高度(当宽度超过原图片宽度时,去原图片高度)
     * @param      $type           裁剪方式,1-方位模式裁剪;0-定点模式裁剪。
     * @param      $pos            方位模式裁剪时的起始方位(当选定点模式裁剪时,此参数不起作用)
     *                                      1为顶端居左,2为顶端居中,3为顶端居右;
     *                                      4为中部居左,5为中部居中,6为中部居右;
     *                                      7为底端居左,8为底端居中,9为底端居右;
     * @param      $start_x        起始位置X (当选定方位模式裁剪时,此参数不起作用)
     * @param      $start_y        起始位置Y(当选定方位模式裁剪时,此参数不起作用)
     * @return                  裁剪图片存储路径
     */
    function thumb($src_file, $new_width, $new_height, $type = 1, $pos = 5, $start_x = 0, $start_y = 0) {
        $pathinfo = pathinfo($src_file);
        $dst_file = $pathinfo['dirname'] . '/' . $pathinfo['filename'] .'_'. $new_width . 'x' . $new_height . '.' . $pathinfo['extension'];
        if (!file_exists($dst_file)) {
            if ($new_width                 echo "params width or height error !";
                exit();
            }
            if (!file_exists($src_file)) {
                echo $src_file . " is not exists !";
                exit();
            }
            // 图像类型
            $img_type = exif_imagetype($src_file);
            $support_type = array(IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF);
            if (!in_array($img_type, $support_type, true)) {
                echo "只支持jpg、png、gif格式图片裁剪";
                exit();
            }
            /* 载入图像 */
            switch ($img_type) {
                case IMAGETYPE_JPEG :
                    $src_img = imagecreatefromjpeg($src_file);
                    break;
                case IMAGETYPE_PNG :
                    $src_img = imagecreatefrompng($src_file);
                    break;
                case IMAGETYPE_GIF :
                    $src_img = imagecreatefromgif($src_file);
                    break;
                default:
                echo "载入图像错误!";
                exit();
            }
            /* 获取源图片的宽度和高度 */
            $src_width = imagesx($src_img);
            $src_height = imagesy($src_img);
            /* 计算剪切图片的宽度和高度 */
            $mid_width = ($src_width             $mid_height = ($src_height             /* 初始化源图片剪切裁剪的起始位置坐标 */
            switch ($pos * $type) {
                case 1://1为顶端居左
                    $start_x = 0;
                    $start_y = 0;
                    break;
                case 2://2为顶端居中
                    $start_x = ($src_width - $mid_width) / 2;
                    $start_y = 0;
                    break;
                case 3://3为顶端居右
                    $start_x = $src_width - $mid_width;
                    $start_y = 0;
                    break;
                case 4://4为中部居左
                    $start_x = 0;
                    $start_y = ($src_height - $mid_height) / 2;
                    break;
                case 5://5为中部居中
                    $start_x = ($src_width - $mid_width) / 2;
                    $start_y = ($src_height - $mid_height) / 2;
                    break;
                case 6://6为中部居右
                    $start_x = $src_width - $mid_width;
                    $start_y = ($src_height - $mid_height) / 2;
                    break;
                case 7://7为底端居左
                    $start_x = 0;
                    $start_y = $src_height - $mid_height;
                    break;
                case 8://8为底端居中
                    $start_x = ($src_width - $mid_width) / 2;
                    $start_y = $src_height - $mid_height;
                    break;
                case 9://9为底端居右
                    $start_x = $src_width - $mid_width;
                    $start_y = $src_height - $mid_height;
                    break;
                default://随机
                    break;
            }
            // 为剪切图像创建背景画板
            $mid_img = imagecreatetruecolor($mid_width, $mid_height);
            //拷贝剪切的图像数据到画板,生成剪切图像
            imagecopy($mid_img, $src_img, 0, 0, $start_x, $start_y, $mid_width, $mid_height);
            // 为裁剪图像创建背景画板
            $new_img = imagecreatetruecolor($new_width, $new_height);
            //拷贝剪切图像到背景画板,并按比例裁剪
            imagecopyresampled($new_img, $mid_img, 0, 0, 0, 0, $new_width, $new_height, $mid_width, $mid_height);
            /* 按格式保存为图片 */
            switch ($img_type) {
                case IMAGETYPE_JPEG :
                    imagejpeg($new_img, $dst_file, 100);
                    break;
                case IMAGETYPE_PNG :
                    imagepng($new_img, $dst_file, 9);
                    break;
                case IMAGETYPE_GIF :
                    imagegif($new_img, $dst_file, 100);
                    break;
                default:
                    break;
            }
        }
        return ltrim($dst_file, '.');
    }

附件是一个有样例图片的测试demo。
不过,这个函数不支持动态gif图片的裁剪缩放。

方法二,

 代码如下 复制代码

list($src_w,$src_h)=getimagesize($src_img);  // 获取原图尺寸
$dst_scale = $dst_h/$dst_w; //目标图像长宽比
$src_scale = $src_h/$src_w; // 原图长宽比

if($src_scale>=$dst_scale)

 // 过高
 $w = intval($src_w);
 $h = intval($dst_scale*$w);
 $x = 0;
 $y = ($src_h - $h)/3;
}
else
{
// 过宽
 $h = intval($src_h);
 $w = intval($h/$dst_scale);
 $x = ($src_w - $w)/2;
 $y = 0;
}
// 剪裁
$source=imagecreatefromjpeg($src_img);
$croped=imagecreatetruecolor($w, $h);
imagecopy($croped,$source,0,0,$x,$y,$src_w,$src_h);
// 缩放
$scale = $dst_w/$w;
$target = imagecreatetruecolor($dst_w, $dst_h);
$final_w = intval($w*$scale);
$final_h = intval($h*$scale);
imagecopysampled($target,$croped,0,0,0,0,$final_w,$final_h,$w,$h);
// 保存
$timestamp = time();
imagejpeg($target, "$timestamp.jpg");
imagedestroy($target);
?>

方法三


根据自定义的目标图, 按目标图高宽比裁剪、缩放源图.

传入参数:

立即学习PHP免费学习笔记(深入)”;

ImgCleaner
ImgCleaner

一键去除图片内的任意文字,人物和对象

下载
 代码如下 复制代码

$source_path string 源图路径

$target_width integer 目标图宽度

$target_height integer 目标图高度

支持图片类型: image/gif, image/jpeg, image/png.

function imagecropper($source_path, $target_width, $target_height)
{
 $source_info   = getimagesize($source_path);
 $source_width  = $source_info[0];
 $source_height = $source_info[1];
 $source_mime   = $source_info['mime'];
 $source_ratio  = $source_height / $source_width;
 $target_ratio  = $target_height / $target_width;

 // 源图过高
 if ($source_ratio > $target_ratio)
 {
  $cropped_width  = $source_width;
  $cropped_height = $source_width * $target_ratio;
  $source_x = 0;
  $source_y = ($source_height - $cropped_height) / 2;
 }
 // 源图过宽
 elseif ($source_ratio  {
  $cropped_width  = $source_height / $target_ratio;
  $cropped_height = $source_height;
  $source_x = ($source_width - $cropped_width) / 2;
  $source_y = 0;
 }
 // 源图适中
 else
 {
  $cropped_width  = $source_width;
  $cropped_height = $source_height;
  $source_x = 0;
  $source_y = 0;
 }

 switch ($source_mime)
 {
  case 'image/gif':
   $source_image = imagecreatefromgif($source_path);
   break;

  case 'image/jpeg':
   $source_image = imagecreatefromjpeg($source_path);
   break;

  case 'image/png':
   $source_image = imagecreatefrompng($source_path);
   break;

  default:
   return false;
   break;
 }

 $target_image  = imagecreatetruecolor($target_width, $target_height);
 $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);

 // 裁剪
 imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
 // 缩放
 imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height);

 header('Content-Type: image/jpeg');
 imagejpeg($target_image);
 imagedestroy($source_image);
 imagedestroy($target_image);
 imagedestroy($cropped_image);
}

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
JS轻松实现打地鼠游戏
JS轻松实现打地鼠游戏

共6课时 | 0.7万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号