源码分享站 - 分享有用的

fatfree 展示 image.php源代码

返回 下载fatfree: 单独下载image.php源代码 - 下载整个fatfree源代码 - 类型:.php文件
  1. <?php
  2.  
  3. /*
  4.  
  5.         Copyright (c) 2009-2016 F3::Factory/Bong Cosca, All rights reserved.
  6.  
  7.         This file is part of the Fat-Free Framework (http://fatfreeframework.com).
  8.  
  9.         This is free software: you can redistribute it and/or modify it under the
  10.         terms of the GNU General Public License as published by the Free Software
  11.         Foundation, either version 3 of the License, or later.
  12.  
  13.         Fat-Free Framework is distributed in the hope that it will be useful,
  14.         but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.         General Public License for more details.
  17.  
  18.         You should have received a copy of the GNU General Public License along
  19.         with Fat-Free Framework.  If not, see <http://www.gnu.org/licenses/>.
  20.  
  21. */
  22.  
  23. //! Image manipulation tools
  24. class Image {
  25.  
  26.         //@{ Messages
  27.         const
  28.                 E_Color='Invalid color specified: %s',
  29.                 E_File='File not found',
  30.                 E_Font='CAPTCHA font not found',
  31.                 E_TTF='No TrueType support in GD module',
  32.                 E_Length='Invalid CAPTCHA length: %s';
  33.         //@}
  34.  
  35.         //@{ Positional cues
  36.         const
  37.                 POS_Left=1,
  38.                 POS_Center=2,
  39.                 POS_Right=4,
  40.                 POS_Top=8,
  41.                 POS_Middle=16,
  42.                 POS_Bottom=32;
  43.         //@}
  44.  
  45.         protected
  46.                 //! Source filename
  47.                 $file,
  48.                 //! Image resource
  49.                 $data,
  50.                 //! Enable/disable history
  51.                 $flag=FALSE,
  52.                 //! Filter count
  53.                 $count=0;
  54.  
  55.         /**
  56.         *       Convert RGB hex triad to array
  57.         *       @return array|FALSE
  58.         *       @param $color int|string
  59.         **/
  60.         function rgb($color) {
  61.                 if (is_string($color))
  62.                         $color=hexdec($color);
  63.                 $hex=str_pad($hex=dechex($color),$color<4096?3:6,'0',STR_PAD_LEFT);
  64.                 if (($len=strlen($hex))>6)
  65.                         user_error(sprintf(self::E_Color,'0x'.$hex),E_USER_ERROR);
  66.                 $color=str_split($hex,$len/3);
  67.                 foreach ($color as &$hue) {
  68.                         $hue=hexdec(str_repeat($hue,6/$len));
  69.                         unset($hue);
  70.                 }
  71.                 return $color;
  72.         }
  73.  
  74.         /**
  75.         *       Invert image
  76.         *       @return object
  77.         **/
  78.         function invert() {
  79.                 imagefilter($this->data,IMG_FILTER_NEGATE);
  80.                 return $this->save();
  81.         }
  82.  
  83.         /**
  84.         *       Adjust brightness (range:-255 to 255)
  85.         *       @return object
  86.         *       @param $level int
  87.         **/
  88.         function brightness($level) {
  89.                 imagefilter($this->data,IMG_FILTER_BRIGHTNESS,$level);
  90.                 return $this->save();
  91.         }
  92.  
  93.         /**
  94.         *       Adjust contrast (range:-100 to 100)
  95.         *       @return object
  96.         *       @param $level int
  97.         **/
  98.         function contrast($level) {
  99.                 imagefilter($this->data,IMG_FILTER_CONTRAST,$level);
  100.                 return $this->save();
  101.         }
  102.  
  103.         /**
  104.         *       Convert to grayscale
  105.         *       @return object
  106.         **/
  107.         function grayscale() {
  108.                 imagefilter($this->data,IMG_FILTER_GRAYSCALE);
  109.                 return $this->save();
  110.         }
  111.  
  112.         /**
  113.         *       Adjust smoothness
  114.         *       @return object
  115.         *       @param $level int
  116.         **/
  117.         function smooth($level) {
  118.                 imagefilter($this->data,IMG_FILTER_SMOOTH,$level);
  119.                 return $this->save();
  120.         }
  121.  
  122.         /**
  123.         *       Emboss the image
  124.         *       @return object
  125.         **/
  126.         function emboss() {
  127.                 imagefilter($this->data,IMG_FILTER_EMBOSS);
  128.                 return $this->save();
  129.         }
  130.  
  131.         /**
  132.         *       Apply sepia effect
  133.         *       @return object
  134.         **/
  135.         function sepia() {
  136.                 imagefilter($this->data,IMG_FILTER_GRAYSCALE);
  137.                 imagefilter($this->data,IMG_FILTER_COLORIZE,90,60,45);
  138.                 return $this->save();
  139.         }
  140.  
  141.         /**
  142.         *       Pixelate the image
  143.         *       @return object
  144.         *       @param $size int
  145.         **/
  146.         function pixelate($size) {
  147.                 imagefilter($this->data,IMG_FILTER_PIXELATE,$size,TRUE);
  148.                 return $this->save();
  149.         }
  150.  
  151.         /**
  152.         *       Blur the image using Gaussian filter
  153.         *       @return object
  154.         *       @param $selective bool
  155.         **/
  156.         function blur($selective=FALSE) {
  157.                 imagefilter($this->data,
  158.                         $selective?IMG_FILTER_SELECTIVE_BLUR:IMG_FILTER_GAUSSIAN_BLUR);
  159.                 return $this->save();
  160.         }
  161.  
  162.         /**
  163.         *       Apply sketch effect
  164.         *       @return object
  165.         **/
  166.         function sketch() {
  167.                 imagefilter($this->data,IMG_FILTER_MEAN_REMOVAL);
  168.                 return $this->save();
  169.         }
  170.  
  171.         /**
  172.         *       Flip on horizontal axis
  173.         *       @return object
  174.         **/
  175.         function hflip() {
  176.                 $tmp=imagecreatetruecolor(
  177.                         $width=$this->width(),$height=$this->height());
  178.                 imagesavealpha($tmp,TRUE);
  179.                 imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT);
  180.                 imagecopyresampled($tmp,$this->data,
  181.                         0,0,$width-1,0,$width,$height,-$width,$height);
  182.                 imagedestroy($this->data);
  183.                 $this->data=$tmp;
  184.                 return $this->save();
  185.         }
  186.  
  187.         /**
  188.         *       Flip on vertical axis
  189.         *       @return object
  190.         **/
  191.         function vflip() {
  192.                 $tmp=imagecreatetruecolor(
  193.                         $width=$this->width(),$height=$this->height());
  194.                 imagesavealpha($tmp,TRUE);
  195.                 imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT);
  196.                 imagecopyresampled($tmp,$this->data,
  197.                         0,0,0,$height-1,$width,$height,$width,-$height);
  198.                 imagedestroy($this->data);
  199.                 $this->data=$tmp;
  200.                 return $this->save();
  201.         }
  202.  
  203.         /**
  204.         *       Crop the image
  205.         *       @return object
  206.         *       @param $x1 int
  207.         *       @param $y1 int
  208.         *       @param $x2 int
  209.         *       @param $y2 int
  210.         **/
  211.         function crop($x1,$y1,$x2,$y2) {
  212.                 $tmp=imagecreatetruecolor($width=$x2-$x1+1,$height=$y2-$y1+1);
  213.                 imagesavealpha($tmp,TRUE);
  214.                 imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT);
  215.                 imagecopyresampled($tmp,$this->data,
  216.                         0,0,$x1,$y1,$width,$height,$width,$height);
  217.                 imagedestroy($this->data);
  218.                 $this->data=$tmp;
  219.                 return $this->save();
  220.         }
  221.  
  222.         /**
  223.         *       Resize image (Maintain aspect ratio); Crop relative to center
  224.         *       if flag is enabled; Enlargement allowed if flag is enabled
  225.         *       @return object
  226.         *       @param $width int
  227.         *       @param $height int
  228.         *       @param $crop bool
  229.         *       @param $enlarge bool
  230.         **/
  231.         function resize($width=NULL,$height=NULL,$crop=TRUE,$enlarge=TRUE) {
  232.                 if (is_null($width) && is_null($height))
  233.                         return $this;
  234.                 $origw=$this->width();
  235.                 $origh=$this->height();
  236.                 if (is_null($width))
  237.                         $width=round(($height/$origh)*$origw);
  238.                 if (is_null($height))
  239.                         $height=round(($width/$origw)*$origh);
  240.                 // Adjust dimensions; retain aspect ratio
  241.                 $ratio=$origw/$origh;
  242.                 if (!$crop) {
  243.                         if ($width/$ratio<=$height)
  244.                                 $height=round($width/$ratio);
  245.                         else
  246.                                 $width=round($height*$ratio);
  247.                 }
  248.                 if (!$enlarge) {
  249.                         $width=min($origw,$width);
  250.                         $height=min($origh,$height);
  251.                 }
  252.                 // Create blank image
  253.                 $tmp=imagecreatetruecolor($width,$height);
  254.                 imagesavealpha($tmp,TRUE);
  255.                 imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT);
  256.                 // Resize
  257.                 if ($crop) {
  258.                         if ($width/$ratio<=$height) {
  259.                                 $cropw=round($origh*$width/$height);
  260.                                 imagecopyresampled($tmp,$this->data,
  261.                                         0,0,($origw-$cropw)/2,0,$width,$height,$cropw,$origh);
  262.                         }
  263.                         else {
  264.                                 $croph=round($origw*$height/$width);
  265.                                 imagecopyresampled($tmp,$this->data,
  266.                                         0,0,0,($origh-$croph)/2,$width,$height,$origw,$croph);
  267.                         }
  268.                 }
  269.                 else
  270.                         imagecopyresampled($tmp,$this->data,
  271.                                 0,0,0,0,$width,$height,$origw,$origh);
  272.                 imagedestroy($this->data);
  273.                 $this->data=$tmp;
  274.                 return $this->save();
  275.         }
  276.  
  277.         /**
  278.         *       Rotate image
  279.         *       @return object
  280.         *       @param $angle int
  281.         **/
  282.         function rotate($angle) {
  283.                 $this->data=imagerotate($this->data,$angle,
  284.                         imagecolorallocatealpha($this->data,0,0,0,127));
  285.                 imagesavealpha($this->data,TRUE);
  286.                 return $this->save();
  287.         }
  288.  
  289.         /**
  290.         *       Apply an image overlay
  291.         *       @return object
  292.         *       @param $img object
  293.         *       @param $align int|array
  294.         *       @param $alpha int
  295.         **/
  296.         function overlay(Image $img,$align=NULL,$alpha=100) {
  297.                 if (is_null($align))
  298.                         $align=self::POS_Right|self::POS_Bottom;
  299.                 if (is_array($align)) {
  300.                         list($posx,$posy)=$align;
  301.                         $align = 0;
  302.                 }
  303.                 $ovr=imagecreatefromstring($img->dump());
  304.                 imagesavealpha($ovr,TRUE);
  305.                 $imgw=$this->width();
  306.                 $imgh=$this->height();
  307.                 $ovrw=imagesx($ovr);
  308.                 $ovrh=imagesy($ovr);
  309.                 if ($align & self::POS_Left)
  310.                         $posx=0;
  311.                 if ($align & self::POS_Center)
  312.                         $posx=($imgw-$ovrw)/2;
  313.                 if ($align & self::POS_Right)
  314.                         $posx=$imgw-$ovrw;
  315.                 if ($align & self::POS_Top)
  316.                         $posy=0;
  317.                 if ($align & self::POS_Middle)
  318.                         $posy=($imgh-$ovrh)/2;
  319.                 if ($align & self::POS_Bottom)
  320.                         $posy=$imgh-$ovrh;
  321.                 if (empty($posx))
  322.                         $posx=0;
  323.                 if (empty($posy))
  324.                         $posy=0;
  325.                 if ($alpha==100)
  326.                         imagecopy($this->data,$ovr,$posx,$posy,0,0,$ovrw,$ovrh);
  327.                 else {
  328.                         $cut=imagecreatetruecolor($ovrw,$ovrh);
  329.                         imagecopy($cut,$this->data,0,0,$posx,$posy,$ovrw,$ovrh);
  330.                         imagecopy($cut,$ovr,0,0,0,0,$ovrw,$ovrh);
  331.                         imagecopymerge($this->data,
  332.                                 $cut,$posx,$posy,0,0,$ovrw,$ovrh,$alpha);
  333.                 }
  334.                 return $this->save();
  335.         }
  336.  
  337.         /**
  338.         *       Generate identicon
  339.         *       @return object
  340.         *       @param $str string
  341.         *       @param $size int
  342.         *       @param $blocks int
  343.         **/
  344.         function identicon($str,$size=64,$blocks=4) {
  345.                 $sprites=[
  346.                         [.5,1,1,0,1,1],
  347.                         [.5,0,1,0,.5,1,0,1],
  348.                         [.5,0,1,0,1,1,.5,1,1,.5],
  349.                         [0,.5,.5,0,1,.5,.5,1,.5,.5],
  350.                         [0,.5,1,0,1,1,0,1,1,.5],
  351.                         [1,0,1,1,.5,1,1,.5,.5,.5],
  352.                         [0,0,1,0,1,.5,0,0,.5,1,0,1],
  353.                         [0,0,.5,0,1,.5,.5,1,0,1,.5,.5],
  354.                         [.5,0,.5,.5,1,.5,1,1,.5,1,.5,.5,0,.5],
  355.                         [0,0,1,0,.5,.5,1,.5,.5,1,.5,.5,0,1],
  356.                         [0,.5,.5,1,1,.5,.5,0,1,0,1,1,0,1],
  357.                         [.5,0,1,0,1,1,.5,1,1,.75,.5,.5,1,.25],
  358.                         [0,.5,.5,0,.5,.5,1,0,1,.5,.5,1,.5,.5,0,1],
  359.                         [0,0,1,0,1,1,0,1,1,.5,.5,.25,.5,.75,0,.5,.5,.25],
  360.                         [0,.5,.5,.5,.5,0,1,0,.5,.5,1,.5,.5,1,.5,.5,0,1],
  361.                         [0,0,1,0,.5,.5,.5,0,0,.5,1,.5,.5,1,.5,.5,0,1]
  362.                 ];
  363.                 $hash=sha1($str);
  364.                 $this->data=imagecreatetruecolor($size,$size);
  365.                 list($r,$g,$b)=$this->rgb(hexdec(substr($hash,-3)));
  366.                 $fg=imagecolorallocate($this->data,$r,$g,$b);
  367.                 imagefill($this->data,0,0,IMG_COLOR_TRANSPARENT);
  368.                 $ctr=count($sprites);
  369.                 $dim=$blocks*floor($size/$blocks)*2/$blocks;
  370.                 for ($j=0,$y=ceil($blocks/2);$j<$y;$j++)
  371.                         for ($i=$j,$x=$blocks-1-$j;$i<$x;$i++) {
  372.                                 $sprite=imagecreatetruecolor($dim,$dim);
  373.                                 imagefill($sprite,0,0,IMG_COLOR_TRANSPARENT);
  374.                                 $block=$sprites[hexdec($hash[($j*$blocks+$i)*2])%$ctr];
  375.                                 for ($k=0,$pts=count($block);$k<$pts;$k++)
  376.                                         $block[$k]*=$dim;
  377.                                 imagefilledpolygon($sprite,$block,$pts/2,$fg);
  378.                                 for ($k=0;$k<4;$k++) {
  379.                                         imagecopyresampled($this->data,$sprite,
  380.                                                 $i*$dim/2,$j*$dim/2,0,0,$dim/2,$dim/2,$dim,$dim);
  381.                                         $this->data=imagerotate($this->data,90,
  382.                                                 imagecolorallocatealpha($this->data,0,0,0,127));
  383.                                 }
  384.                                 imagedestroy($sprite);
  385.                         }
  386.                 imagesavealpha($this->data,TRUE);
  387.                 return $this->save();
  388.         }
  389.  
  390.         /**
  391.         *       Generate CAPTCHA image
  392.         *       @return object|FALSE
  393.         *       @param $font string
  394.         *       @param $size int
  395.         *       @param $len int
  396.         *       @param $key string
  397.         *       @param $path string
  398.         *       @param $fg int
  399.         *       @param $bg int
  400.         **/
  401.         function captcha($font,$size=24,$len=5,
  402.                 $key=NULL,$path='',$fg=0xFFFFFF,$bg=0x000000) {
  403.                 if ((!$ssl=extension_loaded('openssl')) && ($len<4 || $len>13)) {
  404.                         user_error(sprintf(self::E_Length,$len),E_USER_ERROR);
  405.                         return FALSE;
  406.                 }
  407.                 if (!function_exists('imagettftext')) {
  408.                         user_error(self::E_TTF,E_USER_ERROR);
  409.                         return FALSE;
  410.                 }
  411.                 $fw=Base::instance();
  412.                 foreach ($fw->split($path?:$fw->get('UI').';./') as $dir)
  413.                         if (is_file($path=$dir.$font)) {
  414.                                 $seed=strtoupper(substr(
  415.                                         $ssl?bin2hex(openssl_random_pseudo_bytes($len)):uniqid(),
  416.                                         -$len));
  417.                                 $block=$size*3;
  418.                                 $tmp=[];
  419.                                 for ($i=0,$width=0,$height=0;$i<$len;$i++) {
  420.                                         // Process at 2x magnification
  421.                                         $box=imagettfbbox($size*2,0,$path,$seed[$i]);
  422.                                         $w=$box[2]-$box[0];
  423.                                         $h=$box[1]-$box[5];
  424.                                         $char=imagecreatetruecolor($block,$block);
  425.                                         imagefill($char,0,0,$bg);
  426.                                         imagettftext($char,$size*2,0,
  427.                                                 ($block-$w)/2,$block-($block-$h)/2,
  428.                                                 $fg,$path,$seed[$i]);
  429.                                         $char=imagerotate($char,mt_rand(-30,30),
  430.                                                 imagecolorallocatealpha($char,0,0,0,127));
  431.                                         // Reduce to normal size
  432.                                         $tmp[$i]=imagecreatetruecolor(
  433.                                                 ($w=imagesx($char))/2,($h=imagesy($char))/2);
  434.                                         imagefill($tmp[$i],0,0,IMG_COLOR_TRANSPARENT);
  435.                                         imagecopyresampled($tmp[$i],
  436.                                                 $char,0,0,0,0,$w/2,$h/2,$w,$h);
  437.                                         imagedestroy($char);
  438.                                         $width+=$i+1<$len?$block/2:$w/2;
  439.                                         $height=max($height,$h/2);
  440.                                 }
  441.                                 $this->data=imagecreatetruecolor($width,$height);
  442.                                 imagefill($this->data,0,0,IMG_COLOR_TRANSPARENT);
  443.                                 for ($i=0;$i<$len;$i++) {
  444.                                         imagecopy($this->data,$tmp[$i],
  445.                                                 $i*$block/2,($height-imagesy($tmp[$i]))/2,0,0,
  446.                                                 imagesx($tmp[$i]),imagesy($tmp[$i]));
  447.                                         imagedestroy($tmp[$i]);
  448.                                 }
  449.                                 imagesavealpha($this->data,TRUE);
  450.                                 if ($key)
  451.                                         $fw->set($key,$seed);
  452.                                 return $this->save();
  453.                         }
  454.                 user_error(self::E_Font,E_USER_ERROR);
  455.                 return FALSE;
  456.         }
  457.  
  458.         /**
  459.         *       Return image width
  460.         *       @return int
  461.         **/
  462.         function width() {
  463.                 return imagesx($this->data);
  464.         }
  465.  
  466.         /**
  467.         *       Return image height
  468.         *       @return int
  469.         **/
  470.         function height() {
  471.                 return imagesy($this->data);
  472.         }
  473.  
  474.         /**
  475.         *       Send image to HTTP client
  476.         *       @return NULL
  477.         **/
  478.         function render() {
  479.                 $args=func_get_args();
  480.                 $format=$args?array_shift($args):'png';
  481.                 if (PHP_SAPI!='cli') {
  482.                         header('Content-Type: image/'.$format);
  483.                         header('X-Powered-By: '.Base::instance()->get('PACKAGE'));
  484.                 }
  485.                 call_user_func_array(
  486.                         'image'.$format,
  487.                         array_merge([$this->data,NULL],$args)
  488.                 );
  489.         }
  490.  
  491.         /**
  492.         *       Return image as a string
  493.         *       @return string
  494.         **/
  495.         function dump() {
  496.                 $args=func_get_args();
  497.                 $format=$args?array_shift($args):'png';
  498.                 ob_start();
  499.                 call_user_func_array(
  500.                         'image'.$format,
  501.                         array_merge([$this->data,NULL],$args)
  502.                 );
  503.                 return ob_get_clean();
  504.         }
  505.  
  506.         /**
  507.         *       Return image resource
  508.         *       @return resource
  509.         **/
  510.         function data() {
  511.                 return $this->data;
  512.         }
  513.  
  514.         /**
  515.         *       Save current state
  516.         *       @return object
  517.         **/
  518.         function save() {
  519.                 $fw=Base::instance();
  520.                 if ($this->flag) {
  521.                         if (!is_dir($dir=$fw->get('TEMP')))
  522.                                 mkdir($dir,Base::MODE,TRUE);
  523.                         $this->count++;
  524.                         $fw->write($dir.'/'.$fw->get('SEED').'.'.
  525.                                 $fw->hash($this->file).'-'.$this->count.'.png',
  526.                                 $this->dump());
  527.                 }
  528.                 return $this;
  529.         }
  530.  
  531.         /**
  532.         *       Revert to specified state
  533.         *       @return object
  534.         *       @param $state int
  535.         **/
  536.         function restore($state=1) {
  537.                 $fw=Base::instance();
  538.                 if ($this->flag && is_file($file=($path=$fw->get('TEMP').
  539.                         $fw->get('SEED').'.'.$fw->hash($this->file).'-').$state.'.png')) {
  540.                         if (is_resource($this->data))
  541.                                 imagedestroy($this->data);
  542.                         $this->data=imagecreatefromstring($fw->read($file));
  543.                         imagesavealpha($this->data,TRUE);
  544.                         foreach (glob($path.'*.png',GLOB_NOSORT) as $match)
  545.                                 if (preg_match('/-(\d+)\.png/',$match,$parts) &&
  546.                                         $parts[1]>$state)
  547.                                         @unlink($match);
  548.                         $this->count=$state;
  549.                 }
  550.                 return $this;
  551.         }
  552.  
  553.         /**
  554.         *       Undo most recently applied filter
  555.         *       @return object
  556.         **/
  557.         function undo() {
  558.                 if ($this->flag) {
  559.                         if ($this->count)
  560.                                 $this->count--;
  561.                         return $this->restore($this->count);
  562.                 }
  563.                 return $this;
  564.         }
  565.  
  566.         /**
  567.         *       Load string
  568.         *       @return object|FALSE
  569.         *       @param $str string
  570.         **/
  571.         function load($str) {
  572.                 if (!$this->data=@imagecreatefromstring($str))
  573.                         return FALSE;
  574.                 imagesavealpha($this->data,TRUE);
  575.                 $this->save();
  576.                 return $this;
  577.         }
  578.  
  579.         /**
  580.         *       Instantiate image
  581.         *       @param $file string
  582.         *       @param $flag bool
  583.         *       @param $path string
  584.         **/
  585.         function __construct($file=NULL,$flag=FALSE,$path=NULL) {
  586.                 $this->flag=$flag;
  587.                 if ($file) {
  588.                         $fw=Base::instance();
  589.                         // Create image from file
  590.                         $this->file=$file;
  591.                         if (!isset($path))
  592.                                 $path=$fw->get('UI').';./';
  593.                         foreach ($fw->split($path,FALSE) as $dir)
  594.                                 if (is_file($dir.$file))
  595.                                         return $this->load($fw->read($dir.$file));
  596.                         user_error(self::E_File,E_USER_ERROR);
  597.                 }
  598.         }
  599.  
  600.         /**
  601.         *       Wrap-up
  602.         *       @return NULL
  603.         **/
  604.         function __destruct() {
  605.                 if (is_resource($this->data)) {
  606.                         imagedestroy($this->data);
  607.                         $fw=Base::instance();
  608.                         $path=$fw->get('TEMP').$fw->get('SEED').'.'.$fw->hash($this->file);
  609.                         if ($glob=@glob($path.'*.png',GLOB_NOSORT))
  610.                                 foreach ($glob as $match)
  611.                                         if (preg_match('/-(\d+)\.png/',$match))
  612.                                                 @unlink($match);
  613.                 }
  614.         }
  615.  
  616. }
  617.  
