php图片操作(按固定大小裁剪、按比例裁剪)

一、按照指定大小缩放图片

/**
 * Function: 按照指定大小缩放图片
 * @param string $file 文件地址
 * @param int $imgWidth 新图片宽
 * @param int $imgHeight 新图片高
 * @param string $fileName 保存文件名
 * @throws Exception
 * Author: yvhsse
 * Date: 2019-09-19 17:18
 */
function resizeAppointImage($file, $imgWidth, $imgHeight,$fileName)
{
    //1.获取图片信息
    $info = getimagesize($file);
    //2.通过编号获取图像类型
    $type = image_type_to_extension($info[2], false);
    //3.在内存中创建和图像类型一样的图像
    try {
        $fun = "imagecreatefrom" . $type;
        $image = $fun($file);
    } catch (\Exception $e) {
        throw new Exception('非法图像文件');
    }
    $target_image = imagecreatetruecolor($imgWidth, $imgHeight); //创建一个彩色的底图
    imagecopyresampled($target_image, $image, 0, 0, 0, 0, $imgWidth, $imgHeight, imagesx($image), imagesy($image));
    //可以根据类型存放原类型图片
    $fileName = $fileName.'.png';
    imagepng($target_image, $fileName);
    //销毁图片
    imagedestroy($image);
}

resizeAppointImage('./avatar.png',100,100,'./ss');

2.按照图片比例缩放图片

/**
 * Function: 根据图片比例缩放图片
 * @param string $file 文件地址
 * @param int $maxWidth 图片最大宽度
 * @param int $maxHeight 图片最大高度
 * @param string $fileName 保存文件名
 * @throws Exception
 * Author: yvhsse
 * Date: 2019-09-19 17:23
 */
function resizeRatioImage($file, $maxWidth, $maxHeight,$fileName)
{
    //1.获取图片信息
    $info = getimagesize($file);
    //2.通过编号获取图像类型
    $type = image_type_to_extension($info[2], false);
    //3.在内存中创建和图像类型一样的图像
    try {
        $fun = "imagecreatefrom" . $type;
        $image = $fun($file);
    } catch (\Exception $e) {
        throw new Exception('非法图像文件');
    }
    $picWidth = imagesx($image);
    $picHeight = imagesy($image);
    $source_ratio = $picHeight / $picWidth;//原图比例
    $target_ratio = $maxHeight / $maxWidth;//新图比例
    if ($source_ratio > $target_ratio) {
        // 源图过高
        $cropped_width = $picWidth;
        $cropped_height = $picWidth * $target_ratio;
        $source_x = 0;
        $source_y = ($picHeight - $cropped_height) / 2;
    } elseif ($source_ratio < $target_ratio) {
        // 源图过宽
        $cropped_width = $picHeight / $target_ratio;
        $cropped_height = $picHeight;
        $source_x = ($picWidth - $cropped_width) / 2;
        $source_y = 0;
    } else {
        //源图适中
        $cropped_width = $picWidth;
        $cropped_height = $picHeight;
        $source_x = 0;
        $source_y = 0;
    }
    $target_image = imagecreatetruecolor($maxWidth, $maxHeight);
    $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);
    // 裁剪
    imagecopy($cropped_image, $image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
    // 缩放
    imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $maxWidth, $maxHeight, $cropped_width, $cropped_height);
    //可以根据类型存放原类型图片
    $fileName = $fileName.'.png';
    imagepng($target_image, $fileName);
    //销毁图片
    imagedestroy($image);
}

resizeRatioImage('./avatar.png',100,100,'./ss');


评论