php 实现:给图片加文字水印,图片水印,压缩图片

演示环境:
1、windows10
2、phpstudy
3、php7.4

一、案例演示:

在这里插入图片描述
在这里插入图片描述

二、素材准备

1、准备一张原始图片
2、准备一张水印图片(透明底图的最好)
3、字体库(windows系统自带的字体库,路径在:C:\Windows\Fonts)
4、开启GD库
在这里插入图片描述
在这里插入图片描述

三、图片添加水印

1、文字水印封装类 FontWatermark.class.php

<?php

class FontWatermark
{
    private $sourceImagePath;
    private $fontPath;
    private $fontSize;
    private $watermarkText;
    private $outputImagePath;

    public function __construct($sourceImagePath, $fontPath, $fontSize, $watermarkText, $outputImagePath)
    {
        $this->sourceImagePath = $sourceImagePath;
        $this->fontPath = realpath($fontPath);  // 获取字体文件的绝对路径
        $this->fontSize = $fontSize;
        $this->watermarkText = $watermarkText;
        $this->outputImagePath = $outputImagePath;
    }

    public function addFontWatermark()
    {
        // 加载源图片
        $sourceImage = imagecreatefromjpeg($this->sourceImagePath);
        if (!$sourceImage) {
            die('无法加载源图片');
        }

        // 获取源图片的宽高
        $sourceWidth = imagesx($sourceImage);
        $sourceHeight = imagesy($sourceImage);

        // 确保字体文件存在
        if (!file_exists($this->fontPath)) {
            die('字体文件不存在: ' . $this->fontPath);
        }

        // 设置文字颜色 (白色)
        $white = imagecolorallocate($sourceImage, 255, 255, 255);

        // 设置文字阴影颜色 (黑色)
        $black = imagecolorallocate($sourceImage, 0, 0, 0);

        // 计算文字水印的边界框
        $textBox = imagettfbbox($this->fontSize, 0, $this->fontPath, $this->watermarkText);
        if ($textBox === false) {
            die('无法计算文字边界框');
        }
        $textWidth = $textBox[2] - $textBox[0];
        $textHeight = $textBox[1] - $textBox[7];

        // 设置文字水印的位置 (左上角)
        $destX = 10;
        $destY = $textHeight + 10;

        // 绘制阴影文字
        if (imagettftext($sourceImage, $this->fontSize, 0, $destX + 2, $destY + 2, $black, $this->fontPath, $this->watermarkText) === false) {
            die('无法绘制阴影文字');
        }

        // 绘制水印文字
        if (imagettftext($sourceImage, $this->fontSize, 0, $destX, $destY, $white, $this->fontPath, $this->watermarkText) === false) {
            die('无法绘制水印文字');
        }

        // 保存加水印后的图片
        if (!imagejpeg($sourceImage, $this->outputImagePath)) {
            die('无法保存加水印后的图片');
        }

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

        echo "图片水印已添加并保存到: " . $this->outputImagePath;
        echo "<br>";
        echo "<img src='" . $this->outputImagePath . "' alt='文字水印' width='400px;' height='300px;'>";
    }
}
?>

2、调用文字水印类

<?php
require "FontWatermark.class.php";
// 使用示例
$watermark = new FontWatermark(
    '1111.jpg',                // 源图片路径
    'msyh.ttc', // 字体路径
    80,                        // 字体大小
    '测试水印',                 // 水印文字
    'font_watermark.jpg' // 输出图片路径
);

$watermark->addFontWatermark();

?>

四、图片添加图片水印

1、图片水印封装类 WatermarkImage.class.php

<?php
class WatermarkImage
{
    private $sourceImagePath;
    private $watermarkImagePath;
    private $outputImagePath;
    private $sourceImage;
    private $watermarkImage;

    public function __construct($sourceImagePath, $watermarkImagePath, $outputImagePath)
    {
        $this->sourceImagePath = $sourceImagePath;
        $this->watermarkImagePath = $watermarkImagePath;
        $this->outputImagePath = $outputImagePath;
    }

