这段时间因工作需要,学习了下用PHP来给背景图上添加公司logo,宣传语之类的图片合并功能。话不多说,直接上代码。

<?php

public function getImage()
{
$data_set = array(
"text" => "这是测试文字"
); // 项目根目录
$path = __DIR__."/路径/"; // 背景图
$tem_bg = __DIR__."/项目存放背景图得路径/背景图.jpg"; // 最终合成图片得路径和名字
$final_path = "/img/.../...之类得路径/用户ID-bg.jpg"; $bg = $path.$final_path;
copy($tem_bg, $bg); // 复制图片
list($bgWidth, $bgHeight) = getimagesize($bg); // 获取图片宽高 // 字体文件路径
$path_src = __DIR__."/字体文件路径"; // 如果是需要生成文字图片,则调用下面方法,生成文字图片,再合成
$text_image = $this->text_image_png($path, $path_src, $data_set); // 获取文字图片得宽高
list($textWidth, $textHeight) = getimagesize($text_image); // 将背景图和文字图合成
$this->synthetic($bg, 'jpg', $bgWidth, $bgHeight, $text_image, $textHeight, $textWidth, "bottom-center", 0, 210);
unlink($text_image); // 删除临时合成得文字图片 // 如果不需要生成文字图片,直接使用现有的图片,则执行下面的,这2种方式可共存
$image = __DIR__."/图片路径/xxx.png";
list($logoWidth, $logoHeight) = getimagesize($image);
// 将背景图和文字图合成
$this->synthetic($bg, 'jpg', $bgWidth, $bgHeight, $image, $logoHeight, $logoWidth, "bottom-center", 0, 210, 0, 10); // 如果需要合成多个图片,那就执行多次$this->synthetic()方法 return array("width" => $bgWidth, "height" => $bgHeight, "path" => $bg_name); // path就是合成后图片的路径
} /**
* 生成文字图片
* @param $path 项目根目录
* @param $font_path 字体文件路径
* @param $data_set 需要生成文字图片的文字
* @return string
*/
public function text_image_png($path, $font_path, $data_set)
{
$bgwidth = 640; // 文字图片的宽
$bgheight = 500; // 文字图片的高
$block = imagecreatetruecolor($bgwidth, $bgheight);//建立一个画板
$bg = imagecolorallocatealpha($block , 255 , 255 , 255 , 127);// 拾取一个完全透明的颜色,不要用imagecolorallocate拾色
$color = imagecolorallocate($block,137,54,20); //字体拾色
imagealphablending($block , false);//关闭混合模式,以便透明颜色能覆盖原画板
imagefill($block , 0 , 0 , $bg);//填充
$font_file = $font_path.'/fonts/simhei.ttf'; // 字体文件 $color = imagecolorallocate($block,255,228,116); //字体拾色 // 文字
$text = $data_set["text"];
imagettftext($block,50,0,260,150,$color,$font_file,$text); // 向图像写入文本 imagesavealpha($block , true);//设置保存png时保留透明通道信息
$image_path = $path."/临时文件路径/text.png";
imagepng($block, $image_path);//生成图片
imagedestroy($block); // 销毁画板 return $image_path;
} /**
* 合并图片
*
* @param $image // 背景图
* @param $mimeType // 合成后的图片类型
* @param $imgWidth // 背景的宽
* @param $imgHeight // 背景的高
* @param $watermark // 需要合成的图
* @param $watermarkHeight // 需要合成的高
* @param $watermarkWidth // 需要合成的宽
* @param string $position // 居中类型
* @param int $mt // 设置margin-top值
* @param int $mb // 设置margin-bottom值
* @param int $ml // 设置margin-left值
* @param int $mr // 设置margin-right值
* @param string $watermakMimeType // 合成后图片的类型
* @throws \Exception
*/
public function synthetic($image, $mimeType, $imgWidth, $imgHeight, $watermark, $watermarkHeight, $watermarkWidth, $position = "center", $mt = 0, $mb = 0, $ml = 0, $mr = 0, $watermakMimeType = "png")
{
// Calculate the watermark position
switch ($position) {
case "center":
$marginBottom = round($imgHeight / 2);
$marginRight = round($imgWidth / 2) - round($watermarkWidth / 2);
break; case "top-left":
$marginBottom = round($imgHeight - $watermarkHeight);
$marginRight = round($imgWidth - $watermarkWidth);
break; case "bottom-left":
$marginBottom = 5;
$marginRight = round($imgWidth - $watermarkWidth);
break; case "top-right":
$marginBottom = round($imgHeight - $watermarkHeight);
$marginRight = 5;
break; case "bottom-center":
$marginBottom = $mb;
$marginRight = round($imgWidth / 2) - round($watermarkWidth / 2) + $mr;
break; default:
$marginBottom = 2;
$marginRight = 2;
break;
} if($watermakMimeType == "png") {
$watermark = imagecreatefrompng($watermark); // 生成png图片
} else {
$watermark = imagecreatefromjpeg($watermark); // 生成jpg图片
} switch ($mimeType) {
case "jpeg":
case "jpg":
$createImage = imagecreatefromjpeg($image);
break; case "png":
$createImage = imagecreatefrompng($image);
break; case "gif":
$createImage = imagecreatefromgif($image);
break; default:
$createImage = imagecreatefromjpeg($image);
break;
} $sx = imagesx($watermark);
$sy = imagesy($watermark);
imagecopy(
$createImage,
$watermark,
imagesx($createImage) - $sx - $marginRight,
imagesy($createImage) - $sy - $marginBottom,
0,
0,
imagesx($watermark),
imagesy($watermark)
); // 拷贝图像的一部分 switch ($mimeType) {
case "jpeg":
case "jpg":
imagejpeg($createImage, $image); // 以 jpeg 格式将图像输出到浏览器或文件
break; case "png":
imagepng($createImage, $image); // 以 PNG 格式将图像输出到浏览器或文件
break; case "gif":
imagegif($createImage, $image); // 以 gif 格式将图像输出到浏览器或文件
break; default:
throw new \Exception("A watermark can only be applied to: jpeg, jpg, gif, png images ");
break;
}
}

