来自 计算机编程 2019-12-29 05:22 的文章
当前位置: 澳门威尼斯人平台 > 计算机编程 > 正文

运用PHP生成图片的缩略图的措施

功能:支持jpg,jpeg,gif,png,bmp图片格式,支持按原图片的比例进行缩放,可以选择在图片缩放的过程中是否需要对图片进行裁切,加入了图片质量控制,可以实现缩略图片质量最高化。完整类的代码如下:

本文实例讲述了PHP批量生成图片缩略图的方法。分享给大家供大家参考。具体如下:

1.开始

复制代码 代码如下:

php/** * 功能:php生成缩略图片的类 */ class ResizeImage{ public $type;//图片类型 public $width;//实际宽度 public $height;//实际高度 public $resize_width;//改变后的宽度 public $resize_height;//改变后的高度 public $cut;//是否裁图 public $srcimg;//源图象 public $dstimg;//目标图象地址 public $im;//临时创建的图象 public $quality;//图片质量 function resizeimage($img,$wid,$hei,$c,$dstpath,$quality=100){ $this-srcimg=$img; $this-resize_width=$wid; $this-resize_height=$hei; $this-cut=$c; $this-quality=$quality; $this-type=strtolower(substr(strrchr($this-srcimg,'.'),1));//图片的类型 $this-initi_img();//初始化图象 $this - dst_img($dstpath);//目标图象地址 @$this-width=imagesx($this-im); @$this-height=imagesy($this-im); $this-newimg();//生成图象 @ImageDestroy($this-im); } function newimg(){ $resize_ratio=($this-resize_width)/($this-resize_height);//改变后的图象的比例 @$ratio=($this-width)/($this-height);//实际图象的比例 if(($this-cut)=='1'){//裁图 if($img_func==='imagepng'&&(str_replace('.','',PHP_VERSION)=512)){ //针对php版本大于5.12参数变化后的处理情况 $quality=9; } if($ratio=$resize_ratio){//高度优先 $newimg=imagecreatetruecolor($this-resize_width,$this-resize_height); imagecopyresampled($newimg,$this-im,0,0,0,0,$this-resize_width,$this-resize_height,(($this-height)*$resize_ratio),$this-height); imagejpeg($newimg,$this-dstimg,$this-quality); } if($ratio$resize_ratio){//宽度优先 $newimg=imagecreatetruecolor($this-resize_width,$this-resize_height); imagecopyresampled($newimg,$this-im,0,0,0,0,$this-resize_width,$this-resize_height,$this-width,(($this-width)/$resize_ratio)); imagejpeg($newimg,$this-dstimg,$this-quality); } }else{//不裁图 if($ratio=$resize_ratio){ $newimg=imagecreatetruecolor($this-resize_width,($this-resize_width)/$ratio); imagecopyresampled($newimg,$this-im,0,0,0,0,$this-resize_width,($this-resize_width)/$ratio,$this-width,$this-height); imagejpeg($newimg,$this-dstimg,$this-quality); } if($ratio$resize_ratio){ @$newimg=imagecreatetruecolor(($this-resize_height)*$ratio,$this-resize_height); @imagecopyresampled($newimg,$this-im,0,0,0,0,($this-resize_height)*$ratio,$this-resize_height,$this-width,$this-height); @imagejpeg($newimg,$this-dstimg,$this-quality); } } } function initi_img(){//初始化图象 if($this-type=='jpg' || $this-type=='jpeg'){ $this-im=imagecreatefromjpeg($this-srcimg); } if($this-type=='gif'){ $this-im=imagecreatefromgif($this-srcimg); } if($this-type=='png'){ $this-im=imagecreatefrompng($this-srcimg); } if($this-type=='wbm'){ @$this-im=imagecreatefromwbmp($this-srcimg); } if($this-type=='bmp'){ $this-im=$this-ImageCreateFromBMP($this-srcimg); } } function dst_img($dstpath){//图象目标地址 $full_length=strlen($this-srcimg); $type_length=strlen($this-type); $name_length=$full_length-$type_length; $name=substr($this-srcimg,0,$name_length-1); $this-dstimg=$dstpath; //echo $this-dstimg; } function ImageCreateFromBMP($filename){ //自定义函数处理bmp图片 if(!$f1=fopen($filename,"rb"))returnFALSE; $FILE=unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset",fread($f1,14)); if($FILE['file_type']!=19778)returnFALSE; $BMP=unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'. '/Vcompression/Vsize_bitmap/Vhoriz_resolution'. '/Vvert_resolution/Vcolors_used/Vcolors_important',fread($f1,40)); $BMP['colors']=pow(2,$BMP['bits_per_pixel']); if($BMP['size_bitmap']==0)$BMP['size_bitmap']=$FILE['file_size']-$FILE['bitmap_offset']; $BMP['bytes_per_pixel']=$BMP['bits_per_pixel']/8; $BMP['bytes_per_pixel2']=ceil($BMP['bytes_per_pixel']); $BMP['decal']=($BMP['width']*$BMP['bytes_per_pixel']/4); $BMP['decal']-=floor($BMP['width']*$BMP['bytes_per_pixel']/4); $BMP['decal']=4-(4*$BMP['decal']); if($BMP['decal']==4)$BMP['decal']=0; $PALETTE=array(); if($BMP['colors']16777216) { $PALETTE=unpack('V'.$BMP['colors'],fread($f1,$BMP['colors']*4)); } $IMG=fread($f1,$BMP['size_bitmap']); $VIDE=chr(0); $res=imagecreatetruecolor($BMP['width'],$BMP['height']); $P=0; $Y=$BMP['height']-1; while($Y=0) { $X=0; while($X$BMP['width']) { if($BMP['bits_per_pixel']==24) $COLOR=unpack("V",substr($IMG,$P,3).$VIDE); elseif($BMP['bits_per_pixel']==16) { $COLOR=unpack("n",substr($IMG,$P,2)); $COLOR[1]=$PALETTE[$COLOR[1]+1]; } elseif($BMP['bits_per_pixel']==8) { $COLOR=unpack("n",$VIDE.substr($IMG,$P,1)); $COLOR[1]=$PALETTE[$COLOR[1]+1]; } elseif($BMP['bits_per_pixel']==4) { $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1)); if(($P*2)%2==0)$COLOR[1]=($COLOR[1]4);else$COLOR[1]=($COLOR[1]&0x0F); $COLOR[1]=$PALETTE[$COLOR[1]+1]; } elseif($BMP['bits_per_pixel']==1) { $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1)); if(($P*8)%8==0)$COLOR[1]=$COLOR[1]7; elseif(($P*8)%8==1)$COLOR[1]=($COLOR[1]&0x40)6; elseif(($P*8)%8==2)$COLOR[1]=($COLOR[1]&0x20)5; elseif(($P*8)%8==3)$COLOR[1]=($COLOR[1]&0x10)4; elseif(($P*8)%8==4)$COLOR[1]=($COLOR[1]&0x8)3; elseif(($P*8)%8==5)$COLOR[1]=($COLOR[1]&0x4)2; elseif(($P*8)%8==6)$COLOR[1]=($COLOR[1]&0x2)1; elseif(($P*8)%8==7)$COLOR[1]=($COLOR[1]&0x1); $COLOR[1]=$PALETTE[$COLOR[1]+1]; } else returnFALSE; imagesetpixel($res,$X,$Y,$COLOR[1]); $X++; $P+=$BMP['bytes_per_pixel']; } $Y--; $P+=$BMP['decal']; } fclose($f1); return$res; } }
dir=$olddir ? $olddir : "./images/temp";
   $this->newdir=$newdir ? $newdir : "./images/s";
  }
  function reNames($src)
  {
   $md5file=substr(md5($src),10,10).strrchr($src,".");
   //MD5文件名后(例如:3293okoe.gif)
   $md5file=$this->w."_".$this->h."_".$md5file;
   //处理后文件名
   return $this->newdir."/".$md5file;
   //将源图片,MD5文件名后保存到新的目录里
  }
  function Mini($src,$w,$h,$q=80)
  //生成缩略图 Mini(图片地址, 宽度, 高度, 质量)
  {
   $this->src=$src;
   $this->w=$w;
   $this->h=$h;
   if(strrchr($src,".")==".gif" && $this->regif==0)
   //是否处理GIF图
   {
    return $this->src;
   }
   if($this->keep==0) //是否保留源文件,默认不保留
   {
    $newsrc=$this->reNames($src); //改名后的文件地址
   }
   else     //保持原名
   {
    $src=str_replace("\","/",$src);
    $newsrc=$this->newdir.strrchr($src,"/");
   }
   if(file_exists($newsrc) && $this->over==0)
   //如果已存在,直接返回地址
   {
    return $newsrc;
   }
   if(strstr($src,"http://") && !strstr($src,$_SERVER['HTTP_HOST']))
   //如果是网络文件,先保存
   {
    $src=$this->getimg($src);
   }
   $arr=getimagesize($src); //获取图片属性
   $width=$arr[0];
   $height=$arr[1];
   $type=$arr[2];
   switch($type)
   {
    case 1:  //1 = GIF,
     $im=imagecreatefromgif($src);
     break;
    case 2:  //2 = JPG
     $im=imagecreatefromjpeg($src);
     break;
    case 3:  //3 = PNG
     $im=imagecreatefrompng($src);
     break;
    default:
     return 0;
   }
   //处理缩略图
   $nim=imagecreatetruecolor($w,$h);
   $k1=round($h/$w,2);
   $k2=round($height/$width,2);
   if($k1newdir))
   {
    mkdir($this->newdir);
   }
   switch($type)  //保存图片
   {
    case 1:
     $rs=imagegif($nim,$newsrc);
     break;
    case 2:
     $rs=imagejpeg($nim,$newsrc,$q);
     break;
    case 3:
     $rs=imagepng($nim,$newsrc);
     break;
    default:
     return 0;
   }
   return $newsrc; //返回处理后路径
  }
  function getimg($filename)
  {
   $md5file=$this->dir."/".substr(md5($filename),10,10).strrchr($filename,".");
   if(file_exists($md5file))
   {
    return $md5file;
   }
   //开始获取文件,并返回新路径
   $img=file_get_contents($filename);
   if($img)
   {
    if(!is_dir($this->dir))
    {
     mkdir($this->dir);
    }
    savefile($md5file,$img);
    return $md5file;
   }
  }
  function reImg($src,$w,$h,$q)
  //转换缩略图(文件名和结构不变)
  {
   $this->keep=1;
   return $this->Mini($src,$w,$h,$q);
   //return 生成的地址
  }
 }
 $image=new image();
 echo $image->reImg("images/zht.jpg",75,75,80);
 echo "
