代码整理-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;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值