PHP生成二维码中间加头像小图标的方法

PS: 这种方式生成二维码速度会很慢, 建议前端生成: 二维码生成器

参考: PHP生成二维码中间加头像小图标的方法


/**
 * 生成带头像二维码
 * @param string $qrcode 二维码URL
 * @param string $headImg 头像URL
 * @return string
 * @see https://lzw.me/a/php-qrcode-ico.html
 */
function generateQrcodeWithHeadImg(string $qrcode, string $headImg)
{
    $image = imagecreatefromjpeg($qrcode);  // 图像资源:二维码
    $logo = imagecreatefromjpeg($headImg);  // 图像资源:头像
    if (!$image || !$logo) {
        throw new CustomException('读取图像资源失败');
    }
    // 图片宽高:二维码
    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);
    // 图片宽高:头像
    $logoWidth = imagesx($logo);
    $logoHeight = imagesy($logo);
    // 添加到二维码中的头像宽高
    $logoImageWidth = $imageWidth / BIZ_NUM_5;
    $logoImageHeight = $logoHeight * $logoImageWidth / $logoWidth;
    // 头像在二维码中的偏移位置
    $fromWidth = ($imageWidth - $logoImageWidth) / BIZ_NUM_2;
    $fromHeight = ($imageHeight - $logoImageHeight) / BIZ_NUM_2;
    // 把头像拷贝到二维码中
    $copyResult = imagecopyresampled($image, $logo, $fromWidth, $fromHeight, BIZ_NUM_0, BIZ_NUM_0, $logoImageWidth, $logoImageHeight, $logoWidth, $logoHeight);
    if (!$copyResult) {
        throw new CustomException('重采样拷贝图像失败');
    }
    // 将生成的带头像的二维码保存的本地
    $tmpPath = 'tmp/' . Str::random(BIZ_NUM_24) . '.jpg';
    $saveResult = imagejpeg($image, Storage::path($tmpPath), BIZ_NUM_100);
    if (!$saveResult) {
        throw new CustomException('保存图像失败');
    }
    // 销毁图像资源
    imagedestroy($image);
    imagedestroy($logo);
    return $tmpPath;
}