• 技术文章 >后端开发 >php教程

    php图像裁剪服务器搭建

    angryTomangryTom2019-10-15 10:49:02转载924
    在我们的工作的项目中,有时候我们需要显示规定尺寸的图片,虽然可以通过css来控制显示大小。但是如果图片过大,会造成加载的延迟,影响网站整体性能。因此,我们需要一个服务器来帮助我们进行图片的裁剪。流程大致是,首先我们传给服务器原图像和裁剪的尺寸,然后服务器进行裁剪,生成对应的裁剪图片,下次我们再访问相同图像和相同的裁剪尺寸的时候,我们就不需要裁剪,直接进行图片的访问就行。

    Talk is cheap, show me the code.

    <?php
    // ①构建图片请求地址比如  http://xxx.com/resize.php?site=www&width=300&height=200&mode=2&path=uploadfile/helloworld.png
    // ②配置nginx重写规则  rewrite /s/(.*)/(\d+)x(\d+)-(\d)/(.*) /s/resize.php?site=$1&width=$2&height=$3&mode=$4&path=$5 last;
    //③进行裁剪图片的处理
    $path = trim($_GET['path']);
    $mode = intval($_GET['mode']);
    $site = trim($_GET['site']);
    $width = intval($_GET['width']);
    $height = intval($_GET['height']);
    $site_list = array('crop' => '.');
    $orig_dir = dirname(__FILE__);
    if (!array_key_exists($site, $site_list)) {
        header('HTTP/1.1 400 Bad Request');
        exit();
    }
    if ($mode > 3 || $mode < 0) {
        header('HTTP/1.1 400 Bad Request');
        exit();
    }
    $orig_file = $site_list[$site] . $path;
    if (!file_exists($orig_file)) {
        header('HTTP/1.1 404 Not Found');
        exit();
    }
    $file_ext = '.' . pathinfo($path, PATHINFO_EXTENSION);
    $file_name = basename($path, $file_ext);
    $save_path = "{$orig_dir}/{$site}/{$width}x{$height}-{$mode}{$path}";
    $save_dir = dirname($save_path);
    if (!file_exists($save_dir)) {
        wpx_mkdir($save_dir);
    }
    $target_width = $width;
    $target_height = $height;
    $save_image = $save_dir . '/' . $file_name . '.jpg';
    if (file_exists($save_image)) {
        header('Content-Type: image/jpeg');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
        echo file_get_contents($save_image);
    }
    imagecropper2($orig_file, $target_width, $target_height, $save_image);
    die;
    //原图像对应缩放裁剪,会拉伸图片
    function imagecropper2($source_path, $width, $height, $save_image)
    {
        
        //获取原图像$filename的宽度$width_orig和高度$height_orig
        $info =  getimagesize($source_path);
        
        $width_orig = $info[0];
        $height_orig = $info[1];
        $mime = $info['mime'];
        
        //根据参数$width和$height值,换算出等比例缩放的高度和宽度
        if ($width && ($width_orig<$height_orig)){
            $width = ($height/$height_orig)*$width_orig;
        }else{
            $height = ($width / $width_orig)*$height_orig;
        }
        //将原图缩放到这个新创建的图片资源中
        $image_p = imagecreatetruecolor($width, $height);
        //获取原图的图像资源
        if($mime=='image/jpeg'){
            $image = imagecreatefromjpeg($source_path);
        }elseif($mime=='image/png'){
            $image = imagecreatefrompng($source_path);
        }elseif($mime=='image/gif'){
            $image = imagecreatefromgif($source_path);
        }
        
        //使用imagecopyresampled()函数进行缩放设置
        imagecopyresampled($image_p,$image,0,0,0,0,$width,$height,$width_orig,$height_orig);
       
        //将缩放后的图片$image_p保存,100(质量最佳,文件最大)
        if($mime=='image/jpeg'){
            imagejpeg($image_p,$save_image);
            header('Content-Type: image/jpeg');
            imagejpeg($image_p);
        }elseif($mime=='image/png'){
            imagepng($image_p,$save_image);
            header('Content-Type: image/jpeg');
            imagepng($image_p);
        }else{
            imagegif($image_p,$save_image);
            header('Content-Type: image/jpeg');
            imagegif($image_p);
        }
        
    }
    //进行比例保存裁剪,会丢失图像部分像素
    function imagecropper($source_path, $target_width, $target_height, $save_image)
    {
        $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 < $target_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);
        // 裁剪
        $bool = imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
        // 缩放
        $bool = imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height);
        imagejpeg($target_image, $save_image);
        header('Content-Type: image/jpeg');
        imagejpeg($target_image);
        imagedestroy($source_image);
        imagedestroy($target_image);
        imagedestroy($cropped_image);
    }
    // 循环生成目录
    function wpx_mkdir($dir, $mode = 0777)
    {
        if (is_dir($dir) || @mkdir($dir, $mode)) {
            return true;
        }
        if (!wpx_mkdir(dirname($dir), $mode)) {
            return false;
        }
        return @mkdir($dir, $mode);
    }

    通过上面的处理,我们就将图片按照我们设置的尺寸进行了裁剪。我们还可以定期对裁剪图片进行清理,这样就不需要占用太多服务器空间。只有经常访问的图片才会一直保存。

    更多PHP相关知识,请访问PHP中文网

    php入门到就业线上直播课:查看学习

    以上就是php图像裁剪服务器搭建的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:www.80shihua.com,如有侵犯,请联系admin@php.cn删除

    Linux系统运维及项目正式上线:点击学习

    专题推荐:图像 裁剪
    上一篇:命令行下可以跑PHP脚本,但是通过浏览器却不能跑? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• thinkPHP框架实现图像裁剪、缩放、加水印的方法详解• php图像处理函数大全• PHP的图像识别技术原理与实现• php实现生成混合验证码与图像验证码并测试(代码)
    1/1

    PHP中文网