";
 echo $image->reImg("images/m8920.jpg",75,75,80);
 echo "
";
 echo $image->getimg("./images/s/zht.jpg");
?>

在网站上传图片过程,经常用到缩略图功能。这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图。

//定义缩略图片尺寸 $picSize = array(
              '100_100'=> 1,
              '200_100'=> 1
           );
$imagePath = "../image/";
function parseUrl($url){
   preg_match("/(?P[wd]+)_w(?Pd+)_h(?Pd+).(?Pw+)/",$url,$match);
   return $match;
}
$urlArr = explode("/",$_SERVER['REQUEST_URI']);
$imgName = $urlArr[count($urlArr)-1];
$picInfo = parseUrl($imgName);
//错误尺寸 if(empty($picInfo['width']) || empty($picInfo['height']) ||
!array_key_exists($picInfo['width'].'_'.$picInfo['height'],$picSize)) die('不存在该尺寸图片');
$originalPic = $imagePath.$picInfo['name'].'/'.$picInfo['name'].'.'.$picInfo['ext'];
//原始图不存在 if(!file_exists($originalPic)) die("图片不存在!");
/**
 *等比例压缩图片  */
switch($picInfo['ext']){
   case 'jpg':
      $orgImg = ImageCreateFromJpeg($originalPic);
      break;
   default:
      break;
}
$owidth  =  ImageSX($orgImg); //原始尺寸 $oheight =  ImageSY($orgImg);
$tW = $picInfo['width'];
$tH = $picInfo['height'];
//获取缩略图尺寸 if($owidth/$oheight > $tW/$tH){
    $tH = intval($tW * $oheight/$owidth);
}else{
     $tW = intval($tH * $owidth/$oheight);
}
//生成背景图 $new_img = ImageCreateTrueColor($picInfo['width'], $picInfo['height']);
$bgColor = imagecolorallocate($new_img,255,255,255);
if (!@imagefilledrectangle($new_img, 0, 0, $picInfo['width']-1, $picInfo['height']-1, $bgColor)) {
    echo "无法创建背景图";  //@todo记录日志
    exit(0);
}
if (!@imagecopyresampled($new_img, $orgImg, ($picInfo['width']-$tW)/2, ($picInfo['height']-$tH)/2, 0, 0, $tW, $tH, $owidth, $oheight)) {
    echo "生成图片失败";
    exit(0);
}
//生成图片 ob_start();
imagejpeg($new_img);
$_newImg = ob_get_contents();
ob_end_clean();
file_put_contents($imagePath.$picInfo['name']."/".$imgName, $_newImg);
header("Content-type:image/jpeg; charset=utf-8");
imagejpeg($new_img);
?>

