PHP实现九宫格图片水印功能
程序员文章站
2022-05-12 23:06:06
...
WEB开发当中,有时候需要为上传图片添加水印,这样可以有效的保护图片被别人盗用,那么怎么快速为图片添加水印呢?今天,我们就以PHP代码的方式来实现为图片添加水印的效果!
水印功能类:water.php
代码没有多少复杂的逻辑,主要传入的几个参数见注释,除了需要传入的原始图片和水印图片外,最终合成的图片可以自定义存储路径和名称,如果没有指定保存路径的话,默认以覆盖原始图片的方式进行保存!
<?php
class Water
{
//导出合成水印的图片
/*
* @prama string $image 原始图片
* @prama string $waterImage 水印图片
* @prama string $fileName 保存合成水印图片的名称
* @prama int $pos 水印在原始图片中的位置(九宫格)
*
* */
//入口方法
public function make(string $image, string $waterImage, string $fileName = null, int $pos = 3)
{
$this->checkImage($image);
$res = $this->resource($image);
$this->checkImage($waterImage);
$water = $this->resource($waterImage);
$position = $this->position($res, $water, $pos);
imagecopy($res, $water, $position['x'], $position['y'], 0, 0, imagesx($water), imagesy($water));
return $this->showAction($image)($res, $fileName ?? $image);
}
//图片校验
protected function checkImage(string $image)
{
if (!is_file($image) || getimagesize($image) === false) {
throw new Exception("File is not image");
}
}
//根据图片获取资源
protected function resource(string $image)
{
$info = getimagesize($image);
$functions = [1 => 'imagecreatefromgif', 2 => 'imagecreatefromjpeg', 3 => 'imagecreatefrompng'];
$call = $functions[$info[2]];
return $call($image);
}
//渲染图片
protected function showAction(string $image)
{
$info = getimagesize($image);
$functions = [1 => 'imagegif', 2 => 'imagejpeg', 3 => 'imagepng'];
return $functions[$info[2]];
}
//水印位置
protected function position($res, $water, int $pos)
{
$info = ['x' => 20, 'y' => 20];
switch ($pos) {
case 1:
$info['x'] = (imagesx($res) / 3 - imagesx($water)) / 2;
$info['y'] = (imagesy($res) / 3 - imagesy($water)) / 2;
break;
case 2:
$info['x'] = (imagesx($res) - imagesx($water)) / 2;
$info['y'] = (imagesy($res) / 3 - imagesy($water)) / 2;
break;
case 3:
$info['x'] = (imagesx($res) / 3 * 5 - imagesx($water)) / 2;
$info['y'] = (imagesy($res) / 3 - imagesy($water)) / 2;
break;
case 4:
$info['x'] = (imagesx($res) / 3 - imagesx($water)) / 2;
$info['y'] = (imagesy($res) - imagesy($water)) / 2;
break;
case 5:
$info['x'] = (imagesx($res) - imagesx($water)) / 2;
$info['y'] = (imagesy($res) - imagesy($water)) / 2;
break;
case 6:
$info['x'] = (imagesx($res) / 3 * 5 - imagesx($water)) / 2;
$info['y'] = (imagesy($res) - imagesy($water)) / 2;
break;
case 7:
$info['x'] = (imagesx($res) / 3 - imagesx($water)) / 2;
$info['y'] = (imagesy($res) / 3 * 5 - imagesy($water)) / 2;
break;
case 8:
$info['x'] = (imagesx($res) - imagesx($water)) / 2;
$info['y'] = (imagesy($res) / 3 * 5 - imagesy($water)) / 2;
break;
case 9:
$info['x'] = (imagesx($res) / 3 * 5 - imagesx($water)) / 2;
$info['y'] = (imagesy($res) / 3 * 5 - imagesy($water)) / 2;
break;
default:
}
return $info;
}
}
调用:index.php
实例化Water类,通过类对象调用make方法的时候需要传入原始图片、水印图片、合成水印图片的存储名称以及水印的位置(九宫格,默认值为3,即水印在原始图片的右上角)
<?php
include "water.php";
try {
$water = new Water();
$water->make('img/003.jpg','img/logo.png',"img/003.jpg",3);
}catch (Exception $e){
echo $e->getMessage();
}
OK!完成!说不定以后会用到,速度收藏吧!
上一篇: git如何修改远程分支名称