PHP使用gifencoder类来生成GIF动态滚动字幕

在今天的公司,经理让一个滚动的字幕。然而,GIF图片是不允许产生。所以上网的gifencoder类库。它真的很好用,但在使用过程中存在的问题。现在写在这里供后人参考,少走弯路。

文本轧制分为两种情况:第一种是水平轧制。

复制代码代码如下所示:

< PHP

require_once(gifencoder。类。PHP );

$ = 0;设置默认计数器

当(真){

$str = $ _request { 'str'} { } _request美元'str:没有输入;

$长度= strlen(str×9);线路长度 / /计算,计算比较简单,就是在每个字9像素

我imagecreatefromgif美元=(hudongbg。gif); / /创建图像根据图片

白色= imagecolorallocate美元(合我,255255255); / /建立白

$str = iconv(GB2312

$现在= 220 - $ * 5;当前运行的水平位置

imagettftext(合我,13,0美元20美元,现在,白色,ziti.ttf,$str); / /根据书面文本的图片,图像源,参数含义(文字大小、倾角、水平位置、垂直位置、颜色、使用字体文件的内容写

imagegif(为我);

销毁一图像(为我);

{ } =(ob_get_contents ImageData美元); / /创建一帧图像数据

ob_clean();

数+;

如果最后一个移动到文本的结尾,则为$($ +长度0),

打破;

}

}

0美元

GIF =新gifencoder美元(美元美元数据,DIY,0,2,0,0,0,仓);

ob_start();

头('content-type:图像/ GIF);

echo GIF -> getanimation();

>



然后是垂直的:

复制代码代码如下所示:

< PHP

*

从URL获取第一行=第二行;第三行的数据。

* /

require_once(gifencoder。类。PHP );

array_str美元=阵();

$str = $ _get { 'str};

*

将$转换为数组

* /

如果($ ={!)

array_str美元=爆炸(;

其他{ }

array_str美元=阵列(欢迎光临!;

}

*

如果数组元素没有值,则清除最后一个元素;

* /

foreach(array_str美元美元美元K = > v){

如果(!$ V)

撤消($ array_str { $ K });

}

对(我= 0美元美元,长度=计数($ array_str);$i <美元美元的长度;i++){

对于($ = 0;$ K 20;$ + +){

我imagecreatefromgif美元=(hudongbg。gif); / /创建图像根据图片

白色= imagecolorallocate美元(合我,255255255); / /建立白

为测试= iconv(GB2312

高度= 40美元- $ K; / /当前文字高度

imagettftext(合我,13,0,0美元美元,高,白,ziti.ttf,$测试); / /会写文本图像

imagegif(为我);

{ } = ob_get_contents ImageData美元();

ob_clean();

}

}

*

这是设置每个图片的延迟时间,到第二十帧,延迟是2秒。

* /

延迟=数组();

对(我= 1美元美元,长度=计数($ array_str)×20;$i <=美元美元的长度;i++){

如果($ i = 20 = 0){

{ } =美元美元的延迟表示200 ;

其他{ }

{ } =美元美元的延迟表示1 ;

}

}

透明=数组(0);

GIF =新gifencoder美元(美元数据,延迟0,2,0,0美元,美元仓,透明,);

ob_start();

头('content-type:图像/ GIF);

echo GIF -> getanimation();

>



gifencoder类源代码:

复制代码代码如下所示:

< PHP

{ gifencoder类

VaR的GIF =GIF89a美元的头6个字节的GIF; / * * /

VaR版本=gifencoder美元v2.06 ;编码器版本 / * * /

VaR buf =阵列(美元);

var $ = 0;

var = 2;

var = 1;

VaR img = - 1美元;

var(=数组)

err00'does不支持函数= >只有一个图像!

err01'source不是GIF = 形象!

err02= >不知所云的旗帜

err03'could不使动画= >从GIF动画源

);

*

:::::::::::::::::::::::::::::::::::

::

::GIFEncoder…

::

* /

函数的GIFEncoder(

gif_src美元,gif_dly美元美元美元,gif_lop,gif_dis,

gif_red美元,gif_grn美元美元美元,gif_blu,gif_mod

{)

如果(!is_array($ gif_src)!is_array($ gif_tim)){

printf(%s %s

出口(0);

}

美元->罗布=($ gif_lop > 1)gif_lop:0美元;

美元-> DIS =($ gif_dis > 1)(($ gif_dis<3)gif_dis美元:3):2;

美元-> col =($ gif_red > - 1美元- 1美元gif_blu gif_grn > > 1)

(gif_red |美元(美元gif_grn<8)|($ gif_blu<16)):1;

为($我= 0;$我<计数(gif_src美元美元);i++){

如果(strtolower($ gif_mod)= URL){

美元-> buf { } = fread(fopen($ gif_src {我},rb),文件大小($ gif_src {我}));

}

如果(strtolower($ gif_mod)=仓){

美元-> buf { } = {我} gif_src美元美元;

}

{其他

printf(%s %s(%s)!

出口(0);

}

如果(substr(美元-> buf {我},0, 6)!=GIF87asubstr(美元-> buf {我},0, 6)!=GIF89a){ }

printf(%s %d %s

出口(0);

}

为(J =(13 + 3 *(2美元但{我} { 10 })0x07)))),$ K = true;$ K;J + +){)

Switch ($this->BUF {$i} {$j}) {

案例!:

如果((substr(美元-> buf {我},(J + 3),8))= = Netscape){

printf(%s %s(%s源)!

出口(0);

}

打破;

案例;:

$ = false;

打破;

}

}

}

GIFEncoder::GIFAddHeader();

为($我= 0;美元美元我buf);i++){

GIFEncoder::GIFAddFrames(我gif_dly美元美元美元,{我});

}

GIFEncoder::GIFAddFooter();

}

*

:::::::::::::::::::::::::::::::::::

::

::gifaddheader…

::

* /

函数的GIFAddHeader(){

CMAP = 0美元;

如果(ORD(美元-> buf { 0 } { 10 })0x80){

CMAP = 3 *(2美元但{ 0 } { 10 })0x07))))

美元-> GIF = substr(美元-> buf { 0 },6, 7);

美元-> GIF = substr(美元-> buf { 0 },13,$ CMAP);

美元-> GIF / 377 / / / 1 3 13netscape2.0!。GIFEncoder::GIFWord(美元->罗布) / 0 ;

}

}

*

:::::::::::::::::::::::::::::::::::

::

::GIFAddFrames…

::

* /

功能gifaddframes($,$){

locals_str美元= 13 + 3 *(2美元但{我} { 10 })0x07)))

