当前位置:网站首页>thinkphp3.2.5 GIF. class. php for php7.4
thinkphp3.2.5 GIF. class. php for php7.4
2022-06-25 12:26:00 【sr_ www】
PHP7.4 The use of curly braces to access arrays and string offsets is no longer supported
PHP7.4 Arrays are no longer supported {} How to write it , Unified as array []
route :/ThinkPHP/Library/Think/Image/Driver/GIF.class.php
<?php
// +----------------------------------------------------------------------
// | TOPThink [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2010 http://topthink.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Wheat Dang seedling <[email protected]> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
// | GIF.class.php 2013-03-09
// +----------------------------------------------------------------------
namespace Think\Image\Driver;
class GIF {
/** * GIF Frame list * @var array */
private $frames = array();
/** * Waiting time list per frame * @var array */
private $delays = array();
/** * Construction method , Used to decode GIF picture * @param string $src GIF Picture data * @param string $mod Picture data type */
public function __construct($src = null, $mod = 'url') {
if (!is_null($src)) {
if ('url' == $mod && is_file($src)) {
$src = file_get_contents($src);
}
/* decode GIF picture */
try {
$de = new GIFDecoder($src);
$this->frames = $de->GIFGetFrames();
$this->delays = $de->GIFGetDelays();
} catch (\Exception $e) {
E(" decode GIF Picture error ");
}
}
}
/** * Set or get the data of the current frame * @param string $stream Binary data flow * @return boolean Acquired data */
public function image($stream = null) {
if (is_null($stream)) {
$current = current($this->frames);
return false === $current ? reset($this->frames) : $current;
} else {
$this->frames[key($this->frames)] = $stream;
}
}
/** * Moves the current frame to the next frame * @return string Current frame data */
public function nextImage() {
return next($this->frames);
}
/** * Encode and save current GIF picture * @param string $gifname Image name */
public function save($gifname) {
$gif = new GIFEncoder($this->frames, $this->delays, 0, 2, 0, 0, 0, 'bin');
file_put_contents($gifname, $gif->GetAnimation());
}
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFEncoder Version 2.0 by László Zsidi, http://gifs.hu :: :: This class is a rewritten 'GifMerge.class.php' version. :: :: Modification: :: - Simplified and easy code, :: - Ultra fast encoding, :: - Built-in errors, :: - Stable working :: :: :: Updated at 2007. 02. 13. '00.05.AM' :: :: :: :: Try on-line GIFBuilder Form demo based on GIFEncoder. :: :: http://gifs.hu/phpclasses/demos/GifBuilder/ :: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
class GIFEncoder {
private $GIF = "GIF89a"; /* GIF header 6 bytes */
private $VER = "GIFEncoder V2.05"; /* Encoder version */
private $BUF = array();
private $LOP = 0;
private $DIS = 2;
private $COL = -1;
private $IMG = -1;
private $ERR = array(
'ERR00' => "Does not supported function for only one image!",
'ERR01' => "Source is not a GIF image!",
'ERR02' => "Unintelligible flag ",
'ERR03' => "Does not make animation from animated GIF source",
);
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFEncoder... :: */
public function __construct($GIF_src, $GIF_dly, $GIF_lop, $GIF_dis, $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod) {
if (!is_array($GIF_src) && !is_array($GIF_dly)) {
printf("%s: %s", $this->VER, $this->ERR['ERR00']);
exit(0);
}
$this->LOP = ($GIF_lop > -1) ? $GIF_lop : 0;
$this->DIS = ($GIF_dis > -1) ? (($GIF_dis < 3) ? $GIF_dis : 3) : 2;
$this->COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ?
($GIF_red | ($GIF_grn << 8) | ($GIF_blu << 16)) : -1;
for ($i = 0; $i < count($GIF_src); $i++) {
if (strToLower($GIF_mod) == "url") {
$this->BUF[] = fread(fopen($GIF_src[$i], "rb"), filesize($GIF_src[$i]));
} else if (strToLower($GIF_mod) == "bin") {
$this->BUF[] = $GIF_src[$i];
} else {
printf("%s: %s ( %s )!", $this->VER, $this->ERR['ERR02'], $GIF_mod);
exit(0);
}
if (substr($this->BUF[$i], 0, 6) != "GIF87a" && substr($this->BUF[$i], 0, 6) != "GIF89a") {
printf("%s: %d %s", $this->VER, $i, $this->ERR['ERR01']);
exit(0);
}
for ($j = (13 + 3 * (2 << (ord($this->BUF[$i][10]) & 0x07))), $k = true; $k; $j++) {
switch ($this->BUF[$i][$j]) {
case "!":
if ((substr($this->BUF[$i], ($j + 3), 8)) == "NETSCAPE") {
printf("%s: %s ( %s source )!", $this->VER, $this->ERR['ERR03'], ($i + 1));
exit(0);
}
break;
case ";":
$k = false;
break;
}
}
}
$this->GIFAddHeader();
for ($i = 0; $i < count($this->BUF); $i++) {
$this->GIFAddFrames($i, $GIF_dly[$i]);
}
$this->GIFAddFooter();
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFAddHeader... :: */
private function GIFAddHeader() {
$cmap = 0;
if (ord($this->BUF[0][10]) & 0x80) {
$cmap = 3 * (2 << (ord($this->BUF[0][10]) & 0x07));
$this->GIF .= substr($this->BUF[0], 6, 7);
$this->GIF .= substr($this->BUF[0], 13, $cmap);
$this->GIF .= "!\377\13NETSCAPE2.0\3\1" . $this->GIFWord($this->LOP) . "\0";
}
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFAddFrames... :: */
private function GIFAddFrames($i, $d) {
$Locals_str = 13 + 3 * (2 << (ord($this->BUF[$i][10]) & 0x07));
$Locals_end = strlen($this->BUF[$i]) - $Locals_str - 1;
$Locals_tmp = substr($this->BUF[$i], $Locals_str, $Locals_end);
$Global_len = 2 << (ord($this->BUF[0][10]) & 0x07);
$Locals_len = 2 << (ord($this->BUF[$i][10]) & 0x07);
$Global_rgb = substr(
$this->BUF[0],
13,
3 * (2 << (ord($this->BUF[0][10]) & 0x07))
);
$Locals_rgb = substr(
$this->BUF[$i],
13,
3 * (2 << (ord($this->BUF[$i][10]) & 0x07))
);
$Locals_ext = "!\xF9\x04" . chr(($this->DIS << 2) + 0) .
chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . "\x0\x0";
if ($this->COL > -1 && ord($this->BUF[$i][10]) & 0x80) {
for ($j = 0; $j < (2 << (ord($this->BUF[$i][10]) & 0x07)); $j++) {
if (
ord($Locals_rgb[3 * $j + 0]) == (($this->COL >> 16) & 0xFF) &&
ord($Locals_rgb[3 * $j + 1]) == (($this->COL >> 8) & 0xFF) &&
ord($Locals_rgb[3 * $j + 2]) == (($this->COL >> 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->BUF[$i][10]) & 0x80 && $this->IMG > -1) {
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->BUF[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->BUF[$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->IMG = 1;
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFAddFooter... :: */
private function GIFAddFooter() {
$this->GIF .= ";";
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFBlockCompare... :: */
private function GIFBlockCompare($GlobalBlock, $LocalBlock, $Len) {
for ($i = 0; $i < $Len; $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);
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFWord... :: */
private function GIFWord($int) {
return (chr($int & 0xFF) . chr(($int >> 8) & 0xFF));
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GetAnimation... :: */
public function GetAnimation() {
return ($this->GIF);
}
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFDecoder Version 2.0 by László Zsidi, http://gifs.hu :: :: Created at 2007. 02. 01. '07.47.AM' :: :: :: :: :: Try on-line GIFBuilder Form demo based on GIFDecoder. :: :: http://gifs.hu/phpclasses/demos/GifBuilder/ :: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
class GIFDecoder {
private $GIF_buffer = array();
private $GIF_arrays = array();
private $GIF_delays = array();
private $GIF_stream = "";
private $GIF_string = "";
private $GIF_bfseek = 0;
private $GIF_screen = array();
private $GIF_global = array();
private $GIF_sorted;
private $GIF_colorS;
private $GIF_colorC;
private $GIF_colorF;
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFDecoder ( $GIF_pointer ) :: */
public function __construct($GIF_pointer) {
$this->GIF_stream = $GIF_pointer;
$this->GIFGetByte(6); // GIF89a
$this->GIFGetByte(7); // Logical Screen Descriptor
$this->GIF_screen = $this->GIF_buffer;
$this->GIF_colorF = $this->GIF_buffer[4] & 0x80 ? 1 : 0;
$this->GIF_sorted = $this->GIF_buffer[4] & 0x08 ? 1 : 0;
$this->GIF_colorC = $this->GIF_buffer[4] & 0x07;
$this->GIF_colorS = 2 << $this->GIF_colorC;
if (1 == $this->GIF_colorF) {
$this->GIFGetByte(3 * $this->GIF_colorS);
$this->GIF_global = $this->GIF_buffer;
}
/* * * 05.06.2007. * Made a little modification * * - for ( $cycle = 1; $cycle; ) { + if ( GIFDecoder::GIFGetByte ( 1 ) ) { - switch ( $this->GIF_buffer [ 0 ] ) { - case 0x21: - GIFDecoder::GIFReadExtensions ( ); - break; - case 0x2C: - GIFDecoder::GIFReadDescriptor ( ); - break; - case 0x3B: - $cycle = 0; - break; - } - } + else { + $cycle = 0; + } - } */
for ($cycle = 1; $cycle;) {
if ($this->GIFGetByte(1)) {
switch ($this->GIF_buffer[0]) {
case 0x21:
$this->GIFReadExtensions();
break;
case 0x2C:
$this->GIFReadDescriptor();
break;
case 0x3B:
$cycle = 0;
break;
}
} else {
$cycle = 0;
}
}
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFReadExtension ( ) :: */
private function GIFReadExtensions() {
$this->GIFGetByte(1);
for (;;) {
$this->GIFGetByte(1);
if (($u = $this->GIF_buffer[0]) == 0x00) {
break;
}
$this->GIFGetByte($u);
/* * 07.05.2007. * Implemented a new line for a new function * to determine the originaly delays between * frames. * */
if (4 == $u) {
$this->GIF_delays[] = ($this->GIF_buffer[1] | $this->GIF_buffer[2] << 8);
}
}
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFReadExtension ( ) :: */
private function GIFReadDescriptor() {
$GIF_screen = array();
$this->GIFGetByte(9);
$GIF_screen = $this->GIF_buffer;
$GIF_colorF = $this->GIF_buffer[8] & 0x80 ? 1 : 0;
if ($GIF_colorF) {
$GIF_code = $this->GIF_buffer[8] & 0x07;
$GIF_sort = $this->GIF_buffer[8] & 0x20 ? 1 : 0;
} else {
$GIF_code = $this->GIF_colorC;
$GIF_sort = $this->GIF_sorted;
}
$GIF_size = 2 << $GIF_code;
$this->GIF_screen[4] &= 0x70;
$this->GIF_screen[4] |= 0x80;
$this->GIF_screen[4] |= $GIF_code;
if ($GIF_sort) {
$this->GIF_screen[4] |= 0x08;
}
$this->GIF_string = "GIF87a";
$this->GIFPutByte($this->GIF_screen);
if (1 == $GIF_colorF) {
$this->GIFGetByte(3 * $GIF_size);
$this->GIFPutByte($this->GIF_buffer);
} else {
$this->GIFPutByte($this->GIF_global);
}
$this->GIF_string .= chr(0x2C);
$GIF_screen[8] &= 0x40;
$this->GIFPutByte($GIF_screen);
$this->GIFGetByte(1);
$this->GIFPutByte($this->GIF_buffer);
for (;;) {
$this->GIFGetByte(1);
$this->GIFPutByte($this->GIF_buffer);
if (($u = $this->GIF_buffer[0]) == 0x00) {
break;
}
$this->GIFGetByte($u);
$this->GIFPutByte($this->GIF_buffer);
}
$this->GIF_string .= chr(0x3B);
/* Add frames into $GIF_stream array... */
$this->GIF_arrays[] = $this->GIF_string;
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFGetByte ( $len ) :: */
/* * * 05.06.2007. * Made a little modification * * - function GIFGetByte ( $len ) { - $this->GIF_buffer = Array ( ); - - for ( $i = 0; $i < $len; $i++ ) { + if ( $this->GIF_bfseek > strlen ( $this->GIF_stream ) ) { + return 0; + } - $this->GIF_buffer [ ] = ord ( $this->GIF_stream { $this->GIF_bfseek++ } ); - } + return 1; - } */
private function GIFGetByte($len) {
$this->GIF_buffer = array();
for ($i = 0; $i < $len; $i++) {
if ($this->GIF_bfseek > strlen($this->GIF_stream)) {
return 0;
}
$this->GIF_buffer[] = ord($this->GIF_stream[$this->GIF_bfseek++]);
}
return 1;
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFPutByte ( $bytes ) :: */
private function GIFPutByte($bytes) {
for ($i = 0; $i < count($bytes); $i++) {
$this->GIF_string .= chr($bytes[$i]);
}
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: PUBLIC FUNCTIONS :: :: :: GIFGetFrames ( ) :: */
public function GIFGetFrames() {
return ($this->GIF_arrays);
}
/* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: :: GIFGetDelays ( ) :: */
public function GIFGetDelays() {
return ($this->GIF_delays);
}
}
边栏推荐
- [oceanbase] Introduction to oceanbase and its comparison with MySQL
- 黑马畅购商城---6.品牌、规格统计、条件筛选、分页排序、高亮显示
- SQL function summary
- 黑马畅购商城---3.商品管理
- Rank sum ratio comprehensive evaluation method for common models in mathematical modeling
- Effective reading of literature
- JS monitors the width and height changes of div
- 什么是Flink?Flink能用来做什么?
- R language uses the multinom function of NNET package to build an unordered multi classification logistic regression model, and uses the summary function to obtain the summary statistical information
- How to use ARIMA model for prediction?
猜你喜欢
ECSHOP quickly purchases goods, simplifies the shopping process, and improves the user experience through one-step shopping
plt. GCA () picture frame and label
Pd1.4 to hdmi2.0 adapter cable disassembly.
Use PHP script to view the opened extensions
19. Implementation of MVVM architecture based on WPF event to command
Actual combat summary of Youpin e-commerce 3.0 micro Service Mall project
Why can't you Ping the website but you can access it?
A commonly used statistical modeling method -- difference analysis
An article clearly explains MySQL's clustering / Federation / coverage index, back to table, and index push down
刷入Magisk通用方法
随机推荐
R语言使用构建有序多分类逻辑回归模型、epiDisplay包的ordinal.or.display函数获取有序logistic回归模型的汇总统计信息(变量对应的优势比及其置信区间、以及假设检验的p值)
Execution order of MySQL query statements join, on and where
Time series analysis - how to use unit root test (ADF) correctly?
黑马畅购商城---6.品牌、规格统计、条件筛选、分页排序、高亮显示
黑马畅购商城---8.微服务网关Gateway和Jwt令牌
Arm V7 coprocessor
黑马畅购商城---3.商品管理
. Using factory mode in net core
PD1.4转HDMI2.0转接线拆解。
ROS notes (06) - definition and use of topic messages
Understanding and construction of devsecops and Devops
Database Series: MySQL index optimization summary (comprehensive version)
VIM common commands and shortcut keys
揭秘GaussDB(for Redis):全面對比Codis
ARM 立即数
R语言使用nnet包的multinom函数构建无序多分类logistic回归模型、使用epiDisplay包的lrtest函数执行多个模型似然比检验对比两个模型的性能是否有差异
黑馬暢購商城---3.商品管理
What is the primordial universe
2022 meisai D topic ideas sharing + translation
黑马畅购商城---2.分布式文件存储FastDFS