懒人必备,要实现这个功能,我们可以使用PHP中的GD库
来处理图像。以下是详细步骤以及PHP代码示例。此代码会从一个文件夹中随机选择一张图片,然后合成两段带有黑色半透明背景的文字,并生成一个新图像。
<?php
// 设置图片文件夹路径
$imageFolder = './images'; // 替换为你的图片文件夹路径
// 随机获取图片
$images = glob($imageFolder . "/*.jpg"); // 假设图片格式为JPG
$randomImage = $images[array_rand($images)];
// 标题和描述
$title = "这是一个标题"; // 第一段文字,标题
$content = "这是文章的内容。这段内容可能会很长,如果超过一定长度会自动换行并且加上..."; // 第二段文字,描述
// 创建图像资源
$im = imagecreatefromjpeg($randomImage);
// 图片尺寸
$imageWidth = 800;
$imageHeight = 500;
// 文字颜色、字体和背景颜色设置
$white = imagecolorallocate($im, 255, 255, 255);
$blackTransparent = imagecolorallocatealpha($im, 0, 0, 0, 75); // 黑色半透明
$font = './fonts/simhei.ttf'; // 替换为你的字体路径
$fontSizeTitle = 20; // 标题字体大小
$fontSizeContent = 16; // 内容字体大小
// 计算标题文字的位置
$titleBoxWidth = $imageWidth - 100;
$contentBoxWidth = $imageWidth - 100;
$titleMaxWidth = $titleBoxWidth - 100;
// 计算标题背景区域的高度
$titleBoundingBox = imagettfbbox($fontSizeTitle, 0, $font, $title);
$titleHeight = abs($titleBoundingBox[1] - $titleBoundingBox[7]);
// 计算描述内容区域的高度(预设多行文字)
$contentBoundingBox = imagettfbbox($fontSizeContent, 0, $font, $content);
$contentHeight = abs($contentBoundingBox[1] - $contentBoundingBox[7]);
// 自动换行处理函数
function wordWrapText($text, $maxWidth, $fontSize, $font) {
$wrappedText = '';
$words = explode(' ', $text);
$line = '';
foreach ($words as $word) {
$testLine = $line . ' ' . $word;
$testBox = imagettfbbox($fontSize, 0, $font, $testLine);
$testWidth = $testBox[2] - $testBox[0];
if ($testWidth > $maxWidth && !empty($line)) {
$wrappedText .= trim($line) . "\n";
$line = $word;
} else {
$line = $testLine;
}
}
$wrappedText .= trim($line);
return $wrappedText;
}
// 处理标题自动换行
$titleWrapped = wordWrapText($title, $titleMaxWidth, $fontSizeTitle, $font);
// 处理内容自动换行和截断
$contentWrapped = wordWrapText($content, $contentBoxWidth - 100, $fontSizeContent, $font);
if (substr_count($contentWrapped, "\n") > 3) {
$contentWrapped = explode("\n", $contentWrapped);
$contentWrapped = implode("\n", array_slice($contentWrapped, 0, 3)) . '...';
}
// 绘制标题背景区域
$titleBoxHeight = 50 + $titleHeight;
imagefilledrectangle($im, 50, 50, $imageWidth - 50, 50 + $titleBoxHeight, $blackTransparent);
// 绘制内容背景区域
$contentBoxHeight = 50 + $contentHeight + 50;
imagefilledrectangle($im, 50, $imageHeight - 50 - $contentBoxHeight, $imageWidth - 50, $imageHeight - 50, $blackTransparent);
// 在图像上写入标题文字
$yOffsetTitle = 50 + 50;
imagettftext($im, $fontSizeTitle, 0, 100, $yOffsetTitle, $white, $font, $titleWrapped);
// 在图像上写入内容文字
$yOffsetContent = $imageHeight - 50 - $contentBoxHeight + 50;
imagettftext($im, $fontSizeContent, 0, 100, $yOffsetContent, $white, $font, $contentWrapped);
// 输出并保存图像
header('Content-Type: image/jpeg');
imagejpeg($im, 'output.jpg'); // 将图片保存为output.jpg
imagedestroy($im);
echo "图像合成成功!";
?>
glob()
函数从文件夹中获取所有图片文件,然后使用array_rand()
随机选择一张图片。imagettfbbox()
函数来计算文字所需的区域,并根据最大宽度限制文字换行。imagefilledrectangle()
函数来绘制黑色半透明背景。imagettftext()
函数将标题和内容绘制到图片上。output.jpg
,并可以直接输出显示。该代码可以在图像上随机生成标题和内容文本,确保文字在黑色半透明背景上清晰可见,并且支持自动换行和文字截断功能。你可以根据需要调整文字大小、字体、背景透明度等参数,以适应不同的设计需求。