PHP 怎么PHP 图片重新采样

wen PHP项目 3

本文目录导读:

PHP 怎么PHP 图片重新采样

  1. 方法一:使用 imagescale() (最简单,PHP 5.5+ 推荐)
  2. 方法二:使用 imagecopyresampled() (最灵活、最常用)
  3. 方法三:处理透明 PNG/GIF 图片
  4. 方法四:使用 Imagick 扩展 (性能更好)
  5. 总结与建议

在 PHP 中,图片重新采样通常是指改变图片的尺寸(缩放)或转换图片格式,同时保持或优化图片质量。

最核心的函数是 imagescale()(PHP 5.5+)和 imagecopyresampled()(更灵活、更底层),前者简单易用,后者功能强大。

以下是几种常见的 PHP 图片重新采样/缩放实现方法。


使用 imagescale() (最简单,PHP 5.5+ 推荐)

这个函数直接对图像资源进行缩放,返回一个新的图像资源,非常适合简单的等比或固定宽度/高度缩放。

示例:将图片缩放为 300 像素宽(高度自动等比)

<?php
// 1. 加载图片(支持 JPEG, PNG, GIF, WEBP)
$sourceImage = imagecreatefromjpeg('input.jpg');
// $sourceImage = imagecreatefrompng('input.png');
// 2. 重新采样:宽度设为 300,高度自动计算(-1 表示自动)
$newWidth = 300;
$newImage = imagescale($sourceImage, $newWidth, -1, IMG_BILINEAR_FIXED); 
// 第三个参数 -1 表示自动等比高度;第四个参数是缩放算法
// 3. 输出/保存
imagejpeg($newImage, 'output.jpg', 85); // 保存为 JPEG,质量 85
// imagepng($newImage, 'output.png');
// 4. 释放内存
imagedestroy($sourceImage);
imagedestroy($newImage);
echo "Done!";
?>

imagescale() 优点:代码少,自动处理等比。

使用 imagecopyresampled() (最灵活、最常用)

这是最经典的函数,允许你对原图的任意区域进行裁剪并缩放,常用于制作缩略图(Thumbnail)。

核心参数imagecopyresampled(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h)

示例:生成 150x150 的固定尺寸缩略图(居中裁剪)

<?php
// 1. 加载原图并获取信息
$srcFile = 'input.jpg';
list($srcWidth, $srcHeight, $srcType) = getimagesize($srcFile);
// 根据类型创建图像资源
switch ($srcType) {
    case IMAGETYPE_JPEG: $srcImage = imagecreatefromjpeg($srcFile); break;
    case IMAGETYPE_PNG:  $srcImage = imagecreatefrompng($srcFile); break;
    case IMAGETYPE_GIF:  $srcImage = imagecreatefromgif($srcFile); break;
    case IMAGETYPE_WEBP: $srcImage = imagecreatefromwebp($srcFile); break;
    default: die('Unsupported image type');
}
// 2. 设置目标尺寸(缩略图大小)
$thumbWidth = 150;
$thumbHeight = 150;
// 3. 计算裁剪区域(居中裁剪,保持图片内容不拉伸)
$srcRatio = $srcWidth / $srcHeight;
$thumbRatio = $thumbWidth / $thumbHeight;
if ($srcRatio > $thumbRatio) {
    // 原图更宽:高度充满,宽度裁剪
    $cropHeight = $srcHeight;
    $cropWidth = $srcHeight * $thumbRatio;
    $srcX = ($srcWidth - $cropWidth) / 2;
    $srcY = 0;
} else {
    // 原图更高:宽度充满,高度裁剪
    $cropWidth = $srcWidth;
    $cropHeight = $srcWidth / $thumbRatio;
    $srcX = 0;
    $srcY = ($srcHeight - $cropHeight) / 2;
}
// 4. 创建目标画布
$thumbImage = imagecreatetruecolor($thumbWidth, $thumbHeight);
// 5. 执行重新采样(高质量缩放)
imagecopyresampled($thumbImage, $srcImage, 
                   0, 0,          // 目标坐标
                   $srcX, $srcY,  // 源坐标(裁剪起点)
                   $thumbWidth, $thumbHeight, // 目标尺寸
                   $cropWidth, $cropHeight);  // 源尺寸(裁剪区域)
// 6. 保存或输出
imagejpeg($thumbImage, 'thumb.jpg', 90);
// imagepng($thumbImage, 'thumb.png');
// 7. 释放内存
imagedestroy($srcImage);
imagedestroy($thumbImage);
echo "Thumbnail created!";
?>

处理透明 PNG/GIF 图片

如果原图是 PNG 或 GIF 且包含透明背景,直接缩放会丢失透明度,你必须先启用 alpha blending

<?php
// 加载 PNG
$srcImage = imagecreatefrompng('transparent.png');
// 创建目标图像
$newWidth = 200;
$newHeight = 200;
$newImage = imagecreatetruecolor($newWidth, $newHeight);
// 保留透明通道
imagealphablending($newImage, false);
imagesavealpha($newImage, true);
$transparent = imagecolorallocatealpha($newImage, 255, 255, 255, 127); // 完全透明
imagefill($newImage, 0, 0, $transparent);
// 重新采样
imagecopyresampled($newImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, imagesx($srcImage), imagesy($srcImage));
// 保存 PNG
imagepng($newImage, 'scaled_transparent.png');
imagedestroy($srcImage);
imagedestroy($newImage);
?>

使用 Imagick 扩展 (性能更好)

如果你的服务器安装了 Imagick(ImageMagick 的 PHP 扩展),处理大型图片时性能通常优于 GD。

<?php
// 加载图片
$image = new Imagick('input.jpg');
// 重新采样(缩放)
$image->resizeImage(300, 0, Imagick::FILTER_LANCZOS, 1); 
// 第二个参数 0 表示自动计算高度(等比)
// 或固定尺寸裁剪缩放
// $image->cropThumbnailImage(150, 150); // 居中裁剪缩放
// 输出
$image->writeImage('output_imagick.jpg');
// 释放
$image->destroy();
echo "Done with Imagick!";
?>

总结与建议

场景 推荐方法
简单等比缩放 imagescale()
制作固定尺寸缩略图(需裁剪) imagecopyresampled() + 居中裁剪逻辑
处理透明 PNG/GIF imagecopyresampled() + alpha 处理
大数据量图片处理 Imagick 扩展
需要保持原图比例 计算缩放比例(min($thumbWidth/$srcWidth, $thumbHeight/$srcHeight) 后应用)

核心函数imagecreatefromjpeg/png/gif/webp(加载) → imagecreatetruecolor(创建目标) → imagecopyresampled(缩放) → imagejpeg/png/webp(输出) → imagedestroy(释放)。

抱歉,评论功能暂时关闭!