locals_end美元= strlen(美元-> buf {我})locals_str - 1美元;

locals_tmp美元= substr(美元-> buf {我},locals_str美元,美元locals_end);

global_len = 2美元但{ 0 } { 10 })0x07);

locals_len美元= 2美元但{我} { 10 })0x07);

global_rgb美元= substr(美元-> buf { 0 },13,

3 *(2 buf { 0 } { 10 } )))))))

locals_rgb美元= substr(美元-> buf {我},13,

3 *(2美元但{我} { 10 })))))) 0x07

locals_ext美元=! / / xf9 X04。Chr(($这-> DIS<2)+ 0)。

Chr((($ > 0)0xff)。Chr(($ > > 8)0xff)。 / / x0 X0 ;

如果(美元->西> 1 ORD(美元-> buf {我} { 10 })0x80){

为(J = 0美元;J buf {我} { 10 })0x07)));$ J++){)

如果(

ORD($ locals_rgb * $ J + 0 { 3 })= =(美元->西> 0)0xff

ORD($ locals_rgb * $ J + 1 { 3 })= =(美元->西> 8)0xff

ORD($ locals_rgb * $ J + 2 { 3 })= =(美元->西> 16)0xff

{)

locals_ext美元=! / / xf9 X04。Chr(($这-> DIS<2)+ 1)。

Chr((($ > 0)0xff)。Chr(($ > > 8)0xff)。CHR(J)。 / X0 ;

打破;

}

}

}

开关($ locals_tmp { 0 }){

案例!:

locals_img美元= substr(locals_tmp美元,8, 10);

locals_tmp美元= substr(locals_tmp美元,18,strlen($ locals_tmp)- 18);

打破;

案例

locals_img美元= substr(locals_tmp美元,0, 10);

locals_tmp美元= substr(locals_tmp美元,10,strlen($ locals_tmp)- 10);

打破;

}

如果(ORD(美元-> buf {我} { 10 })0x80美元-> IMG > 1){

如果($ global_len = = $ locals_len){

如果(gifencoder::gifblockcompare(global_rgb美元美元美元,locals_rgb,global_len)){

美元-> GIF =(locals_ext locals_img美元美元。locals_tmp美元);

}

{其他

$字节= ORD($ locals_img { { 9 });

$字节0x80 | =;

美元0xf8字节;

$字节(ORD | =(美元-> buf { 0 } { 10 })0x07);

为locals_img { 9 } = CHR($字节);

美元-> GIF =(locals_ext locals_img美元美元。locals_rgb美元。locals_tmp美元);

}

}

{其他

$字节= ORD($ locals_img { { 9 });

$字节0x80 | =;

美元0xf8字节;

$字节(ORD | =(美元-> buf {我} { 10 })0x07);

为locals_img { 9 } = CHR($字节);

美元-> GIF =(locals_ext locals_img美元美元。locals_rgb美元。locals_tmp美元);

}

}

{其他

美元-> GIF =(locals_ext locals_img美元美元。locals_tmp美元);

}

美元-> img = 1;

}

*

:::::::::::::::::::::::::::::::::::

::

::gifaddfooter…

::

* /

功能gifaddfooter(){

$;

}

*

:::::::::::::::::::::::::::::::::::

::

::gifblockcompare…

::

* /

功能gifblockcompare(globalblock美元美元美元,localblock,Len){

($ i = 0;$ i;

如果(

globalblock美元* $我{ 3 } { 3 + 0!= $ localblock * $我+ 0 } | |

globalblock美元* $我{ 3 } { 3 + 1!= $ localblock * $我+ 1 } | |

globalblock美元{ 3 * $我+ 2 }!= $ localblock { 3 }我+ 2美元

{)

返回(0);

}

}

返回(1);

}

*

:::::::::::::::::::::::::::::::::::

::

::GIFWord…

::

* /

函数的GIFWord($ int){

返回(CHR($ int 0xff)。Chr((($ int > 8)0xff)));

}

*

:::::::::::::::::::::::::::::::::::

::

::getanimation…

::

* /

功能getanimation(){

返回($);

}

}

>