图片裁剪定位裁剪

迅睿框架 更新 2025-01-03 17:26:45 小黄人 18html.com

图片裁剪,定位裁剪!花了一天时间测试和修改!望采纳!

图片过小时,等比拉伸,再裁剪!

图片有一边小于限定尺寸时! 放大图片到限定尺寸再裁剪!

希望老大更新到库里!包括png 裁剪时 透明背景变黑色问题!这里生成的缩略图,全部为jpg格式!

所以png裁剪,背景我设定为白色了!

本来想自己写成函数,但是发现创建的缓存目录写不进去 

c4ca4238a0b923820dcc509a6f75849b

所以放弃了,贡献出来,希望能升级昨天那个居中裁剪!


<?php

/**
 * 图片裁剪函数,支持指定定点裁剪和方位裁剪两种裁剪模式
 * @param <string>  $src_file       原图片路径
 * @param <int>     $new_width      裁剪后图片宽度(当宽度超过原图片宽度时,去原图片宽度)
 * @param <int>     $new_height     裁剪后图片高度(当宽度超过原图片宽度时,去原图片高度)
 * @param <int>     $type           裁剪方式,1-方位模式裁剪;0-定点模式裁剪。
 * @param <int>     $pos            方位模式裁剪时的起始方位(当选定点模式裁剪时,此参数不起作用)
 *                                      1为顶端居左,2为顶端居中,3为顶端居右;
 *                                      4为中部居左,5为中部居中,6为中部居右;
 *                                      7为底端居左,8为底端居中,9为底端居右;
 * @param <int>     $start_x        起始位置X (当选定方位模式裁剪时,此参数不起作用)
 * @param <int>     $start_y        起始位置Y(当选定方位模式裁剪时,此参数不起作用)
 * @return <string>                 裁剪图片存储路径
 */

thumb('D:\123www\bb.com\static\assets\logo-web.png', '210', '140');

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'];

    //$dst_file = $pathinfo['dirname'] . '/' . $pathinfo['filename'] .'_'. $new_width . 'x' . $new_height . '.jpg';
    //$dst_file = $pathinfo['filename'] . '_' . $new_width . 'x' . $new_height . '.jpg';
    

