php建站目,PHP小项目:轻松创建gif图在线制作网站

news/2024/5/15 19:07:15/文章来源:https://blog.csdn.net/weixin_39585070/article/details/115316084

原标题:PHP小项目:轻松创建gif图在线制作网站

a560e0e55919d7049d6f4e50fc98c36b.png

各位朋友,大家下午好!

今天给大家带来的教学是 轻松创建gif图在线制作网站!

这里就需要用到一个 GIF动画的PHP类库!

下面我把类库代码分享给大家

由于源码比较长,需要的朋友可以加我的学习交流群 157531900 欢迎各位大神小白的加入!

废话不多说,上源码!

namespace GifCreator;

/**

* Create an animated GIF from multiple images

*

* @version 1.0

* @link https://github.com/Sybio/GifCreator

* @author Sybio (Clément Guillemain / @Sybio01)

* @license http://opensource.org/licenses/gpl-license.php GNU Public License

* @copyright Clément Guillemain

*/

class GifCreator

{

/**

* @var string The gif string source (old: this->GIF)

*/

private $gif;

/**

* @var string Encoder version (old: this->VER)

*/

private $version;

/**

* @var boolean Check the image is build or not (old: this->IMG)

*/

private $imgBuilt;

/**

* @var array Frames string sources (old: this->BUF)

*/

private $frameSources;

/**

* @var integer Gif loop (old: this->LOP)

*/

private $loop;

/**

* @var integer Gif dis (old: this->DIS)

*/

private $dis;

/**

* @var integer Gif color (old: this->COL)

*/

private $colour;

/**

* @var array (old: this->ERR)

*/

private $errors;

// Methods

// ===================================================================================

/**

* Constructor

*/

public function __construct()

{

$this->reset();

// Static data

$this->version = 'GifCreator: Under development';

$this->errors = array(

'ERR00' => 'Does not supported function for only one image.',

'ERR01' => 'Source is not a GIF image.',

'ERR02' => 'You have to give resource image variables, image URL or image binary sources in $frames array.',

'ERR03' => 'Does not make animation from animated GIF source.',

);

}

/**

* Create the GIF string (old: GIFEncoder)

*

* @param array $frames An array of frame: can be file paths, resource image variables, binary sources or image URLs

* @param array $durations An array containing the duration of each frame

* @param integer $loop Number of GIF loops before stopping animation (Set 0 to get an infinite loop)

*

* @return string The GIF string source

*/

public function create($frames = array(), $durations = array(), $loop = 0)

{

if (!is_array($frames) && !is_array($GIF_tim)) {

throw new \Exception($this->version.': '.$this->errors['ERR00']);

}

$this->loop = ($loop > -1) ? $loop : 0;

$this->dis = 2;

for ($i = 0; $i < count($frames); $i++) {

if (is_resource($frames[$i])) { // Resource var

$resourceImg = $frames[$i];

ob_start();

imagegif($frames[$i]);

$this->frameSources[] = ob_get_contents();

ob_end_clean();

} elseif (is_string($frames[$i])) { // File path or URL or Binary source code

if (file_exists($frames[$i]) || filter_var($frames[$i], FILTER_VALIDATE_URL)) { // File path

$frames[$i] = file_get_contents($frames[$i]);

}

$resourceImg = imagecreatefromstring($frames[$i]);

ob_start();

imagegif($resourceImg);

$this->frameSources[] = ob_get_contents();

ob_end_clean();

} else { // Fail

throw new \Exception($this->version.': '.$this->errors['ERR02'].' ('.$mode.')');

}

if ($i == 0) {

$colour = imagecolortransparent($resourceImg);

}

if (substr($this->frameSources[$i], 0, 6) != 'GIF87a' && substr($this->frameSources[$i], 0, 6) != 'GIF89a') {

throw new \Exception($this->version.': '.$i.' '.$this->errors['ERR01']);

}

for ($j = (13 + 3 * (2 << (ord($this->frameSources[$i] { 10 }) & 0x07))), $k = TRUE; $k; $j++) {

switch ($this->frameSources[$i] { $j }) {

case '!':

if ((substr($this->frameSources[$i], ($j + 3), 8)) == 'NETSCAPE') {

throw new \Exception($this->version.': '.$this->errors['ERR03'].' ('.($i + 1).' source).');

}

break;

case ';':

$k = false;

break;

}

}

unset($resourceImg);

}

if (isset($colour)) {

$this->colour = $colour;

} else {

$red = $green = $blue = 0;

$this->colour = ($red > -1 && $green > -1 && $blue > -1) ? ($red | ($green << 8) | ($blue << 16)) : -1;

}

$this->gifAddHeader();

for ($i = 0; $i < count($this->frameSources); $i++) {

$this->addGifFrames($i, $durations[$i]);

}

$this->gifAddFooter();

return $this->gif;

}

// Internals

// ===================================================================================

/**

* Add the header gif string in its source (old: GIFAddHeader)

*/

public function gifAddHeader()

{

$cmap = 0;

if (ord($this->frameSources[0] { 10 }) & 0x80) {

$cmap = 3 * (2 << (ord($this->frameSources[0] { 10 }) & 0x07));

$this->gif .= substr($this->frameSources[0], 6, 7);

$this->gif .= substr($this->frameSources[0], 13, $cmap);

$this->gif .= "!\377\13NETSCAPE2.0\3\1".$this->encodeAsciiToChar($this->loop)."\0";

}

}

/**

* Add the frame sources to the GIF string (old: GIFAddFrames)

*

* @param integer $i

* @param integer $d

*/

public function addGifFrames($i, $d)

{

$Locals_str = 13 + 3 * (2 << (ord($this->frameSources[ $i ] { 10 }) & 0x07));

$Locals_end = strlen($this->frameSources[$i]) - $Locals_str - 1;

$Locals_tmp = substr($this->frameSources[$i], $Locals_str, $Locals_end);

$Global_len = 2 << (ord($this->frameSources[0 ] { 10 }) & 0x07);

$Locals_len = 2 << (ord($this->frameSources[$i] { 10 }) & 0x07);

$Global_rgb = substr($this->frameSources[0], 13, 3 * (2 << (ord($this->frameSources[0] { 10 }) & 0x07)));

$Locals_rgb = substr($this->frameSources[$i], 13, 3 * (2 << (ord($this->frameSources[$i] { 10 }) & 0x07)));

$Locals_ext = "!\xF9\x04".chr(($this->dis << 2) + 0).chr(($d >> 0 ) & 0xFF).chr(($d >> 8) & 0xFF)."\x0\x0";

if ($this->colour > -1 && ord($this->frameSources[$i] { 10 }) & 0x80) {

for ($j = 0; $j < (2 << (ord($this->frameSources[$i] { 10 } ) & 0x07)); $j++) {

if (ord($Locals_rgb { 3 * $j + 0 }) == (($this->colour >> 16) & 0xFF) &&

ord($Locals_rgb { 3 * $j + 1 }) == (($this->colour >> 8) & 0xFF) &&

ord($Locals_rgb { 3 * $j + 2 }) == (($this->colour >> 0) & 0xFF)

) {

$Locals_ext = "!\xF9\x04".chr(($this->dis << 2) + 1).chr(($d >> 0) & 0xFF).chr(($d >> 8) & 0xFF).chr($j)."\x0";

break;

}

}

}

switch ($Locals_tmp { 0 }) {

case '!':

$Locals_img = substr($Locals_tmp, 8, 10);

$Locals_tmp = substr($Locals_tmp, 18, strlen($Locals_tmp) - 18);

break;

case ',':

$Locals_img = substr($Locals_tmp, 0, 10);

$Locals_tmp = substr($Locals_tmp, 10, strlen($Locals_tmp) - 10);

break;

}

if (ord($this->frameSources[$i] { 10 }) & 0x80 && $this->imgBuilt) {

if ($Global_len == $Locals_len) {

if ($this->gifBlockCompare($Global_rgb, $Locals_rgb, $Global_len)) {

$this->gif .= $Locals_ext.$Locals_img.$Locals_tmp;

} else {

$byte = ord($Locals_img { 9 });

$byte |= 0x80;

$byte &= 0xF8;

$byte |= (ord($this->frameSources[0] { 10 }) & 0x07);

$Locals_img { 9 } = chr($byte);

$this->gif .= $Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp;

}

} else {

$byte = ord($Locals_img { 9 });

$byte |= 0x80;

$byte &= 0xF8;

$byte |= (ord($this->frameSources[$i] { 10 }) & 0x07);

$Locals_img { 9 } = chr($byte);

$this->gif .= $Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp;

}

} else {

$this->gif .= $Locals_ext.$Locals_img.$Locals_tmp;

}

$this->imgBuilt = true;

}

/**

* Add the gif string footer char (old: GIFAddFooter)

*/

public function gifAddFooter()

{

$this->gif .= ';';

}

/**

* Compare two block and return the version (old: GIFBlockCompare)

*

* @param string $globalBlock

* @param string $localBlock

* @param integer $length

*

* @return integer

*/

public function gifBlockCompare($globalBlock, $localBlock, $length)

{

for ($i = 0; $i < $length; $i++) {

if ($globalBlock { 3 * $i + 0 } != $localBlock { 3 * $i + 0 } ||

$globalBlock { 3 * $i + 1 } != $localBlock { 3 * $i + 1 } ||

$globalBlock { 3 * $i + 2 } != $localBlock { 3 * $i + 2 }) {

return 0;

}

}

return 1;

}

/**

* Encode an ASCII char into a string char (old: GIFWord)

*

* $param integer $char ASCII char

*

* @return string

*/

public function encodeAsciiToChar($char)

{

return (chr($char & 0xFF).chr(($char >> 8) & 0xFF));

}

/**

* Reset and clean the current object

*/

public function reset()

{

$this->frameSources;

$this->gif = 'GIF89a'; // the GIF header

$this->imgBuilt = false;

$this->loop = 0;

$this->dis = 2;

$this->colour = -1;

}

// Getter / Setter

// ===================================================================================

/**

* Get the final GIF image string (old: GetAnimation)

*

* @return string

*/

public function getGif()

{

return $this->gif;

}

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_804305.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 1.14.2 php,CentOS7上安装Nginx1.14.2并部署PHP静态网站

我这里以CentOS7.4 x64服务器为例记录如何安装Nginx并且部署一个php静态网站&#xff0c;无数据的。先从Nginx的安装开始&#xff1a;1、先安装Nginx所依赖的软件&#xff1a;安装gcc:输入命令&#xff1a;yum install gcc-c 回车&#xff0c;中间会出现选择&#xff0c;输入…

lamp cacti 点击php下载,lamp 环境下装cacti网站流量监控工具

接下来我是介绍搭建 apache&#xff0c;mysql php 这三种 整合关系关闭SELINUX [rootmoyea ~]# vi /etc/selinux/config#SELINUXenforcing #注释掉#SELINUXTYPEtargeted #注释掉SELINUXdisabled #增加:wq 保存&#xff0c;关闭shutdown -r now #重启系统…

linux关机保护,linux中的关机敕令有什么区别_网站服务器运转保护

linux中关机敕令的区别是&#xff1a;实行shutdown敕令时&#xff0c;体系会关照一切登录的用户体系将要封闭&#xff1b;实行halt敕令时&#xff0c;文件体系写操纵完成后&#xff0c;内核住手&#xff1b;init敕令用于切换体系的运转级别&#xff0c;【init 0】示意关机。Lin…

php mysql 网站性能分析工具_大型网站调试工具之一(php性能优化分析工具XDebug)...

一、安装配置1、下载PHP的XDebug扩展&#xff0c;网址&#xff1a;http://xdebug.org/2、在Linux下编译安装XDebug引用tar -xzf xdebug-2.0.0RC3.gzcd xdebug-2.0.0RC3/usr/local/php/bin/phpize./configure --enable-xdebugcp modules/xdebug.so /usr/local/php/lib/php/exten…

php内容管理网站源码,DirCMS PHP内容管理系统 v6.0

DirCMS内容管理系统&#xff0c;是国内自主研发的一款功能强大而又不失小巧简洁的由PHPMysql架构的内容管理系统。DirCMS代码全部开源&#xff0c;便于使用者二次开发或定制&#xff1b;并采用简洁的模板标签技术&#xff0c;使制作模板更加容易&#xff0c;一般情况下&#xf…

linux中不保存的命令是,vim退出不保存的命令是什么?_网站服务器运行维护,vim,linux...

linux下如何用iptables开放指定端口_网站服务器运行维护linux下用iptables开放指定端口的方法是&#xff1a;1、执行【/sbin/iptables -I INPUT -p tcp –dport 8000 -j ACCEPT】命令开启端口&#xff1b;2、重启服务&#xff1b;3、查看端口是否已经开放。vim退出不保存的命令…

网站服务器响应网页浏览请求的运作流程,301重定向的运作流程

301重定向的运作流程(2014-10-17 14:15:25)标签&#xff1a;it网站服务器响应网页浏览请求的运作流程让我们先来了解一下用户/搜索引擎和网站一开始的交互流程。当用户或搜索引擎向一个网站服务器发出网页浏览请求时&#xff0c;该服务器将&#xff1a;通过域名服务器(DNS)将域…

河南2021高考成绩查询系统入口,2021河南省高考成绩查询网站入口

2021河南省高考三天&#xff0c;之后成绩什么时候出来可以查询呢&#xff0c;河南省高考成绩在什么平常查询分数&#xff0c;大家以查询分数来预估大学填报志愿。河南省高考成绩将于6月25日零时起通知考生。2021河南省高考成绩查询网站入口高考成绩查询过后应该做什么参照分数找…

基于springboot的音乐网站_开源分享springboot+vue.js音乐推荐系统

需求分析系统研究的主要角色是在线音乐系统&#xff0c;如何实现用户的在线听歌系统&#xff0c;如何实现管理员管理网站歌曲内容。本系统分为用户和管理员两个角色&#xff0c;两个角色的功能要求如下&#xff1a;用户角色&#xff1a;1.用户打开网站&#xff0c;在未注册或未…

abaqus结构工程分析及实例详解pdf_推荐一个学习疲劳分析的网站

网址&#xff1a;http://fatiguetoolbox.org网站上提供开源的疲劳寿命分析软件Fatlab下载&#xff0c;该软件基于MATLAB开发。另有若干分析实例&#xff0c;金属疲劳理论介绍&#xff0c;更多相关疲劳方面的软件、资源的链接。。作者提供了其收集和研究的疲劳数据以及疲劳方面的…

seo建设者_SEO优化|网站文章更新的频率对其优化效果存在影响吗?

关于网站文章的更新&#xff0c;主要要求是讲清的是&#xff0c;内容的不断更新是网站生存和发展的最基本条件。无论用户还是搜索引擎&#xff0c;都不可能过多地关注长时间不更新的网站。有无必要扔掉这些死亡或准死亡的站点也只是时间问题。内容更新的频率表示网站的活跃度。…

内网https需要ssl证书_网站HTTPS之路——安装、配置SSL证书及强制开启HTTPS

从2018年年底开始&#xff0c;谷歌浏览器Chrome对于http://站点将显示不安全的标志。所以最近终于开始琢磨SSL证书的事&#xff0c;让自己的网站不再显示不安全。一、证书申请对于个人站点而言&#xff0c;当然首选免费的SSL证书&#xff0c;毕竟财力有限&#xff0c;况且用户和…

php手机网站支付宝_支付宝支付-手机网站支付接口(H5手机站)

1&#xff1a;支付宝官方文档和demo&#xff0c;大家可以去下载学习我也是看文档&#xff0c;然后自己摸索查资料最后才搞定的&#xff0c;全程下来确实学到不少东西&#xff1b;2&#xff1a;签名方式及语言版本选择我的这个H5支付功能是嵌入到thinkphp框架里的&#xff0c;现…

seo提交工具_SEO:教您新网站的优化方法有哪些?

今天小龙教您新网站的优化方法有哪些&#xff1f;新站上线之初如果有备案&#xff0c;新站2个月的扶持期内&#xff0c;只做一个事情&#xff1a;提交大量优质原创内容&#xff0c;且内容为不间断提交。个人认为这个点是做新站优化的核心点&#xff0c;其余的seo优化技巧可概括…

android 怎么实现手机网站支付_手机网站怎么做竞价推广,你们知道吗?

百度移动推广是百度竞价推出的一个非常重要的新产品&#xff0c;它跟搜索推广存在一定程度上的不同&#xff0c;并且随着移动互联网市场的发展和扩大&#xff0c;移动竞价必将成为未来市场竞争的有力武器。因此&#xff0c;如何运用好百度移动推广就变得非常重要&#xff0c;下…

产品展示网站源码_新手SEO网站优化进阶之网站代码优化

SEO优化入门很简单&#xff0c;想精通却很难&#xff0c;需要SEOer自主学习相关的一些知识点和技巧&#xff0c;然后通过大量的实践去进行验证。今天老张就来跟大家说一说代码优化的注意事项。代码优化主要包括一些无用代码删除、注释代码精简、代码压缩和js优化调整等等。通过…

建站模板论坛_建站ABC展示型网站和论坛型网站建站有哪些区别?

网站的类型有很多&#xff0c;市面上常用的有展示型网站、论坛型网站、商城型网站跟O2O型网站这几大类&#xff0c;那么&#xff0c;建站ABC展示型网站和论坛型网站建站有哪些区别&#xff1f;其实&#xff0c;展示型网站、论坛型网站都可以在建站ABC上制作&#xff0c;今天就先…

java 后端实现网站打开_计算机专业,应该学习前端还是后端?具体有什么不一样?...

首先说说前端与后端的区别吧 前端主要数页面展示&#xff0c;就比如你现在打开浏览器进入一个网站&#xff0c;网站上面的图片布局都是依靠前端来完成的&#xff0c;如果你说你特别喜欢这种&#xff0c;但是还是不够&#xff0c;自己的审美也非常重要&#xff0c;每一个页面的U…

做网站java好还是php好_java与php哪个做网站简单

java与php哪个做网站简单php做网站更简单。1. php即写即用的。也就是说每次只有一改动完成&#xff0c;用户立马看到效果&#xff0c;而java则慢多了&#xff0c;代码改动完成后&#xff0c;要重新编译&#xff0c;然后重启jvm&#xff0c;中间耗费的时间可是不少啊&#xff0c…

python爬取新闻网站内容_Python爬虫爬取新闻资讯案例详解

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 一个简单的Python资讯采集案例&#xff0c;列表页到详情页&#xff0c;到数据保存&#xff0c;保存为txt文档&#xff0c;网站网页结构算是比较规整…