调整PHP图像下载脚本以重命名和调整大小

时间:2011-03-30 11:44:40

标签: php image curl download

我使用这个伟大的脚本用于较旧的项目下载用于电影评论网站的图像。我如何调整它以便能够将图像保存为动态生成的名称,并将其调整为60px x 60px?谢谢!

$img[]='http://site.com/img.150x150.jpg';
foreach($img as $i){
    save_image($i);
    if(getimagesize(basename($i))){
        echo 'Image ' . basename($i) . ' Downloaded OK';
    }else{
        echo 'Image ' . basename($i) . ' Download Failed';
    }
}
function save_image($img,$fullpath='basename'){
    if($fullpath=='basename'){
        $fullpath = basename($img);
    }
    $ch = curl_init ($img);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($fullpath)){
        unlink($fullpath);
    }
    $fp = fopen($fullpath,'x');
    fwrite($fp, $rawdata);
    fclose($fp);
}

3 个答案:

答案 0 :(得分:0)

查看imagecopyresized函数示例。

答案 1 :(得分:0)

将图像保存在缓存等文件夹中。如果您已执行函数save_image(),请执行一个调整图像大小并以新名称保存图像的函数。然后从cache文件夹中删除图像。

答案 2 :(得分:0)

图像缩放器类类

class Process{
    // List of supported image formats.     
    private $valid_ext = array( 'png', 'jpg', 'jpeg', 'gif', 'bmp', 'wbmp' );

    // Whether or not that script should continue
    private $halt = false;

    // Image Configuration array and Source Image
    public $errmsg = "";
    var $image = array();
    var $s_image;

    public function render($source){        
        $this->s_image = $source;  
        //set the image to this class attr for other to be accessible
        //list the image height and width
        list($this->image['width'], $this->image['height']) = getimagesize($source);  

        //get the image extension       
        $this->image['extension'] = strtolower(preg_replace('/^.*\.([^.]+)$/D', '$1', $this->s_image));
        if (!(in_array( $this->image['extension'], $this->valid_ext))){         
            $this->errmsg = "invalid format";
            $this->halt = true; 
            return false;  //terminate the function if type format is not correct
        }

        //i think mime type should be checked instead of extension 
        //well in that case i will do sometime  

        //create image
        switch($this->image['extension']){
            case 'png';
                $this->image['render'] = imagecreatefrompng( $this->s_image );
                    imagealphablending( $this->image['render'], false );
                    imagesavealpha( $this->image['render'], true );
                break;
            case 'jpg';
                    $this->image['render'] = imagecreatefromjpeg( $this->s_image );
                break;
            case 'jpeg';
                    $this->image['render'] = imagecreatefromjpeg( $this->s_image );
                break;
            case 'gif';
                    $this->image['render'] = imagecreatefromgif( $this->s_image );
                break;
            case 'bmp';
                    $this->image['render'] = imagecreatefromwbmp( $this->s_image );
                break;
            case 'wbmp';
                    $this->image['render'] = imagecreatefromwbmp( $this->s_image );
                break;
            default: 
                    $this->errmsg = "invalid format";
                    $this->halt = true;
                return false;
                break;
        }       
    }

    public function contrain($width, $height){      
        if(!($this->halt)){
            if($this->image['extension'] == 'gif'){
                        $this->image['composite'] = imagecreatetruecolor($width, $height);
                        imagecopyresample($this->image['composite'], $this->image['render'], 0, 0, 0, 0,
                                $width, $height, $this->image['width'], $this->image['height'] );

                        $this->image['colorcount'] = imagecolorstotal( $this->image['render'] );

                        imagetruecolortopalette( $this->image['composite'], true, $this->image['colorcount'] );

                        imagepalettecopy( $this->image['composite'], $this->image['render'] );

                        $this->image['transparentcolor'] = imagecolortransparent( $this->image['render'] );

                        imagefill( $this->image['composite'], 0, 0, $this->image['transparentcolor'] );

                        imagecolortransparent( $this->image['composite'], $this->image['transparentcolor'] );
            } else {

                        $this->image['composite'] = imagecreatetruecolor($width, $height);

                        imagecopyresampled( $this->image['composite'], $this->image['render'], 0, 0, 0, 0, 
                            $width, $height, $this->image['width'], $this->image['height'] );
            }
        }else{
            $this->halt = true;
            $this->errmsg = "Execution halted";
            return false;
        }
    }

