<?php
require 'vendor/autoload.php';
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeEnlarge;
// 高清画布设置(放大2倍后缩小)
$scale = 2; // 先放大处理最后缩小输出
$width = 750 * $scale;
$height = 1334 * $scale;
// 1. 创建高清画布(真彩色+抗锯齿)
$poster = imagecreatetruecolor($width, $height);
imageantialias($poster, true); // 启用抗锯齿
$white = imagecolorallocatealpha($poster, 255, 255, 255, 0);
imagefill($poster, 0, 0, $white);
// 2. 高质量背景图处理
$bg = imagecreatefromjpeg('background.jpg');
// 使用高质量缩放算法
imagecopyresampled($poster, $bg,
0, 0, 0, 0,
$width, $height,
imagesx($bg), imagesy($bg));
// 3. 优化圆形头像(带抗锯齿)
function create_avatar($path, $size) {
$src = imagecreatefromstring(file_get_contents($path));
$src_width = imagesx($src);
$src_height = imagesy($src);
// 创建透明画布
$avatar = imagecreatetruecolor($size, $size);
imageantialias($avatar, true);
imagesavealpha($avatar, true);
$transparent = imagecolorallocatealpha($avatar, 0, 0, 0, 127);
imagefill($avatar, 0, 0, $transparent);
// 创建圆形蒙版
$mask = imagecreatetruecolor($size, $size);
imageantialias($mask, true);
$black = imagecolorallocate($mask, 0, 0, 0);
$white = imagecolorallocate($mask, 255, 255, 255);
imagefill($mask, 0, 0, $black);
imagefilledellipse($mask, $size/2, $size/2, $size, $size, $white);
// 高质量缩放+圆形裁剪
imagecopyresampled($avatar, $src, 0, 0, 0, 0, $size, $size, $src_width, $src_height);
imagecopy($avatar, $mask, 0, 0, 0, 0, $size, $size);
imagedestroy($mask);
// 添加抗锯齿边缘
imagefilter($avatar, IMG_FILTER_SMOOTH, 7);
return $avatar;
}
$avatar = create_avatar('avatar.jpg', 150 * $scale);
imagecopy($poster, $avatar, 50 * $scale, 50 * $scale, 0, 0, 150 * $scale, 150 * $scale);
// 4. 优化文字渲染
function add_text($image, $text, $fontSize, $x, $y, $color, $maxWidth, $fontFile, $scale=1) {
$fontSize *= $scale;
$x *= $scale;
$y *= $scale;
$maxWidth *= $scale;
// 使用更精确的换行计算
$lines = [];
$currentLine = '';
$words = preg_split('/(?<!^)(?!$)/u', $text); // 按字符分割
foreach ($words as $word) {
$testLine = $currentLine . $word;
$box = imagettfbbox($fontSize, 0, $fontFile, $testLine);
$textWidth = $box[2] - $box[0];
if ($textWidth <= $maxWidth) {
$currentLine = $testLine;
} else {
$lines[] = $currentLine;
$currentLine = $word;
}
}
$lines[] = $currentLine;
// 带阴影的文字渲染
foreach ($lines as $key => $line) {
$textY = $y + ($key * ($fontSize * 1.2));
$shadowColor = imagecolorallocatealpha($image, 0, 0, 0, 50);
imagettftext($image, $fontSize, 0, $x+2, $textY+2, $shadowColor, $fontFile, $line);
imagettftext($image, $fontSize, 0, $x, $textY, $color, $fontFile, $line);
}
}
$fontColor = imagecolorallocate($poster, 51, 51, 51);
add_text($poster, "欢迎参加PHP开发者大会\n2024年度技术峰会", 28, 50, 250, $fontColor, 600, 'msyh.ttf', $scale);
// 5. 高清二维码生成
$qrCode = new QrCode('https://example.com/invite');
$qrCode->setRoundBlockSizeMode(new RoundBlockSizeModeEnlarge());
$qrCode->setSize(800); // 提高基础尺寸
$qrCode->setMargin(20);
$writer = new PngWriter();
$qrResult = $writer->write($qrCode);
// 使用GD库直接处理代替临时文件
$qrImage = imagecreatefromstring($qrResult->getString());
$qr_width = imagesx($qrImage);
$qr_height = imagesy($qrImage);
// 高质量缩放
imagecopyresampled(
$poster,
$qrImage,
500 * $scale, 1000 * $scale,
0, 0,
200 * $scale, 200 * $scale,
主要优化点说明:
高清画布处理
使用2倍尺寸画布进行绘制,最后缩小输出
启用imageantialias()
全局抗锯齿
使用imagecreatetruecolor()
代替普通画布
图像缩放优化
将imagecopyresized
替换为imagecopyresampled
对头像和二维码使用高质量缩放算法
圆形头像优化
使用透明通道代替蒙版合并
添加imagefilter(IMG_FILTER_SMOOTH)
优化边缘抗锯齿处理
文字渲染优化
增加文字阴影提升清晰度
改进换行算法使用字符级分割
支持高清缩放字体渲染
二维码增强
设置更大的基础尺寸(800px)
使用RoundBlockSizeModeEnlarge
模式
增加边距(margin)设置
输出优化
最终使用imagecopyresampled
缩小输出
设置imagepng()
质量为9(最高)
移除临时文件依赖