一個很實用的類別,php調整gif圖片的尺寸!

WBOY
發布: 2016-07-25 08:49:17
原創
1231 人瀏覽過
} }
這個類別可以對GIF格式的動態檔案進行調整。提取動態圖片幀檔案到一個臨時目錄。調整圖像的大小並提取和重建成動畫的GIF格式的新檔案。

@地瓜不讓傳送gif圖片
效果查看:http://www.codepearl.com/files/187.html 一個很實用的類別,php調整gif圖片的尺寸!
  1. //http://www.codepearl.com
  2. require_once "gifresizer.php";
  3. $gr = new gifresizer ;
  4. $gr->temp_dir = "codepearl";
  5. $gr->resize("codepearl.gif","codepearl_resized.gif",500,500);
  6. ?>
複製程式碼
  1. /**
  2. * http://www.codepearl.com
  3. * 調整動畫GIF 檔案的大小
  4. *
  5. * ///重要說明:該腳本需要一個臨時目錄,應在其中提取所有幀。
  6. * 建立一個權限等級為777的目錄,並將路徑寫入下面的$temp_dir變數中。
  7. *
  8. * 預設目錄是「frames」。
  9. */
  10. class gifresizer {
  11. public $temp_dir = "priframes" > private; pointer = 0 ;
  12. private $index = 0 ; 🎜> 預設$handle = 0;
  13. 預設$orgvars = array();
  14. 預設$encda​​ ta = array();
  15. 預設$parsedfiles = array();
  16. 預設$originalwidth = 0;
  17. 私人$wr,$hr;
  18. 私人$props = array();
  19. 私人$decoding = false *
  20. * 類別的公共部分
  21. *
  22. * @orgfile - 原始檔案路徑
  23. * @newfile - 帶路徑的新檔案名稱
  24. * @width - 所需的圖片寬度
  25. * @height - 所需的影像高度
  26. *
  27. * GIF 解碼器功能。
  28. * 將 GIF 動畫解析為單幀。
  29. * /
  30. 函數調整大小($orgfile,$newfile,$width,$height){
  31. $this->decode($orgfile);
  32. $this->wr=$width/ $this- > originalWidth;
  33. $this->; hr=$height/$this->originalheight;
  34. $this->resizeframes();
  35. $this->encode($newfile,$width,$height);
  36. $this->clearframes( );
  37. }
  38. /**
  39. * GIF 編碼器功能。
  40. * 將解析的 GIF 幀組合成一個動畫。
  41. */
  42. DecodeDecode($filename){
  43. $this->decoding = true;
  44. $this->clearvariables();
  45. $this->loadfile($filename);
  46. $this->get_gif_header(); $this->get_application_data();
  47. $this-> get_application_data();
  48. $this->get_image_block(0); while(!$this->checkbyte(0x3b) && !$this->checkEOF(); ){
  49. $this->get_comment_data(1) ;
  50. $this->get_graphics_extension(2);
  51. $this->get_image_block(2);
  52. }
  53. $this->writeframes (time());
  54. $this->closefile();
  55. $this->decoding = false; $newwidth , $newheight ) {
  56. $神秘 = " " ; $this -> 指標 = 0 ; 🎜 > $this -> imagedata = array ()
  57. $this->handle = 0;
  58. $this->index=0;
  59. $k=0 );
  60. $this->loadfile( $imagepart);
  61. $this->get_gif_header();
  62. $this->get_application_data(); > $this->get_graphics_extension(0);
  63. $this ->get_image_block(0); ta[ $this->index-1]))
  64. $gxdata = $this->encda​​ ta[$this->index-1]["graphicsextension"];
  65. else
  66. $gxdata = null ;
  67. $ghdata=$this->imageinfo["gifheader"];
  68. $trcolor="";
  69. $hastransparency=($gxdata[3]&&1= =1);
  70. if( $hastransparency){
  71. $trcx = order($gxdata[6]);
  72. //全域顏色表到影像資料;
  73. $this->transfercolortable($this->imageinfo["gifheader"],$this->imagedata[$this->index -1][ “圖像資料”]);
  74. $imageblock = &$this->imagedata[$this->index-1]["imagedata"];
  75. //如果透明度存在則傳輸透明度索引
  76. if ($hastransparency){
  77. $haslocalcolortable = ((ord($imageblock[9])&128)==128);
  78. if($haslocalcolortable){
  79. //本地表存在。確定邊界並尋找它。
  80. $tablesize=(pow(2,(ord($imageblock[9])&7) 1)*3) 10;
  81. $this->orgvars[$this-> ;index-1]["transparent_color_index "] =
  82. ((strrpos(substr($this->imagedata[$this->index-1]["imagedata"],0,$tablesize),$trcolor )-10)/3);
  83. }else{
  84. //本地表不存在,查看全域表
  85. $tablesize=(pow(2,(ord($gxdata[10])&7) 1)*3) 10 ;
  86. $ this->orgvars[$this->index-1]["transparent_color_index"] =
  87. ((strrpos(substr($ghdata,0,$tablesize),$trcolor)-10) /3);
  88. }
  89. }
  90. // 將原始延遲時間、透明索引和處置值應用於圖形擴充
  91. if(!$this->imagedata[$this->; index-1 ]["graphicsextension"]) $this->imagedata[$this->index-1]["graphicsextension"] = chr(0x21).chr(0xf9).chr(0x04).chr(0x00 ).chr(0x00 ).chr(0x00).chr(0x00).chr(0x00);
  92. $imagedata = &$this->imagedata[$this->index-1][" GraphicsExtension"];
  93. $imagedata[3] = chr((ord($imagedata[3]) & 0xE3) | ($this->orgvars[$this->index-1][" dispose_method"] $imagedata[4] = chr(($this->orgvars[$this->index-1]["delay_time"] % 256));
  94. $imagedata[5] = chr(floor($ this->orgvars[$this->index-1]["delay_time"] / 256));
  95. if($hastransparency){
  96. $imagedata[6] = chr($this->orgvars[$ this->index-1]["transparent_color_index"]);
  97. }
  98. $imagedata[3] = chr(ord($imagedata [3])|$hastransparency);
  99. //應用計算出的左側和頂部偏移
  100. $imageblock[1] = chr(round(($this->orgvars[$this->index) -1]["offset_left"]*$this->wr ) % 256));
  101. $imageblock[2] = chr(floor(($this->orgvars[$this->index-1) ]["offset_left"]*$this->wr) / 256) );
  102. $imageblock[3] = chr(round(($this->orgvars[$this->index-1][ "offset_top"]*$this->hr) % 256));
  103. $imageblock[4] = chr(floor(($this->orgvars[$this->index-1]["offset_top) "]*$this->hr) / 256));
  104. if ($this->index==1){
  105. if(!isset($this->imageinfo["applicationdata"]) || !$this->imageinfo[" applicationdata"])
  106. $this- >imageinfo["applicationdata"]=chr(0x21).chr(0xff).chr(0x0b)."NETSCAPE2.0".chr(0x03).chr(0x01)。 chr(0x00).chr(0x00).chr(0x00);
  107. if(!isset($this->imageinfo["commentdata"]) || !$this->imageinfo["commentdata"])
  108. $this->imageinfo["commentdata"] = chr(0x21).chr(0xfe).chr(0x10)."PHPGIFRESIZER1.0".chr(0);
  109. $mystring .= $this ->orgvars [“gifheader”]。 $this->imageinfo["applicationdata"].$this->imageinfo["commentdata"];
  110. if(isset($this->orgvars["hasgx_type_0"]) && $this->orgvars ["hasgx_type_0" ]) $mystring .= $this->globaldata["graphicsextension_0"];
  111. if(isset($this->orgvars["hasgx_type_1"]) && $this->orgvars[" hasgx_type_1"]) $mystring . = $this->globaldata["graphicsextension"];
  112. }
  113. $mystring .= $imagedata 。 $imageblock;
  114. $k ;
  115. $this->closefile();
  116. }
  117. $mystring .= chr(0x3b);
  118. //對 gif 標題套用新的寬度和高度
  119. $mystring[6] = chr($newwidth % 256);
  120. $mystring[7] = chr(floor($newwidth / 256) ));
  121. $mystring[8] = chr($newheight % 256);
  122. $mystring[9] = chr(floor($newheight / 256));
  123. $mystring[11] = $ this->orgvars["background_color"];
  124. //if(file_exists($new_filename)){unlink($new_filename);}
  125. file_put_contents($new_filename,$mystring);
  126. }
  127. /**
  128. * 變數重設功能
  129. * 如果一個實例被多次使用,則需要它。相信我。
  130. */
  131. 私人函數clearvariables(){
  132. $this->pointer = 0;
  133. $this->index = 0;
  134. $this - >imagedata = array();
  135. $this->imageinfo = array();
  136. $this->handle = 0;
  137. $this->parsedfiles = array();
  138. }
  139. /**
  140. * 清除幀功能
  141. * 用於編碼後刪除幀。
  142. */
  143. 牛皮函數clearframes () {
  144. foreach($this->parsedfiles as $temp_frame){
  145. unlink($temp_frame);
  146. }
  147. }
  148. /**
  149. * 幀寫入器
  150. * 將 GIF 幀寫入檔案。
  151. */
  152. 私有函數writeframes($prepend){
  153. for($i=0;$iimagedata);$i ){
  154. file_put_contents($this->temp_dir. "/frame_". $prepend."_".str_pad($i,2,"0",STR_PAD_LEFT).".gif",$this->imageinfo["gifheader"].$this->imagedata[ $i]["graphicsextension" ].$this->imagedata[$i]["imagedata"].chr(0x3b));
  155. $this->parsedfiles[]=$this->temp_dir。 ".str_pad($i,2,"0",STR_PAD_LEFT).".gif";
  156. }
  157. }
  158. /**
  159. * 調色盤傳輸裝置
  160. * 將全域色表(GCT)從影格傳送到動畫中的局部色表。
  161. */
  162. 私有函數transfercolortable( $src,&$dst){
  163. //src為gif頭,dst為圖像資料塊
  164. //如果全域色表存在,則傳輸
  165. if ((ord($src[10]) &128)==128){
  166. //Gif 標題全域顏色表長度
  167. $ghctl = pow(2,$this->readbits(ord($src[ 10]),5,3) 1)* 3;
  168. //從gif頭中剪下全域顏色表
  169. $ghgct = substr($src,13,$ghctl);
  170. //檢查圖片區塊顏色表長度
  171. if(( ord ($dst[9])&128)==128){
  172. //影像資料包含色表。最後一個顏色表長度,以便我們可以中斷虛擬顏色表
  173. $idctl = pow(2,$this ->readbits(ord($dst[9]),5,3) 1)*3;
  174. //設定顏色表標誌與長度
  175. $dst[9] = chr(ord($dst[9]) | (0x80 | (log($ghctl/3,2)-1)));
  176. //注入顏色表
  177. $dst = substr($dst,0,10).$ghgct. substr($dst,-1*strlen($dst) 10);
  178. }
  179. }else{
  180. //全域顏色表不存在。 >
  181. /**
  182. * GIF 解析器函數。
  183. * 以下函數是解析器的主要結構組件。
  184. */
  185. private function get_gif_header(){
  186. $this->p_forward(10);
  187. if ($this->readbits(($mybyte=$this ->readbyte_int()),0,1)==1){
  188. $this->p_forward(2);
  189. $this->p_forward(pow(2,$this->readbits($mybyte, 5,3) 1)*3);
  190. }else{
  191. $this->p_forward(2);
  192. }
  193. $this->imageinfo["gifheader"]=$ this->datapart(0,$this->指針);
  194. if($this->解碼){
  195. $this->orgvars["gifheader"]=$this->imageinfo["gifheader"] ;
  196. $this->originalwidth = ord($this->orgvars["gifheader"][ 7])*256 ord($this->orgvars["gifheader"][6]);
  197. $this ->originalheight = ord($this->orgvars["gifheader"][9]) *256 ord($this->orgvars["gifheader"][8]);
  198. $this->orgvars["background_color "]=$this->orgvars["gifheader"][11];
  199. }
  200. }
  201. //--------------------------------------------- ----------- ----------- ----------
  202. private function get_application_data(){
  203. $startdata = $this- >readbyte(2);
  204. if( $startdata==chr(0x21).chr (0xff)){
  205. $start = $this->pointer - 2;
  206. $this->p_forward($ this->readbyte_int());
  207. $this->read_data_stream( $this->readbyte_int());
  208. $this->imageinfo["applicationdata"] = $this->datapart($start,$ this->pointer-$start);
  209. } else{
  210. $this->p_rewind(2);
  211. }
  212. }
  213. //---------- -------------- --- ---------------------------------
  214. private function get_comment_data(){
  215. $startdata = $this ->readbyte(2);
  216. if($startdata==chr(0x21).chr(0xfe)){
  217. $start =chr(0x21).chr(0xfe)){
  218. $start = $this->指標- 2;
  219. $this- > ;read_data_stream($this->readbyte_int());
  220. $this->imageinfo["commentdata"] = $this->datapart($start, $this->pointer-$start);
  221. } else{
  222. $this->p_rewind(2);
  223. }
  224. }
  225. //--------- ---------- ---- ------------------------------------ --------------------
  226. 創傷函數 get_graphics_extension ($type){
  227. $startdata = $this->readbyte(2);
  228. if ($startdata==chr(0x21).chr(0xf9)){
  229. $start = $this->指標- 2;
  230. $this->p_forward($this->readbyte_int());
  231. $this->p_forward(1);
  232. if($type==2){
  233. $ this-> ;imagedata[$this->index]["graphicsextension"] = $this->datapart( $start,$this->pointer-$start);
  234. }else if($type==1) {
  235. $this->orgvars["hasgx_type_1"] = 1;
  236. $this-> globaldata["graphicsextension"] = $this->datapart($start,$this->pointer- $start);
  237. }else if($type==0 && $this->decoding==false){
  238. $this->encda​​[$this->index]["graphicsextension"] = $this- >datapart($start,$this->指標-$start);
  239. }else if ($type==0 && $this->decoding==true){
  240. $this->orgvars["hasgx_type_0 "] = 1;
  241. $this->globaldata["graphicsextension_0"] = $this- >datapart($start,$this->pointer-$start);
  242. }
  243. }else{
  244. $this->p_rewind(2);
  245. }
  246. }
  247. / /---------------- ------------ --------------------- -------------------------------
  248. 解剖函數get_image_block($type) {
  249. if($this- >checkbyte(0x2c)){
  250. $start = $this->pointer;
  251. $this->p_forward(9);
  252. if($this ->readbits (($mybyte=$this-> readbyte_int()),0,1)==1){
  253. $this->p_forward(pow(2,$this->readbits($mybyte,5,3) 1 )*3);
  254. }
  255. $this->p_forward(1);
  256. $this->read_data_stream($this->readbyte_int());
  257. $this->imagedata[$this ->index]["imagedata"] = $this->datapart($start,$this->pointer-$start);
  258. if ($type==0){
  259. $this- >orgvars["hasgx_type_0"] = 0 ;
  260. if(isset($this->globaldata["graphicsextension_0"]))
  261. $this ->imagedata[$this->index]["graphicsextension"]= $this->globaldata["graphicsextension_0" ];
  262. else
  263. $this->imagedata[$this->index ]["graphicsextension"]=null;
  264. unset($this->globaldata[" GraphicsExtension_0"]);
  265. } elseif($type==1){
  266. if(isset($this->orgvars["hasgx_type_1"]) && $this->orgvars["hasgx_type_1"]==1 ){
  267. $this-> orgvars["hasgx_type_1"] = 0;
  268. $this-> ;imagedata[$this->index]["graphicsextension"]=$this->globaldata["graphicsextension"] ;
  269. unset($this- >globaldata["graphicsextension"]); }else{
  270. $this->orgvars["hasgx_type_0"] = 0;
  271. $this->imagedata[$this->index]["graphicsextension"]=$this->globaldata[" GraphicsExtension_0"];
  272. unset($this->globaldata["graphicsextension_0"]);
  273. }
  274. }
  275. $this->parse_image_data();
  276. $this ->index ;
  277. }
  278. }
  279. //---------------------------- -------- ------------------
  280. 原生函數parse_image_data(){
  281. $this->imagedata[$this->; 索引]["disposal_method"] = $ this->get_imagedata_bit("ext",3,3,3);
  282. $this->imagedata[$this->index]["user_input_flag"] = $this->get_imagedata_bit("ext",3,6 ,1);
  283. $this->imagedata[$this->index]["transparent_color_flag"] = $this->get_imagedata_bit("ext" ,3,7,1);
  284. $this->imagedata [$this->index]["delay_time"] = $this->dualbyteval($this->get_imagedata_byte("ext",4 ,2));
  285. $this->imagedata[$this->index] ["transparent_color_index"] = ord($this->get_imagedata_byte("ext",6,1));
  286. $this->imagedata[$this->index]["offset_left"] = $this->dualbyteval ($this->get_imagedata_byte("dat",1,2));
  287. $this->imagedata[$this->index]["offset_top"] = $this->dualbyteval($this->get_imagedata_byte( "dat",3,2));
  288. $this->imagedata [$this->index]["width"] = $this->dualbyteval($this->get_imagedata_byte("dat",5,2 ));
  289. $this->imagedata[$this ->index]["height"] = $this->dualbyteval($this->get_imagedata_byte("dat",7,2));
  290. $這->圖像數據[$這->; index]["local_color_table_flag"] = $this->get_imagedata_bit("dat",9,0,1);
  291. $this->imagedata[$this->index]["interlace_flag"] = $this-> get_imagedata_bit("dat",9,1,1);
  292. $this->imagedata[$this->index]["sort_flag"] = $this->get_imagedata_bit("dat" ,9,2,1) ;
  293. $this->imagedata[$this->index]["color_table_size"] = pow(2,$this->get_imagedata_bit("dat",9,5, 3) 1)*3;
  294. $this->imagedata[$this->index]["color_table"] = substr($this->imagedata[$this->index]["imagedata"],10,$this->imagedata[$this-> index]["color_table_size"]);
  295. $this->imagedata[$this->index]["lzw_code_size"] = ord( $this->get_imagedata_byte("dat",10,1));
  296. if($this->解碼){
  297. $this->orgvars[$this->index]["transparent_color_flag "] = $this->imagedata[$this->index]["transparent_color_flag"];
  298. $this->orgvars[$this->index]["transparent_color_index"] = $this-> ;imagedata[$this->index]["transparent_color_index"];
  299. $this->orgvars[$this ->index]["delay_time"] = $this->imagedata[$this-> ;index]["delay_time"];
  300. $this->orgvars[$this->index]["disposal_method"] = $this->imagedata[$this->index]["disposal_method" ];
  301. $this->orgvars[$this->index]["offset_left"] = $this->imagedata[$this->index ]["offset_left"];
  302. $this ->orgvars[$this->index]["offset_top"] = $this->imagedata[$this->index]["offset_top"];
  303. }
  304. }
  305. / /----------------------------------------- --------------- -------- ------
  306. private function get_imagedata_byte($type,$start,$length){
  307. if ($type=="ext")
  308. return substr( $this->imagedata[$this->index]["graphicsextension"],$start,$length);
  309. elseif($type==" dat")
  310. return substr($this->imagedata[ $this->;索引]["imagedata"],$start,$length);
  311. }
  312. //--------------------------------------------- ----------- ----------- ----------
  313. private function get_imagedata_bit($type,$byteindex,$bitstart,$bitlength ){
  314. if($type== "ext")
  315. return $this->readbits(ord(substr($this->imagedata[$this->index]["graphicsextension"],$byteindex, 1)),$bitstart,$bitlength);
  316. elseif($type= ="dat")
  317. return $this->readbits(ord(substr($this->imagedata[$this->index] ["imagedata"],$byteindex,1) ),$bitstart, $bitlength);
  318. }
  319. //--------------------- ----------- -------- ------------------
  320. 臍函數dualbyteval($s){
  321. $i = ord($s[1] )*256 ord($s[ 0]);
  322. return $i;
  323. }
  324. //----------- - 輔助函數-------- -------- -----
  325. 私有函數read_data_stream($first_length){
  326. $this->p_forward($first_length);
  327. $length=$this->readbyte_int() ;
  328. if( $length!=0) {
  329. while($length!=0){
  330. $this->p_forward($length);
  331. $length=$this->readbyte_int( );
  332. }
  333. }
  334. 回傳true;
  335. }
  336. //-------------- -------------------------- --------------- --------- -----------------
  337. 私有函數loadfile($filename ){
  338. $this->handle = fopen($檔名,"rb");
  339. $this->pointer = 0;
  340. }
  341. //-------- ------------------------ ------------------------
  342. private function closefile(){
  343. fclose($this->handle);
  344. $this ->handle=0;
  345. }
  346. //------------ -------------- --------- ----------------------
  347. 私有函數readbyte($byte_count){
  348. $data = fread( $this->handle,$byte_count) ;
  349. $this->pointer = $byte_count;
  350. return $data;
  351. }
  352. //--------------------- --- ------------------------------------ ----------- -----------
  353. 原生函數readbyte_int(){
  354. $data = fread($this->handle,1);
  355. $this->指標;
  356. return ord($data);
  357. }
  358. / /------------------------ ----------- -------------- ------
  359. 私有函式readbits($byte,$start,$length){
  360. $bin = str_pad(decbin($byte) ,8,"0",STR_PAD_LEFT);
  361. $ data = substr($bin,$start,$length);
  362. return bindec($data);
  363. }
  364. //--- -------------------------------------------------- --- -------------
  365. 蠟燭函數p_rewind($length){
  366. $this->pointer-=$length;
  367. fseek($this->handle ,$this ->指標);
  368. }
  369. //-------- ------------------------- --- -------------------------------
  370. 私有函數p_forward($length){
  371. $this ->指標=$length;
  372. fseek($this->句柄,$this->指標);
  373. }
  374. // ---------------- --- ------------------------------- -----
  375. private function datapart($start,$ length){
  376. fseek($this->handle,$start);
  377. $data = fread($this->handle, $length);
  378. fseek($this->句柄,$this- >指標) ;
  379. return $data;
  380. }
  381. //------------ ------------------ -------- -----------------------------------
  382. 蠟燭函數checkbyte( $byte){
  383. if (fgetc($this->handle)==chr($byte)){
  384. fseek($this->handle,$this->pointer);
  385. return true;
  386. }else{
  387. fseek($this->句柄,$this->指針);
  388. return false;
  389. }
  390. }
  391. // ------- -------- ----------------------------------- -----
  392. 陰道函數checkEOF(){
  393. if(fgetc($this->handle)===false){
  394. return true;
  395. }else{
  396. fseek ($this->句柄,$this->句柄,$this-> 句柄this->指標);
  397. return false;
  398. }
  399. }
  400. //------------------------- --- ------------------ ----------------------------- -----
  401. /**
  402. * 偵錯功能。
  403. * 將 GIF 動畫解析為單幀。
  404. * /
  405. 私有函式debug($string){
  406. echo "
    ";
    登入後複製
    登入後複製
  407. for($i=0;$i echo str_pad(dechex(ord($ string[$i])),2,"0",STR_PAD_LEFT)。 ";
  408. }
  409. //--------------------------------------------- ----------- ----------- ----------
  410. private function debuglen($var,$len){
  411. echo "
    ";
    登入後複製
    登入後複製
  412. for( $i=0;$i echo str_pad(dechex(ord($var[$i])),2,"0" ,STR_PAD_LEFT)。 " ";
  413. }
  414. echo "";
  415. }
  416. //----------------------- - ------------- ---------------------------------
  417. 原生函數debugstream($length){
  418. $this->debug($this->datapart($this->pointer,$length));
  419. }
  420. //------- - --------- ---------------------------------------- ------------- --------
  421. /**
  422. * GD Resizer Device
  423. * 調整動畫影格的大小
  424. */
  425. 私有函數resizeframes(){
  426. $k=0;
  427. foreach($this->parsedfiles as $img) {
  428. $src = imagecreatefromgif($img);
  429. $sw = $這->imagedata[$k]["width"];
  430. $sh = $this->imagedata[$k][ "高度"];
  431. $nw = round($sw * $this ->wr);
  432. $nh = round($sh * $this- >hr);
  433. $sprite = imagecreatetruecolor($西北,$nh);
  434. $trans = imagecolortransparent($sprite);
  435. imagealphablending($sprite, false);
  436. imagesavealpha($sprite, true);
  437. imagepalettecopy($sprite,$src);
  438. imagefill($sprite,0,0,imagecolortransparent($src));
  439. imagecolortransparent($sprite,imagecolortransparent($src));
  440. imagecopyresized($sprite,$src,0,0,0,0,$nw,$nh,$sw,$sh);
  441. imagegif($sprite,$img);
  442. imagedestroy($sprite);
  443. imagedestroy($src);
  444. $k ;
  445. }
  446. }
  447. }
  448. }
  449. }
  450. }
}
} } }
}
} }
}
}
}
}
}
} } } } } } } } } } } }} > ?>複製程式碼
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板