$dst_file='D:\123www\bb.com/uploadfile/202004/thumb/c4ca4238a0b923820dcc509a6f75849b/210x140_middiy.jpg';
echo $dst_file;

    if (!file_exists($dst_file)) {

        if ($new_width < 1 || $new_height < 1) {
            echo "params width or height error !";
            return;
            //exit();
        }
        if (!file_exists($src_file)) {
            echo $src_file . " is not exists !";
            return;
            // exit();
        }

        $img_type = pathinfo($src_file, PATHINFO_EXTENSION);
        $img_type = strtolower($img_type);
        /* 载入图像 */
        switch ($img_type) {
            case 'jpg':
                if (@!($src_img = imagecreatefromjpeg($src_file))) {
                    if (@!($src_img = imagecreatefrompng($src_file))) {
                        $src_img = imagecreatefromgif($src_file);
                    }
                }
                break;
            case 'png':
                if (@!($src_img = imagecreatefrompng($src_file))) {
                    if (@!($src_img = imagecreatefromjpeg($src_file))) {
                        $src_img = imagecreatefromgif($src_file);
                    }
                }
                break;
            case 'gif':
                if (@!($src_img = imagecreatefromgif($src_file))) {
                    if (@!($src_img = imagecreatefrompng($src_file))) {
                        $src_img = imagecreatefromjpeg($src_file);
                    }
                }
                break;
            default:
                echo "载入图像错误!";
                return;
                //exit();
        }

        /* 获取源图片的宽度和高度 */
        $w = imagesx($src_img);
        $h = imagesy($src_img);

        $ratio_w = 1.0 * $new_width / $w;
        $ratio_h = 1.0 * $new_height / $h;
        $ratio   = 1.0;

        /* 计算剪切图片的宽度和高度 */
        $mid_width  = ($w < $new_width) ? $w : $new_width;
        $mid_height = ($h < $new_height) ? $h : $new_height;

        /* 初始化源图片剪切裁剪的起始位置坐标 */
        switch ($pos * $type) {
            case 1: //1为顶端居左
                $start_x = 0;
                $start_y = 0;
                break;
            case 2: //2为顶端居中
                $start_x = ($w - $mid_width) / 2;
                $start_y = 0;
                break;
            case 3: //3为顶端居右
                $start_x = $w - $mid_width;
                $start_y = 0;
                break;
            case 4: //4为中部居左
                $start_x = 0;
                $start_y = ($h - $mid_height) / 2;
                break;
            case 5: //5为中部居中
                $start_x = ($w - $mid_width) / 2;
                $start_y = ($h - $mid_height) / 2;
                break;
            case 6: //6为中部居右
                $start_x = $w - $mid_width;
                $start_y = ($h - $mid_height) / 2;
                break;
            case 7: //7为底端居左
                $start_x = 0;
                $start_y = $h - $mid_height;
                break;
            case 8: //8为底端居中
                $start_x = ($w - $mid_width) / 2;
                $start_y = $h - $mid_height;
                break;
            case 9: //9为底端居右
                $start_x = $w - $mid_width;
                $start_y = $h - $mid_height;
                break;
            default: //随机
                break;
        }

// 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
        if (($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
            //echo "都小,或都大";

            $inter_img = imagecreatetruecolor($mid_width, $mid_height);

            $color = imagecolorallocate($inter_img, 255, 255, 255); //2.上色
            imagecolortransparent($inter_img, $color); //3.设置透明色
            imagefill($inter_img, 0, 0, $color); //4.填充透明色

            //var_dump($inter_img);
            imagecopy($inter_img, $src_img, 0, 0, $start_x, $start_y, $mid_width, $mid_height);
            // 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
            // 定义一个新的图像
            $new_img = imagecreatetruecolor($new_width, $new_height);

            $color = imagecolorallocate($new_img, 255, 255, 255); //2.上色
            imagecolortransparent($new_img, $color); //3.设置透明色
            imagefill($new_img, 0, 0, $color); //4.填充透明色

            //var_dump($new_img);exit();
            imagecopyresampled($new_img, $inter_img, 0, 0, 0, 0, $new_width, $new_height, $mid_width, $mid_height);

            imagejpeg($new_img, $dst_file, 100);

        } else {

            //目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
            // *******
            // if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) ){
            // *******

            //echo "一个边大于原图,一个边小于原图";

            $ratio = $ratio_h > $ratio_w ? $ratio_h : $ratio_w; //取比例大的那个值

            echo $ratio;
            // 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
            $inter_w   = (int) ($w * $ratio);
            $inter_h   = (int) ($h * $ratio);
            $inter_img = imagecreatetruecolor($inter_w, $inter_h);

            $color = imagecolorallocate($inter_img, 255, 255, 255); //2.上色
            imagecolortransparent($inter_img, $color); //3.设置透明色
            imagefill($inter_img, 0, 0, $color); //4.填充透明色

            //将原图缩放比例后裁剪
            imagecopyresampled($inter_img, $src_img, 0, 0, 0, 0, $inter_w, $inter_h, $w, $h);

            // 定义一个新的图像
            $new_img = imagecreatetruecolor($new_width, $new_height);

            $color = imagecolorallocate($new_img, 255, 255, 255); //2.上色
            imagecolortransparent($new_img, $color); //3.设置透明色
            imagefill($new_img, 0, 0, $color); //4.填充透明色

            imagecopy($new_img, $inter_img, 0, 0, $start_x, $start_y, $new_width, $new_height);

            imagejpeg($new_img, $dst_file, 100);
        }

    }
    return ltrim($dst_file, '.');
}


