解决方案

  1. 找到裁剪缩略图的方法

    • 文件位置:/core/function/file.php
    • 搜索:function cut_img,大约在447行
  2. 优化cut_img方法

    • 实现居中裁剪功能

优化代码

以下是优化后的cut_img函数代码:

// 剪切图片
function cut_img($src_image, $out_image = null, int $new_width = null, int $new_height = null, $img_quality = 90)
{
    // 输出地址
    if (! $out_image) {
        $out_image = $src_image;
    }

    // 读取配置文件设置
    if (! $new_width && ! $new_height) {
        return;
    }

    // 获取图片属性
    list($width, $height, $type, $attr) = getimagesize($src_image);

    // 根据图片类型创建资源
    switch ($type) {
        case IMAGETYPE_GIF:
            $img = imagecreatefromgif($src_image);
            break;
        case IMAGETYPE_JPEG:
            $img = imagecreatefromjpeg($src_image);
            break;
        case IMAGETYPE_PNG:
            $img = imagecreatefrompng($src_image);
            break;
        default:
            return;
    }

    // 计算裁剪区域
    $crop_width = min($width, $new_width);
    $crop_height = min($height, $new_height);
    $crop_x = intval(($width - $crop_width) / 2); // 居中裁剪
    $crop_y = intval(($height - $crop_height) / 2); // 居中裁剪

    // 创建新画布
    $new_img = imagecreatetruecolor($new_width, $new_height);

    // 创建透明画布,避免黑色背景
    if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_PNG) {
        imagealphablending($new_img, false);
        imagesavealpha($new_img, true);
        $color = imagecolorallocatealpha($new_img, 255, 255, 255, 127);
        imagefilledrectangle($new_img, 0, 0, $new_width, $new_height, $color);
    }

    // 裁剪并缩放
    imagecopyresampled($new_img, $img, 0, 0, $crop_x, $crop_y, $new_width, $new_height, $crop_width, $crop_height);

    // 保存新图片
    switch ($type) {
        case IMAGETYPE_GIF:
            imagegif($new_img, $out_image);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($new_img, $out_image, $img_quality);
            break;
        case IMAGETYPE_PNG:
            imagepng($new_img, $out_image);
            break;
    }

    // 释放资源
    imagedestroy($img);
    imagedestroy($new_img);
}