单独下载 单独下载image.php源码 - 下载整个fatfree源程序
相关源码/软件:
TSA-Travel-Sentry-master-keys - TSA 主密钥的 3D 再现 2017-05-12
python3-cookbook - 《Python Cookbook》 3rd Edition Translatio 2017-05-12
isso - Disqus 替代 https://posativ.org/isso/ 2017-05-12
hologram - 降价基于文件系统的风格指南。 http://trulia.github.io... 2017-05-12
www.html5rocks.com - .......a 争创一流资源为 web 开发人员 2017-05-12
rolify - Role management library with resource scoping ... 2017-05-13
jquery-mockjax - JQuery Mockjax 插件提供了简单、 极其灵活的接口,以嘲笑或模拟 ajax 请求和响应 2017-05-13
yo - CLI 工具运行自耕农发电机 http://yeoman.io 2017-05-13
GrowingTextView - UITextView 增长/收缩与文本并开始滚动时的含量达到一定数量的行。类似于苹果在 SMS 应用... 2017-05-13
phan - 潘是 php 的静态分析器。潘倾向于避免误报,并试图证明不正确,而不是正确性。 2017-05-13
CRYENGINE - CRYENGINE 是由 Crytek 创建一个功能强大的实时游戏开发平台。 ... 2017-06-11
postal - 2017-06-11
reactide - Reactide 是反应 web 应用程序开发的第一个专用的 IDE。http://reactide... 2017-06-11
rkt - rkt 是为 Linux 的 pod 本机容器引擎。它是可组合、 安全和建筑标准。 2017-06-11
uWebSockets - 小小的 Websocket https://forest.webvrexpe... 2017-06-11
realworld - 真实的世界-动力反应、 角、 节点,Django,和更多的模范 fullstack Medium.c... 2017-06-11
goreplay - GoReplay 是用于捕获和重播活 HTTP 交通到测试环境以不断地测试您的系统与实际数据的开源工... 2017-06-10
pyenv - 简单的 Python 版本管理 2017-06-10
redux-saga - Redux 应用程序替代副作用模型 https://redux-saga.g... 2017-06-10
angular-starter - 2017-06-10

 返回顶部