使用方法很简单代码如下:

希望本文所述对大家的php程序设计有所帮助。

2.如何生成缩略图

使用时候绑定apache conf 的 documentError 404 的handler 为此文件。。

$resizeimage=new ResizeImage('upload/abc.bmp', '120', '90', '0', 'upload/xabc.bmp');

生成缩略图,关键的是如何计算缩放比率。

另外一个强大的PHP图片缩略图类:phpThumb

这里,我根据图片等比缩放,宽高的几种常见变化,得出一个算缩放比率算法是,使用新图(即缩略图)的宽高,分别除以原图的宽高,看哪个值大,就取它作为缩放比率:

该类除了缩放图片外,还能将图片转换成不同的格式输出,其特色功能还包括色彩、特效等

缩放比率  = Max( { 新图高度  / 原图高度 ,  新图宽度  / 原图宽度 } )

官方网址:

也就是:

We'll be using phpThumb , the open source PHP script to generate thumbnails on the fly.

If ( (新图高度  / 原图高度)  >  (新图宽度  / 原图宽度 ) )  {

Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

缩放比率 =  新图高度  / 原图高度;

 img src=”phpThumb.phpsrc=test.jpg&w=200&h=150&fltr[]=ric|20|20&f=png” / Adjust the path to phpThumb according to where you place the phpThumb files. html head /head body img src="phpThumb/phpThumb.phpsrc=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC" alt="图片 1" /body /html

}ELSE {

一般只需要下面的文件就可以了

缩放比率 =  新图宽度 / 原图宽度;

其实phpThumb的功能比我原先想象的要强大一些,下面把他的其他一些有用的参数列一下:

}

src:目标图片的地址

这里列出场景的图片缩放场景,及处理方法:

本文由澳门威尼斯人平台发布于计算机编程,转载请注明出处:运用PHP生成图片的缩略图的措施

关键词: