
在 PHP 中,处理图片(如生成缩略图)是常见的需求。以下是一个完整的图片处理类封装实例,支持生成缩略图、调整图片大小、添加水印等功能。
1. 图片处理类
示例代码
<?phpclass ImageProcessor {
private $image; // 图片资源
private $imageType; // 图片类型
/**
* 加载图片
*
* @param string $file 图片文件路径
*/
public function load($file) {
if (!file_exists($file)) {
throw new Exception("图片文件不存在: $file");
}
$info = getimagesize($file);
$this->imageType = $info[2];
switch ($this->imageType) {
case IMAGETYPE_JPEG:
$this->image = imagecreatefromjpeg($file);
break;
case IMAGETYPE_PNG:
$this->image = imagecreatefrompng($file);
break;
case IMAGETYPE_GIF:
$this->image = imagecreatefromgif($file);
break;
default:
throw new Exception("不支持的图片类型: $file");
}
}
/**
* 保存图片
*
* @param string $file 保存路径
* @param int $quality 图片质量(仅适用于 JPEG)
*/
public function save($file, $quality = 90) {
switch ($this->imageType) {
case IMAGETYPE_JPEG:
imagejpeg($this->image, $file, $quality);
break;
case IMAGETYPE_PNG:
imagepng($this->image, $file);
break;
case IMAGETYPE_GIF:
imagegif($this->image, $file);
break;
default:
throw new Exception("不支持的图片类型");
}
}
/**
* 调整图片大小
*
* @param int $width 目标宽度
* @param int $height 目标高度
* @param bool $crop 是否裁剪图片
*/
public function resize($width, $height, $crop = false) {
$srcWidth = imagesx($this->image);
$srcHeight = imagesy($this->image);
if ($crop) {
// 裁剪模式
$ratio = max($width / $srcWidth, $height / $srcHeight);
$newWidth = $srcWidth * $ratio;
$newHeight = $srcHeight * $ratio;
$tmpImage = imagecreatetruecolor($width, $height);
imagecopyresampled($tmpImage, $this->image, 0, 0, ($newWidth - $width) / 2, ($newHeight - $height) / 2, $width, $height, $width, $height);
} else {
// 非裁剪模式
$ratio = min($width / $srcWidth, $height / $srcHeight);
$newWidth = $srcWidth * $ratio;
$newHeight = $srcHeight * $ratio;
$tmpImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($tmpImage, $this->image, 0, 0, 0, 0, $newWidth, $newHeight, $srcWidth, $srcHeight);
}
$this->image = $tmpImage;
}
/**
* 添加水印
*
* @param string $watermarkFile 水印图片路径
* @param string $position 水印位置(top-left, top-right, bottom-left, bottom-right, center)
* @param int $margin 水印边距
*/
public function addWatermark($watermarkFile, $position = 'bottom-right', $margin = 10) {
if (!file_exists($watermarkFile)) {
throw new Exception("水印图片不存在: $watermarkFile");
}
$watermark = imagecreatefrompng($watermarkFile);
$watermarkWidth = imagesx($watermark);
$watermarkHeight = imagesy($watermark);
$imageWidth = imagesx($this->image);
$imageHeight = imagesy($this->image);
switch ($position) {
case 'top-left':
$x = $margin;
$y = $margin;
break;
case 'top-right':
$x = $imageWidth - $watermarkWidth - $margin;
$y = $margin;
break;
case 'bottom-left':
$x = $margin;
$y = $imageHeight - $watermarkHeight - $margin;
break;
case 'bottom-right':
$x = $imageWidth - $watermarkWidth - $margin;
$y = $imageHeight - $watermarkHeight - $margin;
break;
case 'center':
$x = ($imageWidth - $watermarkWidth) / 2;
$y = ($imageHeight - $watermarkHeight) / 2;
break;
default:
throw new Exception("无效的水印位置: $position");
}
imagecopy($this->image, $watermark, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight);
imagedestroy($watermark);
}
/**
* 释放图片资源
*/
public function __destruct() {
if ($this->image) {
imagedestroy($this->image);
}
}}// 示例用法try {
// 创建图片处理对象
$processor = new ImageProcessor();
// 加载图片
$processor->load('input.jpg');
// 生成缩略图
$processor->resize(200, 200, true);
// 添加水印
$processor->addWatermark('watermark.png', 'bottom-right');
// 保存图片
$processor->save('output.jpg');} catch (Exception $e) {
echo "错误: " . $e->getMessage();}?>2. 代码说明
ImageProcessor类:load():加载图片文件。save():保存图片文件。resize():调整图片大小,支持裁剪模式。addWatermark():添加水印,支持多种位置。__destruct():释放图片资源。图片处理功能:
支持 JPEG、PNG、GIF 格式的图片。
支持生成缩略图,并可选是否裁剪。
支持添加水印,水印位置可自定义。
异常处理:
使用
try-catch捕获异常,确保代码健壮性。
3. 使用步骤
加载图片:
调用
$processor->load('input.jpg')加载图片文件。调整图片大小:
调用
$processor->resize(200, 200, true)生成缩略图。添加水印:
调用
$processor->addWatermark('watermark.png', 'bottom-right')添加水印。保存图片:
调用
$processor->save('output.jpg')保存处理后的图片。
4. 注意事项
图片格式:
支持 JPEG、PNG、GIF 格式的图片。
水印图片必须是 PNG 格式,支持透明背景。
性能优化:
对于大图片,调整大小和添加水印可能会消耗较多内存,建议对图片进行压缩或分块处理。
水印位置:
水印位置支持
top-left、top-right、bottom-left、bottom-right和center。异常处理:
确保捕获并处理异常,避免程序崩溃。
5. 总结
| 功能 | 说明 |
|---|---|
| 加载图片 | 支持 JPEG、PNG、GIF 格式 |
| 调整图片大小 | 支持裁剪模式 |
| 添加水印 | 支持多种位置 |
| 保存图片 | 支持 JPEG、PNG、GIF 格式 |
通过封装图片处理类,可以方便地在 PHP 项目中实现图片处理功能,如生成缩略图、添加水印等。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


