PHP图像处理:GD和Imagick库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP图像处理:GD和Imagick库概述



图像处理是Web开发中的常见任务之一。PHP有两个主要的图形处理库:GD(内置)和Imagick(ImageMagick的封装)。本文将介绍它们的功能、安装和实际示例。



GD库

GD是PHP的标准扩展,大多数主机都支持。它允许创建、修改和保存JPEG、PNG、GIF、WEBP格式的图像。



安装

在Ubuntu/Debian上:

sudo apt install php-gdsudo systemctl restart apache2


在Windows上——取消php.ini中extension=gd行的注释。



GD的主要函数

  • imagecreatefromjpeg()、imagecreatefrompng() — 加载图像
  • imagesx()、imagesy() — 获取宽度和高度
  • imagecopyresampled() — 带重采样的缩放
  • imagefilter() — 应用滤镜(模糊、负片)
  • imagettftext() — 使用TrueType字体添加文本
  • imagejpeg()、imagepng() — 保存结果


示例1:调整图像大小

<?php$src = 'photo.jpg';$dest = 'thumb.jpg';$newWidth = 300;

// 加载原始图像$img = imagecreatefromjpeg($src);$width = imagesx($img);$height = imagesy($img);

// 按比例计算新高度$newHeight = intval($height * $newWidth / $width);

// 创建新图像$thumb = imagecreatetruecolor($newWidth, $newHeight);imagecopyresampled($thumb, $img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

// 保存imagejpeg($thumb, $dest, 85);imagedestroy($img);imagedestroy($thumb);echo "完成: $dest";?>


示例2:添加水印

<?php$mainImg = imagecreatefromjpeg('background.jpg');$watermark = imagecreatefrompng('logo.png');

// 获取尺寸$mW = imagesx($mainImg);$mH = imagesy($mainImg);$wW = imagesx($watermark);$wH = imagesy($watermark);

// 位置——右下角,边距10px$dstX = $mW - $wW - 10;$dstY = $mH - $wH - 10;

// 复制带透明度的水印imagecopy($mainImg, $watermark, $dstX, $dstY, 0, 0, $wW, $wH);

// 保存imagepng($mainImg, 'result.png');imagedestroy($mainImg);imagedestroy($watermark);?>


Imagick库

Imagick是强大工具ImageMagick的面向对象封装。支持超过200种格式、复杂变换、PDF处理、动画和色彩配置文件。



安装

sudo apt install imagemagick php-imagicksudo systemctl restart apache2


检查安装:

<?php phpinfo(); ?>

找到imagick部分。



主要类和方法

  • Imagick — 图像处理的主要类
  • readImage() — 加载文件
  • resizeImage() — 调整大小
  • cropImage() — 裁剪
  • compositeImage() — 图像叠加
  • blurImage() — 模糊
  • setImageFormat() — 格式转换


示例3:缩放和裁剪

<?php$image = new Imagick('photo.jpg');

// 缩放到800x600,保持比例$image->resizeImage(800, 600, Imagick::FILTER_LANCZOS, 1, true);

// 裁剪中央400x400区域$width = $image->getImageWidth();$height = $image->getImageHeight();$x = ($width - 400) / 2;$y

推荐