    public function proportion($max_width, $max_height){        
        if (!( $this->halt)){

            if($this->image['extension'] == 'gif'){

                $this->image['ratio'] = ( $this->image['width'] > $this->image['height'] ) ? $max_width / $this->image['width'] : $max_height/$this->image['height'];

                if( $this->image['width'] > $max_width || $this->image['height'] > $max_height ) { 
                    $new_width = $this->image['width'] * $this->image['ratio']; 
                    $new_height = $this->image['height'] * $this->image['ratio']; 
                }else{
                    $new_width = $this->image['width']; 
                    $new_height = $this->image['height'];
                }

                $this->image['composite'] = imagecreatetruecolor( $new_width, $new_height );

                imagecopyresampled( $this->image['composite'], $this->image['render'], 0, 0, 0, 0, $new_width, $new_height, $this->image['width'], $this->image['height'] );

                $this->image['colorcount'] = imagecolorstotal( $this->image['render'] );

                imagetruecolortopalette( $this->image['composite'], true, $this->image['colorcount'] );

                imagepalettecopy( $this->image['composite'], $this->image['render'] );

                $this->image['transparentcolor'] = imagecolortransparent( $this->image['render'] );

                imagefill( $this->image['composite'], 0, 0, $this->image['transparentcolor'] );

                imagecolortransparent( $this->image['composite'], $this->image['transparentcolor'] );

            }else{
                $this->image['ratio'] = ( $this->image['width'] > $this->image['height'] ) ? $max_width / $this->image['width'] : $max_height/$this->image['height']; 

                if( $this->image['width'] > $max_width || $this->image['height'] > $max_height ) { 

                    $new_width = $this->image['width'] * $this->image['ratio']; 

                    $new_height = $this->image['height'] * $this->image['ratio']; 
                }else{
                    $new_width = $this->image['width']; 

                    $new_height = $this->image['height'];
                } 

                $this->image['composite'] = imagecreatetruecolor( $new_width, $new_height );

                imagecopyresampled( $this->image['composite'], $this->image['render'], 0, 0, 0, 0, $new_width, $new_height, $this->image['width'], $this->image['height'] );
            }
        } else {
                $this->errmsg = "Execution halted";
            $this->halt = true;
            return false;
        }       
    }

    public function output($quality = 100){     
        if(!(is_numeric($quality))){
            $quality = 100;
        }
        if(!($this->halt)){
            switch($this->image['extension']){
            case 'png';
                header('Content-Type: image/png');
                imagepng($this->image['composite'], null, null );
                break;
            case 'jpg';
                header('Content-Type: image/jpeg');
                imagejpeg($this->image['composite'], null, $quality);
                break;
            case 'jpeg';
                header( 'Content-Type: image/jpeg' );
                imagejpeg($this->image['composite'], null, $quality);
                break;
            case 'gif';
                header( 'Content-Type: image/gif' );
                imagegif($this->image['composite'], null, $quality);
                break;
            case 'bmp';
                header('Content-Type: image/wbmp' );
                imagewbmp($this->image['composite'], null, null);
                break;
            case 'wbmp';
                header('Content-Type: image/wbmp' );
                imagewbmp($this->image['composite'], null, null);
                break;
            default: 
                $this->errmsg = "invalid format";
                return false;
                break;
            }
        }else{
            $this->errmsg = "Execution halted";
            return false;
        }
    }

    public function saveto($destination, $filename, $quality = 100){        
        if(!(is_numeric($quality))){
            $quality = 100;
        }
        if(!($this->halt)){
            switch($this->image['extension']){
            case 'png';
                imagepng($this->image['composite'],  $destination.DIRECTORY_SEPARATOR.$filename, null);
                break;
            case 'jpg';
                imagejpeg($this->image['composite'], $destination.DIRECTORY_SEPARATOR.$filename, $quality );
                break;
            case 'jpeg';
                imagejpeg($this->image['composite'], $destination.DIRECTORY_SEPARATOR.$filename, $quality );
                break;
            case 'gif';
                imagegif($this->image['composite'],  $destination.DIRECTORY_SEPARATOR.$filename, $quality );
                break;
            case 'bmp';
                imagewbmp($this->image['composite'], $destination.DIRECTORY_SEPARATOR.$filename, null);
                break;
            case 'wbmp';
                imagewbmp($this->image['composite'], $destination.DIRECTORY_SEPARATOR.$filename, null);
                break;
            default: 
                $this->errmsg = "invalid format";
                return false;
                break;
            }
        }else{
            $this->errmsg = "Execution halted";
            return false;
        }
    }

    public function clear_cache(){
        imagedestroy( $this->image['composite'] );
        imagedestroy( $this->image['render'] );
        unset($this->image);
        unset($this->s_image);
        $this->halt = false;
    }
}

使用

$process = new Process();

$process->render($filepath);

$process->proportion($width, $height);

$process->saveto($upload_path, $filename, $quality); //$quality is in %