使用gd库实现php服务端图片裁剪和生成缩略图功能分享


当然,使用GD库在PHP中实现图片裁剪和生成缩略图功能是常见的需求。以下是一个简单的示例,展示如何完成这两项任务。

### 图片裁剪

为了裁剪图片,你首先需要确定裁剪区域(x, y, width, height),然后使用`imagecopyresampled()`函数将指定区域的图片复制到新创建的图片上。


<?php
function cropImage($sourceImagePath, $destImagePath, $x, $y, $width, $height) {
    // 加载原始图片
    list($sourceWidth, $sourceHeight, $sourceType) = getimagesize($sourceImagePath);
    switch ($sourceType) {
        case IMAGETYPE_GIF:
            $sourceImage = imagecreatefromgif($sourceImagePath);
            break;
        case IMAGETYPE_JPEG:
            $sourceImage = imagecreatefromjpeg($sourceImagePath);
            break;
        case IMAGETYPE_PNG:
            $sourceImage = imagecreatefrompng($sourceImagePath);
            break;
        default:
            die('Unsupported image type.');
    }

    // 创建一个新图片用于存放裁剪后的图片
    $destImage = imagecreatetruecolor($width, $height);

    // 裁剪图片
    imagecopyresampled($destImage, $sourceImage, 0, 0, $x, $y, $width, $height, $width, $height);

    // 保存裁剪后的图片
    switch ($sourceType) {
        case IMAGETYPE_GIF:
            imagegif($destImage, $destImagePath);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($destImage, $destImagePath);
            break;
        case IMAGETYPE_PNG:
            imagepng($destImage, $destImagePath);
            break;
    }

    // 释放内存
    imagedestroy($sourceImage);
    imagedestroy($destImage);
}

// 使用示例
cropImage('source.jpg', 'cropped.jpg', 100, 50, 200, 150);
?>

### 生成缩略图

生成缩略图与裁剪类似,但通常你会根据原始图片的比例来缩放整个图片,以保持其宽高比。


<?php
function createThumbnail($sourceImagePath, $destImagePath, $thumbnailWidth) {
    list($sourceWidth, $sourceHeight, $sourceType) = getimagesize($sourceImagePath);

    // 计算缩略图的宽高比
    $thumbnailHeight = ($sourceHeight / $sourceWidth) * $thumbnailWidth;

    // 创建缩略图
    switch ($sourceType) {
        case IMAGETYPE_GIF:
            $sourceImage = imagecreatefromgif($sourceImagePath);
            $destImage = imagecreatetruecolor($thumbnailWidth, $thumbnailHeight);
            break;
        case IMAGETYPE_JPEG:
            $sourceImage = imagecreatefromjpeg($sourceImagePath);
            $destImage = imagecreatetruecolor($thumbnailWidth, $thumbnailHeight);
            break;
        case IMAGETYPE_PNG:
            $sourceImage = imagecreatefrompng($sourceImagePath);
            $destImage = imagecreatetruecolor($thumbnailWidth, $thumbnailHeight);
            imagealphablending($destImage, false);
            imagesavealpha($destImage, true);
            break;
        default:
            die('Unsupported image type.');
    }

    // 缩放图片
    imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $thumbnailWidth, $thumbnailHeight, $sourceWidth, $sourceHeight);

    // 保存缩略图
    switch ($sourceType) {
        case IMAGETYPE_GIF:
            imagegif($destImage, $destImagePath);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($destImage, $destImagePath, 80); // 80% 质量
            break;
        case IMAGETYPE_PNG:
            imagepng($destImage, $destImagePath);
            break;
    }

    // 释放内存
    imagedestroy($sourceImage);
    imagedestroy($destImage);
}

// 使用示例
createThumbnail('source.jpg', 'thumbnail.jpg', 100);
?>

这两个函数展示了如何使用GD库在PHP中裁剪图片和生成缩略图。你可以根据自己的需求调整这些函数,例如添加错误处理或支持更多的图片格式。