PHP を使用して、スケーリング時に黒い背景を削除した完璧な GIF 画像比例スケーリング クラスを作成します
ここではファイル タイプについての判断はありません。png も jpeg もスケーリング後に背景が黒にならないため、gif だけでは機能しません。
情報を確認したところ、詳細な説明が記載された完璧な解決策を見つけました...
最近、私は何かを書くとき、それらをクラスにカプセル化するのが好きです...それらを呼び出す方法については説明しません。
効果は次のとおりです:
<?php class resize_image{ private $o_img_width;//原图像宽度 private $o_img_height;//原图像高度 private $n_img_width;//新图像宽度 private $n_img_height;//新图像高度 private $o_img_file;//原图像文件 private $o_img_source;//原图像资源 private $n_img_file;//新图像资源 private $n_img_source;//新图像资源 private $o_to_n_per=0.5;//图像缩放比 //初始化内部变量 function __construct($oldfile,$newfile){ list($width,$height)=getimagesize($oldfile); $this->o_img_file=$oldfile; $this->o_img_width=$width; $this->o_img_height=$height; $this->n_img_file=$newfile; } //等比例缩放并且解决GIF透明色为黑色背景的问题 function get_resize_scaling_img(){ $this->n_img_width=$this->o_img_width*$this->o_to_n_per; $this->n_img_height=$this->o_img_height*$this->o_to_n_per; //等比例缩放图片(算法) if ( $this->n_img_width && ( $this->o_img_width <$this->o_img_height)) { $this->n_img_width = ( $this->n_img_height/$this->o_img_height) * $this->o_img_width; } else { $this->n_img_height = ($this->n_img_width / $this->o_img_width) * $this->o_img_height; } $this->o_img_source=imagecreatefromgif($this->o_img_file); //创建一个等比例缩放大小的画布 $this->n_img_source=imagecreatetruecolor($this->o_img_width,$this->n_img_height); //美化:去除黑色不透明背景 $trans_init=imagecolortransparent($this->o_img_source); //寻找透明色并且判断是否在总颜色中 if($trans_init>=0 && $trans_init < imagecolorstotal($this->o_img_source)){ //如果在的话则搜索这个颜色的RGB色相 $trans_index=imagecolorsforindex($this->o_img_source,$trans_init); //找到之后就创建这样一个颜色 $trans_new=imagecolorallocate($this->n_img_source,$trans_index["red"],$trans_index["green"],$trans_index["blue"]); //然后我们用这个颜色去填充新的图像 imagefill($this->n_img_source,0,0,$trans_new); //然后我们在把填充色设置为透明 imagecolortransparent($this->n_img_source,$trans_new); } //拷贝原图像到新画板上 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); return $this->n_img_source; } //最终销毁资源 function __destruct(){ imagedestroy($this->o_img_source); imagedestroy($this->n_img_source); } }
説明: 今まであまり考えずに呼び出し用のプライベート内部変数をたくさん宣言してしまいました...プログラムは非常に不格好に見えます...