(自写程序)文章无缩略图自动生成标题缩略图

 2024-08-16  阅读 12541  评论 0  点赞 1123

摘要:懒人必备,要实现这个功能,我们可以使用PHP中的GD库来处理图像。以下是详细步骤以及PHP代码示例。此代码会从一个文件夹中随机选择一张图片,然后合成两段带有黑色半透明背景的文字,并生成一个新图像。

懒人必备,要实现这个功能,我们可以使用PHP中的GD库来处理图像。以下是详细步骤以及PHP代码示例。此代码会从一个文件夹中随机选择一张图片,然后合成两段带有黑色半透明背景的文字,并生成一个新图像。

步骤解析:

  1. 随机获取图片:首先,从指定的文件夹中随机选择一张图片,图片的尺寸固定为800x500。
  2. 合成标题和文章内容:使用GD库在图片上添加两段文字,每段文字都放在一个带有黑色半透明背景的框中。
    • 标题:放在图片顶部,距离图片边缘50像素,有黑色半透明背景。
    • 内容描述:放在图片底部,距离图片边缘50像素,也有黑色半透明背景。
    • 文字自动换行:计算文字宽度,超过指定宽度时自动换行。
    • 内容截断:如果内容太长,会自动截断并加上“...”。

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 "图像合成成功!";
?>

成品效果:

代码说明:

  1. 随机选择图片:使用glob()函数从文件夹中获取所有图片文件,然后使用array_rand()随机选择一张图片。
  2. 标题和描述文字处理
    • 通过imagettfbbox()函数来计算文字所需的区域,并根据最大宽度限制文字换行。
    • 如果内容文字超过了指定行数,会自动截断并加上“...”。
  3. 文字与黑色半透明背景的绘制
    • 使用imagefilledrectangle()函数来绘制黑色半透明背景。
    • 通过imagettftext()函数将标题和内容绘制到图片上。
  4. 输出与保存图像:将合成后的图像保存为output.jpg,并可以直接输出显示。

总结:

该代码可以在图像上随机生成标题和内容文本,确保文字在黑色半透明背景上清晰可见,并且支持自动换行和文字截断功能。你可以根据需要调整文字大小、字体、背景透明度等参数,以适应不同的设计需求。

标签:php

发表评论:

管理员

承接各种程序开发,外贸网站代运营,外贸网站建设等项目
  • 内容185
  • 积分66666
  • 金币66666

Copyright © 2024 LS'Blog-保定PHP程序员老宋个人博客 Inc. 保留所有权利。 Powered by LS'blog 3.0.3

页面耗时0.0259秒, 内存占用1.94 MB, 访问数据库28次

冀ICP备19034377号