PHP使用GIFEncoder类生成动态滚动字幕

竹里
竹里
发布时间:2026-10-15 | 6人浏览过
原创

本文将详细演示如何利用PHP结合GIFEncoder类库,在不依赖外部服务器渲染的情况下,通过GD库逐帧生成图片,从而创建水平或垂直方向的动态滚动字幕GIF文件。

环境准备与基础逻辑

要实现动态滚动字幕,核心思路是利用GD库在内存中绘制每一帧的文字图片,然后使用GIFEncoder将这些静态帧合成为连续的GIF动画。这种方法灵活且无需额外的图像处理软件支持。

第1步:引入必要的库文件

首先,需要获取并引入 GIFEncoder.class.php 类库。同时,确保服务器环境开启了GD库扩展,并准备好用于显示文字的TTF字体文件(如 ziti.ttf)和背景图(如 hudongbg.gif)。

第2步:构建水平滚动字幕代码

水平滚动是指文字从右向左移动。我们需要一个循环来不断改变文字的X坐标,直到文字完全移出可视区域。以下是具体实现:

<?php
require_once("GIFEncoder.class.php");
$count = 0;
while (true) {
    // 获取传入的文字参数,默认值为“暂无输入”
    $str = $_REQUEST['str'] ? $_REQUEST['str"]:"暂无输入";
    
    // 计算文本宽度:每个字符按9像素估算
    $length = strlen($str) * 9;
    
    // 读取底图
    $im = imagecreatefromgif("hudongbg.gif");
    $white = ImageColorAllocate($im, 255, 255, 255); // 白色字体
    
    // 编码转换:imagettftext 仅支持 UTF-8
    $str = iconv("GB2312", "UTF-8", $str);
    
    // 计算当前文字的X位置(从右侧往左移)
    $now = 220 - $count * 5;
    
    // 在指定位置绘制文字 (图像,字号,角度,X,Y,颜色,字体路径,内容)
    imagettftext($im, 13, 0, $now, 20, $white, "ziti.ttf", $str);
    
    // 将当前帧写入缓冲区
    imagegif($im);
    imagedestroy($im);
    
    // 保存帧数据
    $imagedata[] = ob_get_contents();
    ob_clean(); // 清理缓冲区,为下一帧做准备
    
    $count++;
    
    // 当最后一个字的X坐标小于0时,说明已经滚出画面,结束循环
    if ($now + $length < 0) {
        break;
    }
}

// 设置播放参数:无限循环(0),每帧间隔2个单位
$diy[] = 0;
$gif = new GIFEncoder($imagedata, $diy, 0, 2, 0, 0, 0, "bin");

ob_start();
Header('Content-type:image/gif');
echo $gif->GetAnimation();
?>

第3步:构建垂直滚动字幕代码

垂直滚动通常用于多行文本的上滑效果。这里我们将接收到的以分号分隔的字符串拆分为数组,逐行进行纵向位移绘制。

<?php
require_once("GIFEncoder.class.php");
$array_str = array();
$str = $_GET['str'];

// 解析输入字符串,按分号分割成行
if ($str != '') {
    $array_str = explode(";", $str);
} else {
    $array_str = array("欢迎您光临本店!");
}

// 清理空元素
foreach ($array_str as $k => $v) {
    if (!$v) unset($array_str[$k]);
}

// 嵌套循环:外层遍历每一行文字,内层生成该行移动的20帧
for ($i = 0, $length = count($array_str); $i < $length; $i++) {
    for ($k = 0; $k < 20; $k++) {
        $im = imagecreatefromgif("hudongbg.gif");
        $white = ImageColorAllocate($im, 255, 255, 255);
        
        // 编码转换,务必转为字符串变量传给绘图函数
        $test = iconv("GB2312", "UTF-8", $array_str[$i]);
        
        // Y轴坐标随循环递增,产生向上滚动效果
        $height = 40 - $k;
        imagettftext($im, 13, 0, 0, $height, $white, "ziti.ttf", $test);
        
        imagegif($im);
        $imagedata[] = ob_get_contents();
        ob_clean();
    }
}

// 设置每20帧后的延迟时间为2秒(即200个单位),形成停顿效果
$delay = array();
$total_frames = count($array_str) * 20;
for ($i = 1; $i <= $total_frames; $i++) {
    if ($i % 20 == 0) {
        $delay[$i - 1] = "200";
    } else {
        $delay[$i - 1] = "1";
    }
}

// 设置透明色索引
$transparent = array(0);

// 实例化编码器并输出
$gif = new GIFEncoder($imagedata, $delay, 0, 2, 0, 0, $transparent, "bin");
ob_start();
Header('Content-type:image/gif');
echo $gif->GetAnimation();
?>

关键注意事项

  1. 编码问题:PHP的 imagettftext() 函数对非UTF-8编码的支持在某些环境下可能存在问题,因此务必在使用前将GBK/GB2312编码转换为UTF-8(如使用 iconv)。
  2. 资源释放:每一帧绘制完成后,调用 imagedestroy() 释放图像资源,避免大并发下内存溢出。
  3. 字体文件路径:确保 ziti.ttf 文件存在且可读取,建议使用绝对路径以防跨目录引用失败。

总结

通过上述代码,你可以直接调用脚本传入文字参数来获取动态滚动效果的GIF。这种纯PHP生成的方案轻量且高效,非常适合CMS系统、广告位展示或即时消息通知等场景。以上就是PHP使用GIFEncoder类生成动态滚动字幕的详细内容,更多关于PHP图片处理与GIF编码的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表