以上就是将多个图片合成一张图片的过程。

PHP 生成水印图片的更多相关文章

  1. PHP生成随机水印图片

    基于PHP的GD图形库,自己生成一张图片.仅限初识GD库,实例学习. 一.需求 网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介.因为课程的数量较大没有为所 ...

  2. C#(.net)水印图片的生成

    /* * *    使用说明: * 建议先定义一个WaterImage实例 * 然后利用实例的属性,去匹配需要进行操作的参数 * 然后定义一个WaterImageManage实例 * 利用WaterI ...

  3. PHP 上传图片,生成水印,支持文字, gif, png

    //admin_upfile.php <html> <meta http-equiv="Content-Type" content="text/html ...

  4. 前端水印图片及文字js教程

    前端水印图片文字教程如下,复制代码修改图片地址即可看到效果,工作中遇到总结的,喜欢就关注下哦: <!DOCTYPE html><html> <head> <m ...

  5. PHP验证码生成及图片处理(GD库)

    GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印. 本章实现了生成图片并绘画各种形状.图片的压缩.中文字符水印及图片水印 ...

  6. php生成文字图片效果

    php生成文字图片效果最近看到php的GD功能,试着做了一个基本生成文字图片效果的代码: 显示文字图片页面:demo.php<?php$str = $_REQUEST['str'] ? $_RE ...

  7. [转载]java操作word生成水印

    应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...

  8. [原创]java操作word生成水印

    应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...

  9. php课程 8-28 php如何绘制生成显示图片

    php课程 8-28 php如何绘制生成显示图片 一.总结 一句话总结:gd库轻松解决 1.php图片操作生成的图的两种去向是什么? 一种在页面直接输出,一种存进本地磁盘 2.php操作图片的库有哪些 ...

随机推荐

  1. sonar安装

    ##jdk不要用yum下载的 一.下载sonar源码 cd /usr/local/src wget https://sonarsource.bintray.com/Distribution/sonar ...

  2. 关于WPF中Popup中的一些用法的总结

    Popup控件是一个常用的非常有用的控件,顾明思义就是弹出式控件,首先我们来看看MSDN对它的解释吧,表示具有内容的弹出窗口,这个是非常重要的控件,我们看看它的继承关系吧: System.Object ...

  3. webpack模塊打包機

    https://blog.csdn.net/qq_38277366/article/details/82907894

  4. 魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...

  5. 简单介绍一下在CentOS上安装Docker。

    简单介绍一下在CentOS上安装Docker. 前置条件: 64-bit 系统 kernel 3.10+ 1.检查内核版本,返回的值大于3.10即可. $ uname -r 2.使用 sudo 或 r ...

  6. windows开关机事件

    开关机事件.xml <ViewerConfig> <QueryConfig> <QueryParams> <Simple> <BySource&g ...

  7. linux-内核参数优化参考指标

    民间最全的Linux系统内核参数调优说   相信做运维的同仁,进行运维环境初建时,必须要考虑到操作系统内核参数的优化问题,本人经历数次的运维环境重建后,决定要自行收集一份比较完善的系统内核参数优化说明 ...

  8. P1508 Likecloud-吃、吃、吃

    数字金字塔3条路 f[i][j]=max(max(f[i-1][j],f[i-1][j-1]),f[i-1][j+1])+a[i][j]; #include<bits/stdc++.h> ...

  9. Django+Vue打造购物网站(三)

    商品列表页 通过商品列表页面来学习drf django的view实现商品列表页 在goods目录下新建一个views_base.py文件,用来区分drf的view和Dajngo自带的view的区别 利 ...

  10. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...