联系官方销售客服

1835022288

028-61286886

分享经验 版主:论坛审计组
图片裁剪定位裁剪
类型:迅睿CMS 更新时间:2024-10-24 09:52:07

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

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

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

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

    学习学习

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

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

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

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