核心代码/**
* 合并图片
*
* @param string $mainImgPath 底图
* @param string $coverImgPath 覆盖图
* @param string $text 文字
* @param string $outputFileName 输出文件名
* @param array $options 选项参数[[textColor][textOffset][textSize][coverSize][coverOffset]]
* @return string
*/
public static function mergePoster(string $mainImgPath, string $coverImgPath, string $text, string $outputFileName, array $options = [])
{
// 选项参数
$textColorRed = 255; // 文字GBB红色值
$textColorGreen = 255; // 文字GBB绿色值
$textColorBlue = 255; // 文字GBB蓝色值
$textOffsetX = 102; // 文字距离左上角向右偏移量(x轴)
$textOffsetY = 1060; // 文字距离左上角向下偏移量(y轴)
$textSize = 26; // 文字大小
$coverW = 200; // 遮盖图宽度
$coverH = 200; // 遮盖图高度
$coverOffsetX = 600; // 遮盖图右边距离主图右边缘偏移量(x轴)
$coverOffsetY = 175; // 遮盖图下边距离主图下边缘偏移量(y轴)
if (isset($options['textColor']) && $options['textColor'] != '') {
$textColorArr = explode(',', $options['textColor']);
$textColorRed = (int)($textColorArr[0] ?? $textColorRed);
$textColorGreen = (int)($textColorArr[1] ?? $textColorGreen);
$textColorBlue = (int)($textColorArr[2] ?? $textColorBlue);
}
if (isset($options['textOffset']) && $options['textOffset'] != '') {
$textOffsetArr = explode(',', $options['textOffset']);
$textOffsetX = (int)($textOffsetArr[0] ?? $textOffsetX);
$textOffsetY = (int)($textOffsetArr[1] ?? $textOffsetY);
}
if (isset($options['textSize']) && $options['textSize'] != 0) {
$textSize = (int)($options['textSize'] ?? $textSize);
}
if (isset($options['coverSize']) && $options['coverSize'] != '') {
$coverSizeArr = explode(',', $options['coverSize']);
$coverW = (int)($coverSizeArr[0] ?? $coverW);
$coverH = (int)($coverSizeArr[1] ?? $coverH);
}
if (isset($options['coverOffset']) && $options['coverOffset'] != '') {
$coverOffsetArr = explode(',', $options['coverOffset']);
$coverOffsetX = (int)($coverOffsetArr[0] ?? $coverOffsetX);
$coverOffsetY = (int)($coverOffsetArr[1] ?? $coverOffsetY);
}
// 字体文件
$fontFile = './font/YaHei.otf';
// 输出相对目录
$outputDir = './' . datetime(time(), 'Ymd') . '/';
// 输出绝对目录
$realOutputDir = '/path/to/' . $outputDir;
// 创建目录
if (!is_dir($realOutputDir)) {
mkdir($realOutputDir, 0755, true);
}
// 实例化图片
$mainImg = imagecreatefromjpeg($mainImgPath);
$coverImg = imagecreatefromjpeg($coverImgPath);
// 绘制底图
$mainW = imagesx(imagecreatefromjpeg($mainImgPath));
$mainH = imagesy(imagecreatefromjpeg($mainImgPath));
$mainCanvas = imagecreatetruecolor($mainW, $mainH);
imagecopy($mainCanvas, $mainImg, 0, 0, 0, 0, $mainW, $mainH);
$textcolor = imagecolorallocate($mainCanvas, $textColorRed, $textColorGreen, $textColorBlue); // 设置字体颜色
imagettftext($mainCanvas,
$textSize, // 字体大小px
0, // 角度
$textOffsetX, // 原点向右偏移量px
$textOffsetY, // 原点向下偏移量px
$textcolor, // 字体颜色
$fontFile, // 字体文件
$text // 文字内容
);
// 重置覆盖图宽高为指定的宽高
$srcCoverW = imagesx(imagecreatefromjpeg($coverImgPath));
$srcCoverH = imagesy(imagecreatefromjpeg($coverImgPath));
$coverCanvas = imagecreatetruecolor($coverW, $coverH);
imagecopyresampled($coverCanvas, $coverImg, 0, 0, 0, 0, $coverW, $coverH, $srcCoverW, $srcCoverH);
// 再将覆盖图绘制到底图
imagecopy($mainCanvas, $coverCanvas, $mainW - $coverW - $coverOffsetX, $mainH - $coverH - $coverOffsetY, 0, 0, $coverW, $coverH);
// 输出图片文件到指定目录下
imagejpeg($mainCanvas, $realOutputDir . $outputFileName, 80);
return $outputDir;
}