この記事は主によく使われる2つのPHP画像処理クラス(透かし、比例拡大縮小、高さと幅の固定)をまとめて紹介します。非常にシンプルで実用的です。ダウン
一般的に使用される PHP 画像処理クラス (ウォーターマーク、比例スケーリング、固定高さと幅) を共有します
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
//PHP ウォーターマーク、比例サムネイル、固定高さ、固定幅クラスを追加します。 クラス画像_プロセス{ 公開 $source //元の画像 public $source_width; //元の画像の幅 public $source_height; //元の画像の高さ パブリック $source_type_id; パブリック $orign_name; パブリック $orign_dirname;
//元の画像パスを入力 パブリック関数 __construct($source){ $this->typeList = array(1=>'gif',2=>'jpg',3=>'png'); $ginfo = getimagesize($source); $this->source_width = $ginfo[0]; $this->source_height = $ginfo[1]; $this->source_type_id = $ginfo[2]; $this->orign_url = $source; $this->orign_name = ベース名($source); $this->orign_dirname = ディレクトリ名($source); }
//画像ファイルの形式を決定し、PHPで認識できるエンコーディングを返します パブリック関数 judgeType($type,$source){ if($type == 1){ return imagecreatefromgif($source); //gif }else if($type == 2){ return imagecreatefromjpeg($source) //jpg }else if($type == 3){ return imagecreatefrompng($source) //png }その他{ false を返す; } }
//透かし画像を生成する パブリック関数waterMakeImage($logo){ $linfo = getimagesize($logo); $logo_width = $linfo[0]; $logo_height = $linfo[1]; $logo_type_id = $linfo[2]; $sourceHandle = $this->judgeType($this->source_type_id,$this->orign_url); $logoHandle = $this->judgeType($logo_type_id,$logo); if(!$sourceHandle || !$logoHandle){ false を返す; } $x = ($this->source_width - $logo_width)/2; $y = ($this->source_height - $logo_height)/2; imagecopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_height); $newPic = $this->orign_dirname.'water_'.time().'.'.$this->typeList[$this->source_type_id]; if($this->saveImage($sourceHandle,$newPic)){ imagedestroy($sourceHandle); imagedestroy($logoHandle); } }
//固定高さ宽度 パブリック関数 fixSizeImage($width,$height){ if($width > $this->source_width) $this->source_width; if($height > $this->source_height) $this->source_height; if($width === false){ $width = フロア($this->source_width / ($this->source_height / $height)); } if($height === false){ $height = 床($this->source_height / ($this->source_width / $width)); } $this->tinyImage($width,$height); }
//等比放图片 パブリック関数scaleImage($scale){ $width = Floor($this->source_width * $scale); $height = 床($this->source_height * $scale); $this->tinyImage($width, $height); }
//创建缩略图 パブリック関数 tinyImage($width,$height){ $tinyImage = imagecreatetruecolor($width,$height); $handle = $this->judgeType($this->source_type_id,$this->orign_url); if(function_exists('imagecopyresampled')){ imagecopyresampled($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height); }その他{ imagecopyresize($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height); } $newPic = $this->orign_dirname.'thumb_'.time().'_'.$width."_".$height.".".$this->typeList[$this->source_type_id ]; if($this->saveImage($tinyImage,$newPic)){ imagedestroy($tinyImage); imagedestroy($handle); } } //保存写真 プライベート関数saveImage($image,$url){ if(imagejpeg($image,$url)){ true を返す; } } } $imgHandle = new Image_process('D:AppServwwwtestgetimg14061907445601.jpg'); //$imgHandle->waterMakeImage('D:AppServwwwtestgetimgshougongke.png'); // 水印图片を生成 //$imgHandle->fixSizeImage(200,150); // 固定長さの写真 $imgHandle->scaleImage(0.2); //等比缩放 ?> |
例2:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 |
/** * *画像処理クラス * @著者FC_LAMP * @internal 関数にはウォーターマーク、サムネイルが含まれます */ クラス画像 { //写真格式 private $exts = array ('jpg', 'jpeg', 'gif', 'bmp', 'png' );
/** * * * @throws 例外 */ パブリック関数 __construct() { if (! function_exists ( 'gd_info' )) { 新しい例外をスローします ( '加ダウンロードGD库失败!' ); } }
/** * * 裁剪压缩 * @param $src_img 画像 * @param $save_img 生成後の画像 * @param $option パラメータ选项、含まれるもの: $maxwidth 宽 $maxheight high * 配列('幅'=>xx,'高さ'=>xxx) * @internal * 弊社の一般的な画像圧縮方法で、画像が長すぎるか幅が広すぎる場合に生成される画像です * は「潰れて」しまいます。これに対処するには、まずトリミングしてから比例的に圧縮する方法を使用する必要があります */ パブリック関数thumb_img($src_img, $save_img = '', $option) {
if (空 ( $option ['width'] ) または空 ( $option ['height'] )) { return array ('flag' => False, 'msg' => '元の画像の長さと幅は 0 未満にすることはできません' ); } $org_ext = $this->is_img ( $src_img ); if (! $org_ext ['flag']) { $org_ext を返す; }
//保存パスがある場合は、そのパスが正しいかどうかを判断します if (! 空 ( $save_img )) { $f = $this->check_dir ( $save_img ); if (! $f ['フラグ']) { $f を返す; } }
//対応するメソッドを取得します $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
//元のサイズを取得します $source = $org_funcs ['create_func'] ( $src_img ); $src_w = 画像x ( $source ); $src_h = 画像 ( $source );
//元の画像を調整します(画像の元の形状を維持し、画像をトリミングします) $dst_scale = $option ['height'] / $option ['width'] //ターゲット画像のアスペクト比 ;$src_scale = $src_h / $src_w // 元の画像のアスペクト比 ;if ($src_scale >= $dst_scale) { // 高すぎます $w = 整数 ( $src_w ); $h = intval ( $dst_scale * $w );
$x = 0; $y = ($src_h - $h) / 3; }その他 { // 幅広すぎます $h = 整数 ( $src_h ); $w = intval ( $h / $dst_scale );
$x = ($src_w - $w) / 2; $y = 0; } //カット $croped = imagecreatetruecolor ( $w, $h ); imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h ); //ズーム $scale = $option ['width'] / $w; $target = imagecreatetruecolor ( $option ['width'], $option ['height'] ); $final_w = intval ( $w * $scale ); $final_h = intval ( $h * $scale ); imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h ); imagedestroy ( $croped );
//写真をエクスポート(保存)します if (! 空 ( $save_img )) {
$org_funcs ['save_func'] ( $target, $save_img ); }その他 { ヘッダー ( $org_funcs ['ヘッダー'] ); $org_funcs ['save_func'] ( $target ); } imagedestroy ( $target ); 配列を返す ('flag' => True、'msg' => '' ); }
/** * * 画像を比例的に拡大縮小します * @param $src_img 元画像 * @param $save_img 保存場所 * @param $option パラメータ設定配列('width'=>xx,'height'=>xxx) * */ 関数size_image($src_img, $save_img = '', $option) { $org_ext = $this->is_img ( $src_img ); if (! $org_ext ['flag']) { $org_ext を返す; }
//保存パスがある場合は、そのパスが正しいかどうかを判断します if (! 空 ( $save_img )) { $f = $this->check_dir ( $save_img ); if (! $f ['フラグ']) { $f を返す; } }
//対応するメソッドを取得します $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
//元のサイズを取得します $source = $org_funcs ['create_func'] ( $src_img ); $src_w = 画像x ( $source ); $src_h = 画像 ( $source );
if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height'])) { if ($option ['width'] && $src_w > $option ['width']) { $widthratio = $option ['width'] / $src_w; $resizewidth_tag = true; }
if ($option ['高さ'] && $src_h > $option ['高さ']) { $heightratio = $option ['height'] / $src_h; $resizeheight_tag = true; }
if ($resizewidth_tag && $resizeheight_tag) { if ($widthratio $ratio = $widthratio; その他 $ratio = $heightratio; }
if ($resizewidth_tag && ! $resizeheight_tag) $ratio = $widthratio; if ($resizeheight_tag && ! $resizewidth_tag) $ratio = $heightratio;
$newwidth = $src_w * $ratio; $newheight = $src_h * $ratio;
if (function_exists ( "imagecopyresampled" )) { $newim = imagecreatetruecolor ( $newwidth, $newheight ); imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h ); } 他 { $newim = imagecreate ( $newwidth, $newheight ); imagecopyresize ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h ); } } //出(保存)图片 if (! 空 ( $save_img )) {
$org_funcs ['save_func'] ( $newim, $save_img ); } 他 { ヘッダー ( $org_funcs ['ヘッダー'] ); $org_funcs ['save_func'] ( $newim ); } imagedestroy ( $newim ); 配列を返す ('flag' => True, 'msg' => '' ); }
/** * * 透かし画像を生成します * @param $org_img オリジナル画像 * @param $mark_img 透かし画像 * @param $save_img ディレクトリが存在しない場合、ディレクトリの作成を試みます * @param array $option には、ウォーターマークの基本設定がいくつか含まれています: * x: ウォーターマークの水平位置、デフォルトはウォーターマーク画像の幅を引いた値です * y: ウォーターマークの垂直位置、デフォルトはウォーターマーク画像の高さを引いた値です * alpha: アルファ値 (透明度の制御)、デフォルトは 50 です */ パブリック関数water_mark($org_img, $mark_img, $save_img = '', $option = array()) { //检查写真 $org_ext = $this->is_img ( $org_img ); if (! $org_ext ['flag']) { $org_ext を返す; } $mark_ext = $this->is_img ( $mark_img ); if (! $mark_ext ['flag']) { $mark_ext を返す; } //保存経路がある場合、決定経路が正しいかどうか if (! 空 ( $save_img )) { $f = $this->check_dir ( $save_img ); if (! $f ['フラグ']) { $f を返す; } }
//获取相应画布 $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); $org_img_im = $org_funcs ['create_func'] ( $org_img );
$mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] ); $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );
//採贝水印图片坐标 $mark_img_im_x = 0; $mark_img_im_y = 0; //贝水印图片高宽 $mark_img_w = 画像x ( $mark_img_im ); $mark_img_h = 画像 ( $mark_img_im );
$org_img_w = 画像x ( $org_img_im ); $org_img_h = 画像x ( $org_img_im );
//合成生成点坐标 $x = $org_img_w - $mark_img_w; $org_img_im_x = isset ( $option ['x'] ) ? $オプション ['x'] : $x; $org_img_im_x = ($org_img_im_x > $org_img_w または $org_img_im_x $y = $org_img_h - $mark_img_h; $org_img_im_y = isset ( $option ['y'] ) ? $オプション ['y'] : $y; $org_img_im_y = ($org_img_im_y > $org_img_h または $org_img_im_y
//アルファ $alpha = isset ( $option ['alpha'] ) ? $オプション ['アルファ'] : 50; $alpha = ($alpha > 100 または $alpha
//合并图片 imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha );
//出(保存)图片 if (! 空 ( $save_img )) {
$org_funcs ['save_func'] ( $org_img_im, $save_img ); } 他 { ヘッダー ( $org_funcs ['ヘッダー'] ); $org_funcs ['save_func'] ( $org_img_im ); } //销毁画布 imagedestroy ( $org_img_im ); imagedestroy ( $mark_img_im ); 配列を返す ('flag' => True, 'msg' => '' );
}
/** * * 写真をチェックしてください * @param 不明なタイプ $img_path * @return array('flag'=>true/false、'msg'=>ext/エラーメッセージ) */ プライベート関数 is_img($img_path) { if (! file_exists ( $img_path )) { return array ('flag' => False, 'msg' => "加ダウンロード图片 $img_path 失败!" ); } $ext = 爆発 ( '.', $img_path ); $ext = strto lower ( end ( $ext ) ); if (! in_array ( $ext, $this->exts )) { return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" ); } 配列を返す ('flag' => True, 'msg' => $ext ); }
/** * * 正しい画像関数を返します * @param 不明なタイプ $ext */ プライベート関数get_img_funcs($ext) { //选择 スイッチ ($ext) { ケース「jpg」: $header = 'Content-Type:image/jpeg'; $createfunc = 'imagecreatefromjpeg'; $savefunc = 'imagejpeg'; 休憩; ケース「jpeg」: $header = 'Content-Type:image/jpeg'; $createfunc = 'imagecreatefromjpeg'; $savefunc = 'imagejpeg'; 休憩; ケース「gif」: $header = 'Content-Type:image/gif'; $createfunc = 'imagecreatefromgif'; $savefunc = 'imagegif'; 休憩; ケース「bmp」: $header = 'Content-Type:image/bmp'; $createfunc = 'imagecreatefrombmp'; $savefunc = 'imagebmp'; 休憩; デフォルト: $header = 'Content-Type:image/png'; $createfunc = 'imagecreatefrompng'; $savefunc = 'imagepng'; } return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header ); }
/** * * ディレクトリを確認して作成してみます * @param $save_img */ プライベート関数 check_dir($save_img) { $dir = ディレクトリ名 ( $save_img ); if (! is_dir ( $dir )) { if (! mkdir ( $dir, 0777, true )) { return array ('flag' => False, 'msg' => "图片保存目录 $dir 無法创建!" ); } } 配列を返す ('flag' => True, 'msg' => '' ); } }
if (! 空 ( $_FILES ['test'] ['tmp_name'] )) { //例 $img = 新しい Img (); //オリジナル画像 $name =explode ( '.', $_FILES ['test'] ['name'] ); $org_img = 'D:/test.' .end ( $name ); move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img ); $option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] ); if ($_POST ['type'] == 1) { $s = $img->resize_image ( $org_img, '', $option ); }その他 { $img->thumb_img ( $org_img, '', $option ); } リンクを解除 ( $org_img ); } |
以上がこの記事の全内容ですが、皆さんに気に入っていただければ幸いです。