网站首页 文章专栏 将一张图片水印到另一张图片
利用composer组件 intervention/image 能很轻易的实现(laravle中已经集成) 官网 http://image.intervention.io/use/basics
composer require intervention/image
use Intervention\Image\ImageManagerStatic as Image; $image = '原图地址'; $water_image = '水印图地址'; $water_image = Image::make($water_image)->opacity(50)->widen(200);//水印图片转成透明度50,宽200 $new_image = '生成的新的图片地址'; $img = Image::make($image); $img->insert($water_image, 'bottom-right', 100, 1100);//从右下方开始定位 $img->save($new_image);
上面这个组件确实功能很强大,能把图片的各种操作极大的简化,但是经使用发现,当对图片设置透明度的时候,经常把服务器CPU跑满,本来一秒不到的时间,就因为一个透明属性愣是多运行了5秒以上,感觉这是它的一个bug,期待该组件后面可以优化。
为了能快速的试下图片水印功能,回归到PHP源生,用PHP内置的GD库自行组装处理 官网 https://www.php.net/manual/zh/book.image.php
/** * @param $imgSrc //待处理原图地址 * @param $water_image //水印图地址 * @param $watermark_file //生成的新的图片地址 * @author: hbh * @Time: 2020/6/18 16:41 */ public static function warterImage($imgSrc, $water_image, $watermark_file) { $srcInfo = @getimagesize($imgSrc); $srcImg_w = $srcInfo[0]; $srcImg_h = $srcInfo[1]; switch ($srcInfo[2]) { case 1: $srcim = imagecreatefromgif($imgSrc); break; case 2: $srcim = imagecreatefromjpeg($imgSrc); break; case 3: $srcim = imagecreatefrompng($imgSrc); break; default: die("不支持的图片文件类型"); exit; } /*合成水印路径为空就覆盖原图*/ if (empty($watermark_file)) { $watermark_file = $imgSrc; } if (!file_exists($water_image) || empty($water_image)) { return; } $water_imageInfo = @getimagesize($water_image); $water_image_w = $water_imageInfo[0]; $water_image_h = $water_imageInfo[1]; if ($srcImg_w < $water_image_w || $srcImg_h < $water_image_h) { return; } switch ($water_imageInfo[2]) { case 1: $markim = imagecreatefromgif($water_image); break; case 2: $markim = imagecreatefromjpeg($water_image); break; case 3: $markim = imagecreatefrompng($water_image); break; default: die("不支持的水印图片文件类型"); exit; } $logow = $water_image_w; $logoh = $water_image_h; //定位到中间位置 $x = ($srcImg_w - $logow) / 2; $y = ($srcImg_h - $logoh) / 2; $dst_img = @imagecreatetruecolor($srcImg_w, $srcImg_h); //imagecopymerge PHP 内置图像方法 详见 https://www.php.net/manual/zh/function.imagecopymerge.php imagecopymerge($dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h, 100); imagecopymerge($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh, 50); imagedestroy($markim); switch ($srcInfo[2]) { case 1: imagegif($dst_img, $watermark_file); break; case 2: imagejpeg($dst_img, $watermark_file); break; case 3: imagepng($dst_img, $watermark_file); break; default: die("不支持的水印图片文件类型"); exit; } imagedestroy($dst_img); imagedestroy($srcim); }
转载请注明出处