Tweak a PHP image download script to rename and resize
I used this great script for an older project to download images to use for a movie review site. How can I tweak it to be able to save the image as a dynamically generated name and also resize it to, say 60px x 60px? Thanks!
$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);
}
Image resizer class class
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;
}
}
And usage
$process = new Process();
$process->render($filepath);
$process->proportion($width, $height);
$process->saveto($upload_path, $filename, $quality); //$quality is in %
Take a look at the imagecopyresized function example.
Save the image in a Folder like Cache. If you have performed the function save_image()
, execute a function that resize the image and save the image under a new name. Then you delete the image from the cache
folder.
精彩评论