方案

  • 小黄人 18html.com #1 · 2020-04-23 11:15:04
    迅睿昨天更新的定位裁剪代码中,PNG 裁剪出来背景是黑色!图片过小,无法正常裁剪出设定尺寸!
  • 设计部 #2 · 2020-04-23 11:18:54
    放在config/custom.php里面报错了
  • 小黄人 18html.com #3 · 2020-04-23 11:29:49
    设计部以上代码测试时用的,请修改对应的内容!报错是正常的,都说了无法写入
  • 维嘉 #4 · 2020-04-23 13:39:20
    顶一下
  • lin818 #5 · 2020-06-11 10:00:50
    顶一下
  • 梦幻 #6 · 2020-06-11 10:10:44
    看看
  • K大帅 #7 · 2020-06-11 10:42:28
    看看
  • 123 #8 · 2020-06-11 13:35:11
    看看~
  • 老玩童 #9 · 2020-06-11 14:23:31
    学习下
  • #10 · 2020-06-12 09:42:32
    看看
  • 张益达 #11 · 2020-06-12 09:47:00
    支持
  • geekcode #12 · 2020-06-12 11:09:03
    好厉害的样子
  • 湘西北的风 #13 · 2020-06-12 12:47:56
    这个功能太好了
  • 湘西北的风 #14 · 2020-06-12 21:02:26
    以前的png的时候 图片就是全部黑色的,这个功能还是很有用的
  • 15625789216 #15 · 2020-06-13 08:15:06
    学习
  • 繁星 #16 · 2020-06-13 15:38:53
    学习了
  • iseeyo #17 · 2020-06-14 11:30:03
    支持下,很实用的改进
  • jxreb #18 · 2020-06-15 14:10:26
    高手高高手
  • 快乐无罪 #19 · 2020-06-20 23:34:49
    手高高手
  • 随时起飞 #20 · 2020-06-22 09:37:28
    这个功能,可以,若再增加一个,缩略图,上传了,按需载裁剪就更完美了。
  • 村长 #21 · 2020-06-24 15:49:49
    感谢分享啊
  • 老小白 #22 · 2021-01-02 18:21:17
    666,感谢分享
  • 自牧 #23 · 2021-01-02 23:28:06
    学习
  • 吃不痴 #24 · 2021-03-11 22:24:22
    学习一下
  • Mr.Wa #25 · 2021-03-12 15:55:32
    学习学习
  • 18716408881 #26 · 2021-03-14 21:23:30

    学习学习

  • Alvin #27 · 2021-05-10 10:32:46
    看看学习一下
  • jnsirman #28 · 2021-05-11 16:45:53
    大神就是不一样
  • Rain_阳光 #29 · 2021-05-11 20:33:41
    • 看看学习一下

  • PHP学生 #30 · 2021-05-12 09:04:58
    看看学习一下
  • 昱宇 #31 · 2021-06-09 20:46:44
    看一下
  • 找寻知音 #32 · 2021-06-16 09:58:18
    谢谢分享 学习了
  • 大勇 #33 · 2021-06-25 09:12:38
    怎么个裁剪法
  • Keep #34 · 2021-06-25 09:50:59
    谢谢分享
  • 胡银萍 #35 · 2021-06-29 18:21:09
    111111111111111
  • 67495 #36 · 2021-07-12 04:21:58
    学习一下
  • #37 · 2021-07-15 14:45:08
    学习一下
  • wfulin #38 · 2021-08-04 17:46:46
    tyyyyyyyyyyyyyyyyyyyyyyyyyyyy
  • smgtao #39 · 2021-08-23 19:07:19
    看看!!!!!
  • PHP菜鸟 #40 · 2021-08-24 17:01:27
    厉害了,学习下
  • 18600969886 #41 · 2021-10-16 00:24:59
    学习下
  • xr222 #42 · 2021-10-16 16:46:19
    学习下
  • 天下无难事 #43 · 2021-10-16 16:52:28
    小黄人牛
  • 小白白 #44 · 2021-10-16 17:38:33
    学习学习
  • 建站仿站seo优化 #45 · 2021-11-09 20:14:20
    支持一下
  • 贰壹网络 #46 · 2021-11-13 02:24:53
    学习了,点个赞。 👍
  • 华仔 #47 · 2021-11-25 05:26:52
    支持下,很实用的改进
  • 阿郎的春天 #48 · 2021-11-25 08:38:46
    好厉害的样子
  • 夏正松 #49 · 2021-11-25 08:42:00
    缩略图统一png格式, 可以 只是文件比 jpg 大
  • 夏正松 #50 · 2021-11-25 09:15:33
    小黄人 18html.com 先判断目录是否存在 不存在 就 mkdir 就可以了无损缩放 缩略图 最有效的方式还是 全部统一成 png 格式缩略图 ,几乎完美
  • happyfruit #51 · 2021-11-27 17:03:01
    学习一下
  • p1114 #52 · 2021-12-07 15:51:38
    学习一下
  • 有型的胖子 #53 · 2021-12-08 18:02:07
    正好需要 学习学习
  • hades #54 · 2021-12-08 18:40:04
    看看干嘛的
  • 我是谁 #55 · 2021-12-08 19:18:46
    让我看看
  • 吴家庄 #56 · 2022-03-26 09:03:53
    分享分享!!!!
  • Joker #57 · 2022-05-10 17:00:44
    • 看看干嘛的

  • 醉猫猫 #58 · 2022-05-11 19:11:45
    看下 学习学习
  • 微科技工作室 #59 · 2022-05-12 16:42:48
    学习一下,看看怎么弄
  • 13894541733 #60 · 2022-05-15 18:00:46
    感谢楼主分享,学习一下
  • 帝云网络-长期接单 #61 · 2022-05-25 13:57:32
    学习下,看看
  • 好好学习天天向上 #62 · 2022-05-25 15:45:00
    学习一下
  • 来淘淘 #63 · 2022-05-26 15:43:58
    • 学习一下

  • shaw #64 · 2022-06-20 15:51:08
    学习学习
  • 老头子 #65 · 2022-06-21 11:14:59
    小黄人 18html.com 小黄人 18html 联系你不回复什么意思?让你发插件最新版 也不回复 你厉害就退款行不行?
  • demonsprit #66 · 2022-06-22 05:32:47
    回复看看.
  • 1002054290 #67 · 2022-07-02 15:27:22
    回复看一下哦回复看一下哦回复看一下哦
  • 石晋华 #68 · 2022-08-18 14:46:54
    顶一下
  • 迈克 #69 · 2022-08-20 10:32:52
    这个功能可以,后续做打水印相关的插件确实用到。
  • 哈哈大王 #70 · 2022-09-05 11:48:50
    看看...
  • 简单哥 #71 · 2023-05-06 16:36:45
    看看是不是我想要的
  • 汤上 #72 · 2023-07-28 15:13:54
    学习一下学习一下
  • 微信20330286 #73 · 2024-04-26 12:01:30
    正需要这个功能 顶一下
  • #74 · 2024-04-26 14:14:33
    高手,学习学习
  • #75 · 2024-04-26 14:14:57
    高手,学习学习
  • 刘云海 #76 · 2024-05-15 11:45:00
    学习学习学习学习
  • 小菜菜 #77 · 2024-10-24 09:52:07
    谢谢分享 学习学习
  • 凌云大大 #78 · 2024-12-06 11:54:52

    这个功能太好了

  • 紫筱姣姣 #79 · 2025-01-03 15:06:52
    学习一下
    学习学习
  • 大於 #80 · 2025-01-03 17:26:45
    先判断目录是否存在

迅睿系统漏洞

GeoSeo收录宝
GeoSeo收录宝(2026-09-01)
升级 ai智能发布功能 升级 支持8国语言后端设置和前端输出功能 ...
Word发布批量上传
Word发布批量上传(2026-08-31)
版本覆盖问题重发
多语言翻译Seolang
多语言翻译Seolang(2026-08-31)
新增 LLM 大模型对话翻译模块 配置层强类型化重构 URL 模...
自定义存储
自定义存储(2026-08-30)
同步服务器端通用版实现,统一管理端、CMS 端和浏览器直传的提示与错...
GeoSeo工具箱
GeoSeo工具箱(2026-08-29)
新增 bing推送 新增 IndexNow推送 新增 baidu...
外贸多语言建站
外贸多语言建站(2026-08-27)
新增阿里云专业版入口 新增阿里云自动识别字符格式
Querylist渐进式采集
Querylist渐进式采集(2026-08-26)
增加范围截取规则
实时任务
实时任务(2026-08-26)
补充并整理完整使用说明、历史版本更新日志,统一帮助页样式。