代码整理-PHP合并图片
说明
- PHP将两张图片合并为一张,比如一键生成海报图(将二维码合并到海报图上)
操作
核心代码
/** * 合并图片 * * @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; }