PHP上传图片进行等比缩放可增加水印功能



<?php
// 假设图片已上传至临时目录,并且我们通过$_FILES获取了文件信息
$sourceFile = $_FILES['uploaded_image']['tmp_name']; // 上传文件的临时路径
$targetDir = 'uploads/'; // 目标存储目录
$targetFile = $targetDir . basename($_FILES['uploaded_image']['name']); // 目标文件名

// 移动文件到目标目录
if (move_uploaded_file($sourceFile, $targetFile)) {
    // 图片等比缩放
    $maxWidth = 800; // 最大宽度
    $maxHeight = 600; // 最大高度
    list($width, $height, $type) = getimagesize($targetFile);

    // 计算缩放比例
    $scale = min($maxWidth / $width, $maxHeight / $height);
    $newWidth = floor($width * $scale);
    $newHeight = floor($height * $scale);

    // 创建新的图像资源
    switch ($type) {
        case IMAGETYPE_GIF:
            $srcImage = imagecreatefromgif($targetFile);
            break;
        case IMAGETYPE_JPEG:
            $srcImage = imagecreatefromjpeg($targetFile);
            break;
        case IMAGETYPE_PNG:
            $srcImage = imagecreatefrompng($targetFile);
            break;
        default:
            exit('Unsupported image format');
    }

    $dstImage = imagecreatetruecolor($newWidth, $newHeight);
    imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

    // 添加水印
    $watermarkFile = 'watermark.png'; // 水印图片路径
    list($wWidth, $wHeight, $wType) = getimagesize($watermarkFile);
    $watermarkImage = imagecreatefrompng($watermarkFile);

    // 水印位置
    $x = $newWidth - $wWidth - 10;
    $y = $newHeight - $wHeight - 10;

    // 将水印合并到图片上
    imagecopy($dstImage, $watermarkImage, $x, $y, 0, 0, $wWidth, $wHeight);

    // 保存图片
    switch ($type) {
        case IMAGETYPE_GIF:
            imagegif($dstImage, $targetFile);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($dstImage, $targetFile, 90); // 90% 压缩质量
            break;
        case IMAGETYPE_PNG:
            imagepng($dstImage, $targetFile, 9); // 0 (完全无损) 到 9 (完全有损)
            break;
    }

    // 释放内存
    imagedestroy($srcImage);
    imagedestroy($dstImage);
    imagedestroy($watermarkImage);

    echo "图片上传并处理成功!";
} else {
    echo "图片上传失败!";
}
?>

这段代码实现了PHP中上传图片、进行等比缩放并添加水印的功能。首先,它检查图片是否成功上传,然后基于原图尺寸和设定的最大尺寸计算缩放比例,接着创建新的图像资源并进行缩放。之后,加载水印图片并将其添加到缩放后的图片上,最后保存处理后的图片并释放图像资源。