    private function loadImages()
    {
        // 加载源图片
        $this->sourceImage = @imagecreatefromjpeg($this->sourceImagePath);
        if (!$this->sourceImage) {
            die('无法加载源图片: ' . $this->sourceImagePath);
        }

        // 加载水印图片
        $this->watermarkImage = @imagecreatefrompng($this->watermarkImagePath);
        if (!$this->watermarkImage) {
            imagedestroy($this->sourceImage);
            die('无法加载水印图片: ' . $this->watermarkImagePath);
        }
    }

    private function addWatermark()
    {
        // 获取源图片和水印图片的宽高
        $sourceWidth = imagesx($this->sourceImage);
        $sourceHeight = imagesy($this->sourceImage);
        $watermarkWidth = imagesx($this->watermarkImage);
        $watermarkHeight = imagesy($this->watermarkImage);

        // 计算水印位置(右下角)
        $destX = $sourceWidth - $watermarkWidth - 10; // 右边距10像素
        $destY = $sourceHeight - $watermarkHeight - 10; // 底边距10像素

        // 将水印图片合并到源图片上
        imagecopy($this->sourceImage, $this->watermarkImage, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight);
    }

    private function saveImage()
    {
        // 保存加水印后的图片
        if (!imagejpeg($this->sourceImage, $this->outputImagePath)) {
            imagedestroy($this->sourceImage);
            imagedestroy($this->watermarkImage);
            die('无法保存加水印后的图片: ' . $this->outputImagePath);
        }
    }

    private function cleanup()
    {
        // 释放内存
        imagedestroy($this->sourceImage);
        imagedestroy($this->watermarkImage);
    }

    public function applyWatermark()
    {
        $this->loadImages();
        $this->addWatermark();
        $this->saveImage();
        $this->cleanup();

        echo "图片水印已添加并保存到: " . $this->outputImagePath;
        echo "<br>";
        echo "<img src='" . $this->outputImagePath . "' alt='图片水印' width='400px;' height='300px;'>";
    }
}

?>

2、调用图片水印类

<?php
require "WatermarkImage.class.php";
// 使用示例
$sourceImagePath = '1111.jpg';
$watermarkImagePath = 'shuiyin.png';
$outputImagePath = 'image_watermark.jpg';

$watermarker = new WatermarkImage($sourceImagePath, $watermarkImagePath, $outputImagePath);
$watermarker->applyWatermark();

?>

五、压缩图片

1、缩略图封装类 ImageResizer

<?php

class ImageResizer
{
    private $sourceImage;
    private $sourceWidth;
    private $sourceHeight;

    public function __construct($sourceImagePath)
    {
        $this->loadImage($sourceImagePath);
    }

    private function loadImage($path)
    {
        if (!file_exists($path)) {
            throw new Exception("File does not exist: $path");
        }

        $this->sourceImage = imagecreatefromjpeg($path);

        if (!$this->sourceImage) {
            throw new Exception("Failed to load image: $path");
        }

        $this->sourceWidth = imagesx($this->sourceImage);
        $this->sourceHeight = imagesy($this->sourceImage);
    }

    public function resize($width, $height, $outputPath)
    {
        $thumb = imagecreatetruecolor($width, $height);

        imagecopyresampled(
            $thumb,
            $this->sourceImage,
            0,
            0,
            0,
            0,
            $width,
            $height,
            $this->sourceWidth,
            $this->sourceHeight
        );

        if (!imagejpeg($thumb, $outputPath)) {
            throw new Exception("Failed to save thumbnail to: $outputPath");
        }

        imagedestroy($thumb);
    }

    public function __destruct()
    {
        imagedestroy($this->sourceImage);
    }
}

?>

2、调用缩略图类

<?php
require "Resizer.class.php";

// 使用示例
try {
    $sourceImagePath = 'E:\test\Resizer\222.jpg';
    // $outputImagePath = 'E:\test\Resizer\222_resier.jpg';
    $outputImagePath = '222_resier.jpg';
    $width = 200;
    $height = 200;

    $resizer = new ImageResizer($sourceImagePath);
    $resizer->resize($width, $height, $outputImagePath);

    echo "缩略图创建在网站目录下,图片名称: $outputImagePath";
    echo "<br>";
    echo "<img src='$outputImagePath' alt='缩略图'>";
} catch (Exception $e) {
    echo "错误: " . $e->getMessage();
}
?>

说明:更多复杂的水印功能可以基于此脚本扩展

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员潘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值