PHP的一个完美GIF等比缩放类,附带去除缩放黑背景

我这里没有判断文件类型,因为png和jpeg缩放后都不会出现黑色背景,就单独gif不行..查了下资料发现了一个完美的解决办法,附带有详解,现在写东西都喜欢封装成类.....大家调用一下就行了..我就不说怎么调用了,代码如下:

  1. <?php
  2. class resize_image{
  3. private $o_img_width;//原图像宽度
  4. private $o_img_height;//原图像高度
  5. private $n_img_width;//新图像宽度
  6. private $n_img_height;//新图像高度
  7. private $o_img_file;//原图像文件
  8. private $o_img_source;//原图像资源
  9. private $n_img_file;//新图像资源
  10. private $n_img_source;//新图像资源
  11. private $o_to_n_per=0.5;//图像缩放比
  12. //初始化内部变量
  13. function __construct($oldfile,$newfile){
  14. list($width,$height)=getimagesize($oldfile);
  15. $this->o_img_file=$oldfile;
  16. $this->o_img_width=$width;
  17. $this->o_img_height=$height;
  18. $this->n_img_file=$newfile;
  19. }
  20. //等比例缩放并且解决GIF透明色为黑色背景的问题
  21. function get_resize_scaling_img(){
  22. $this->n_img_width=$this->o_img_width*$this->o_to_n_per;
  23. $this->n_img_height=$this->o_img_height*$this->o_to_n_per;
  24. //等比例缩放图片(算法)
  25. if ( $this->n_img_width && ( $this->o_img_width <$this->o_img_height))
  26. {
  27. $this->n_img_width = ( $this->n_img_height/$this->o_img_height) * $this->o_img_width;
  28. }
  29. else
  30. {
  31. $this->n_img_height = ($this->n_img_width / $this->o_img_width) * $this->o_img_height;
  32. }
  33. $this->o_img_source=imagecreatefromgif($this->o_img_file);
  34. //创建一个等比例缩放大小的画布
  35. $this->n_img_source=imagecreatetruecolor($this->o_img_width,$this->n_img_height);
  36. //美化:去除黑色不透明背景
  37. $trans_init=imagecolortransparent($this->o_img_source);
  38. //寻找透明色并且判断是否在总颜色中
  39. if($trans_init>=0 && $trans_init < imagecolorstotal($this->o_img_source)){
  40. //如果在的话则搜索这个颜色的RGB色相
  41. $trans_index=imagecolorsforindex($this->o_img_source,$trans_init);
  42. //找到之后就创建这样一个颜色
  43. $trans_new=imagecolorallocate($this->n_img_source,$trans_index["red"],$trans_index["green"],$trans_index["blue"]);
  44. //然后我们用这个颜色去填充新的图像
  45. imagefill($this->n_img_source,0,0,$trans_new);
  46. //然后我们在把填充色设置为透明
  47. imagecolortransparent($this->n_img_source,$trans_new);
  48. }
  49. //拷贝原图像到新画板上
  50. imagecopyresized($this->n_img_source,$this->o_img_source,0,0,0,0,$this->n_img_width,$this->n_img_height,$this->o_img_width,$this->o_img_height);
  51. return $this->n_img_source;
  52. }
  53. //最终销毁资源
  54. function __destruct(){
  55. imagedestroy($this->o_img_source);
  56. imagedestroy($this->n_img_source);
  57. }
  58. }

说明:因为先前没想那么多所以声明了很多私有的内部变量以便调用...程序看起来很笨拙啊......