この記事では、画像のズーム、カット、フォトフレーム、ウォーターマーク、シャープ、回転、反転、透明化、反転などを実現できる、PHPで実装された一般的な画像処理クラスを中心に紹介します。色やその他の機能には特定の基準値があり、必要な友達はそれを参照できます
この記事の例では、PHP によって実装される一般的な画像処理クラスについて説明します。参考のためにみんなで共有してください。詳細は以下の通りです
画像処理機能機能:ズーム、カット、フォトフレーム、ウォーターマーク、シャープ、回転、反転、透明度、色反転、処理と履歴の保存アイデア:写真が変更されたときに新しい写真を自動的に生成し、名前を付ける追加を検討できます元の画像に基づくステップ (例: 画像名 + __ 番目のステップ)。 高度な画像処理機能を必要とする一部の Web アプリケーションでは、このクラスを参照できます。
?
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 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 |
クラス写真 { var $PICTURE_URL;//処理される画像 var $DEST_URL="temp__01.jpg";//ターゲット画像の場所を生成します var $PICTURE_CREATE;//作成される画像 var $TURE_COLOR;//新しいトゥルーカラー画像を作成します var $PICTURE_WIDTH; //元の画像の幅 var $PICTURE_HEIGHT;//元の画像の高さ /* 透かしのタイプ、デフォルトは透かしテキストです */ var $MARK_TYPE=1; var $WORD;//UTF-8以降のテキスト var $WORD_X //テキストの横軸 var $WORD_Y //テキストの座標 var $FONT_TYPE;//フォントタイプ var $FONT_SIZE="12";//フォントサイズ var $FONT_WORD;//テキスト var $ANGLE=0;//テキストの角度、デフォルトは 0 です var $FONT_COLOR="#000000";//テキストの色 var $FONT_PATH="font/simkai.ttf";//フォント ライブラリ、デフォルトは宋朝です var $FORCE_URL;//透かし画像 var $FORCE_X=0; //ウォーターマークの横座標 var $FORCE_Y=0;//透かしの垂直座標 var $FORCE_START_X=0;//透かし画像の横軸を切り取る var $FORCE_START_Y=0;//透かし付き画像の縦軸をカットします var $PICTURE_TYPE;//画像タイプ var $PICTURE_MIME;//出力ヘッダー /* 拡大縮小率が1の場合、拡大縮小の高さと幅に従って拡大縮小します */ var $ZOOM=1;//ズームタイプ var $ZOOM_MULTIPLE;//ズーム率 var $ZOOM_WIDTH;//ズーム幅 var $ZOOM_HEIGHT;//ズームの高さ /* 長さと幅を比例的に固定してトリミング */ var $CUT_TYPE=1;//カットタイプ var $CUT_X=0;//トリミングの横座標 var $CUT_Y=0;//トリミングの垂直座標 var $CUT_;//カット幅 var $CUT_HEIGHT=100 //切断高さ ;/* 研ぐ */ var $SHARP="7.0";//シャープ度 /* 透明加工 */ var $ALPHA='100' //透明度は 0 ~ 127 です var $ALPHA_X="90"; var $ALPHA_Y="50"; /* 任意の角度で回転 */ var $CIRCUMROTATE="90.0";//浮動小数点数である必要があることに注意してください /* エラーメッセージ */ var $ERROR=配列( 'unalviable'=>'関連する写真が見つかりません!' ); /* コンストラクター: 関数の初期化 */ 関数 __construct($PICTURE_URL) { $this->get_info($PICTURE_URL); } 関数 get_info($PICTURE_URL) { /* 元の画像の情報を処理し、最初に画像が存在するかどうかを確認し、存在しない場合は、対応する情報が提供されます */ @$SIZE=getimagesize($PICTURE_URL); if(!$SIZE) { exit($this->ERROR['unalviable']); } //元の画像の情報の種類、幅、高さを取得します $this->PICTURE_MIME=$SIZE['mime']; $this->PICTURE_; $this->PICTURE_HEIGHT=$SIZE[1]; //画像を作成します スイッチ($SIZE[2]) { ケース1: $this->PICTURE_CREATE=imagecreatefromgif($PICTURE_URL); $this->PICTURE_TYPE="imagejpeg"; $this->PICTURE_EXT="jpg"; 休憩; ケース2: $this->PICTURE_CREATE=imagecreatefromjpeg($PICTURE_URL); $this->PICTURE_TYPE="imagegif"; $this->PICTURE_EXT="gif"; 休憩; ケース 3: $this->PICTURE_CREATE=imagecreatefrompng($PICTURE_URL); $this->PICTURE_TYPE="imagepng"; $this->PICTURE_EXT="png"; 休憩; } /* テキストの色を16進数から10進数に変換します */ preg_match_all("/([0-f]){2,2}/i",$this->FONT_COLOR,$MATCHES); if(count($MATCHES)==3) { $this->RED=hexdec($MATCHES[0][0]); $this->GREEN=hexdec($MATCHES[0][1]); $this->BLUE=hexdec($MATCHES[0][2]); } } //__construct の終了 /* 16進数の色を10進数(R、G、B)に変換します */ 関数 hex2dec() { preg_match_all("/([0-f]){2,2}/i",$this->FONT_COLOR,$MATCHES); if(count($MATCHES)==3) { $this->RED=hexdec($MATCHES[0][0]); $this->GREEN=hexdec($MATCHES[0][1]); $this->BLUE=hexdec($MATCHES[0][2]); } } //ズームタイプ 関数zoom_type($ZOOM_TYPE) { $this->ZOOM=$ZOOM_TYPE; } //画像を拡大縮小します。高さと幅が指定されていない場合は拡大縮小されます 関数zoom() { //ズームサイズ if($this->ZOOM==0) { $this->ZOOM_;gt;PICTURE_WIDTH * $this->ZOOM_MULTIPLE; $this->ZOOM_HEIGHT=$this->PICTURE_HEIGHT * $this->ZOOM_MULTIPLE; } //新しいトゥルーカラー画像を作成します $this->TRUE_COLOR=imagecreatetruecolor($this->ZOOM_WIDTH,$this->ZOOM_HEIGHT); $WHITE=imagecolorallocate($this->TRUE_COLOR,255,255,255); imagefilledrectangle($this->TRUE_COLOR,0,0,$this->ZOOM_WIDTH,$this->ZOOM_HEIGHT,$WHITE); imagecopyresize($this->TRUE_COLOR,$this->PICTURE_CREATE,0,0,0,0,$this->ZOOM_WIDTH,$this->ZOOM_HEIGHT,$this->PICTURE_WIDTH,$this-> ;PICTURE_HEIGHT); } //ズーム終了 //座標に従って、または自動的に画像をトリミングします ファンクションカット() { $this->TRUE_COLOR=imagecreatetruecolor($this->CUT_WIDTH,$this->CUT_WIDTH); imagecopy($this->TRUE_COLOR,$this->PICTURE_CREATE, 0, 0, $this->CUT_X, $this->CUT_Y,$this->CUT_WIDTH,$this->CUT_HEIGHT); } //カット終了 /* 写真の上にテキストや写真を入れます 透かしテキスト */ 関数_mark_text() { $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); $this->WORD=mb_convert_encoding($this->FONT_WORD,'utf-8','gb2312'); /* TrueType フォントを使用してテキストの範囲を取得します */ $TEMP = imagettfbbox($this->FONT_SIZE,0,$this->FONT_PATH,$this->WORD); $WORD_LENGTH=strlen($this->WORD); $WORD_WIDTH =$TEMP[2] - $TEMP[6]; $WORD_HEIGHT =$TEMP[3] - $TEMP[7]; /* テキスト透かしのデフォルトの位置は右下隅です */ if($this->WORD_X=="") { $this->WORD_X=$this->PICTURE_WIDTH-$WORD_WIDTH; } if($this->WORD_Y=="") { $this->WORD_Y=$this->PICTURE_HEIGHT-$WORD_HEIGHT; } imagesettile($this->TRUE_COLOR,$this->PICTURE_CREATE); imagefilledrectangle($this->TRUE_COLOR,0,0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT,IMG_COLOR_TILED); $TEXT2=imagecolorallocate($this->TRUE_COLOR,$this->RED,$this->GREEN,$this->Blue); imagettftext($this->TRUE_COLOR,$this->FONT_SIZE,$this->ANGLE,$this->WORD_X,$this->WORD_Y,$TEXT2,$this->FONT_PATH,$this ->単語); } /* 透かし写真 */ 関数_mark_picture() { /* 透かし画像に関する情報を取得する */ @$SIZE=getimagesize($this->FORCE_URL); if(!$SIZE) { exit($this->ERROR['unalviable']); } $FORCE_PICTURE_; $FORCE_PICTURE_HEIGHT=$SIZE[1]; //透かし画像を作成する スイッチ($SIZE[2]) { ケース1: $FORCE_PICTURE_CREATE=imagecreatefromgif($this->FORCE_URL); $FORCE_PICTURE_TYPE="gif"; 休憩; ケース2: $FORCE_PICTURE_CREATE=imagecreatefromjpeg($this->FORCE_URL); $FORCE_PICTURE_TYPE="jpg"; 休憩; ケース 3: $FORCE_PICTURE_CREATE=imagecreatefrompng($this->FORCE_URL); $FORCE_PICTURE_TYPE="png"; 休憩; } /* ウォーターマーク画像のサイズを決定し、ターゲット画像のサイズを生成します。ウォーターマークが画像より大きい場合、生成される画像のサイズはウォーターマーク画像のサイズになります。それ以外の場合、生成される画像のサイズは元の画像サイズになります。 */ $this->NEW_PICTURE=$this->PICTURE_CREATE; if($FORCE_PICTURE_WIDTH>$this->PICTURE_WIDTH) { $CREATE_;gt;FORCE_START_X; } その他 { $CREATE_;gt;PICTURE_WIDTH; } if($FORCE_PICTURE_HEIGHT>$this->PICTURE_HEIGHT) { $CREATE_HEIGHT=$FORCE_PICTURE_HEIGHT-$this->FORCE_START_Y; } その他 { $CREATE_HEIGHT=$this->PICTURE_HEIGHT; } /* キャンバスを作成する */ $NEW_PICTURE_CREATE=imagecreatetruecolor($CREATE_WIDTH,$CREATE_HEIGHT); $WHITE=imagecolorallocate($NEW_PICTURE_CREATE,255,255,255); /* 背景画像をキャンバスにコピーします */ imagecopy($NEW_PICTURE_CREATE, $this->PICTURE_CREATE, 0, 0, 0, 0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); /* 対象画像を背景画像にコピー */ imagecopy($NEW_PICTURE_CREATE, $FORCE_PICTURE_CREATE, $this->FORCE_X, $this->FORCE_Y, $this->FORCE_START_X, $this->FORCE_START_Y,$FORCE_PICTURE_WIDTH,$FORCE_PICTURE_HEIGHT); $this->TRUE_COLOR=$NEW_PICTURE_CREATE; } //マークの終わり 関数 alpha_() { $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); $rgb="#CDCDCD"; $tran_color="#000000"; for($j=0;$j { ($i=0;$iPICTURE_WIDTH-1;$i++) の場合 { $rgb = imagecolorat($this->PICTURE_CREATE,$i,$j); $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $now_color=imagecolorallocate($this->PICTURE_CREATE,$r,$g,$b); if ($now_color==$tran_color) { 続き; } その他 { $color=imagecolorallocatealpha($this->PICTURE_CREATE,$r,$g,$b,$ALPHA); imagesetpixel($this->PICTURE_CREATE,$ALPHA_X+$i,$ALPHA_Y+$j,$color); } $this->TRUE_COLOR=$this->PICTURE_CREATE; } } } /* 画像の回転: Y軸に沿って回転 */ 関数turn_y() { $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); for ($x = 0; $x PICTURE_WIDTH; $x++) { imagecopy($this->TRUE_COLOR, $this->PICTURE_CREATE, $this->PICTURE_WIDTH - $x - 1, 0, $x, 0, 1, $this->PICTURE_HEIGHT); } } /* 沿X轴旋转 */ 関数turn_x() { $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); for ($y = 0; $y PICTURE_HEIGHT; $y++) { imagecopy($this->TRUE_COLOR, $this->PICTURE_CREATE, 0, $this->PICTURE_HEIGHT - $y - 1, 0, $y, $this->PICTURE_WIDTH, 1); } } /* 任意角度旋转 */ 関数turn() { $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); imageCopyResize($this->TRUE_COLOR,$this->PICTURE_CREATE,0,0,0,0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT,$this->PICTURE_WIDTH,$this-> ;PICTURE_HEIGHT); $WHITE=imagecolorallocate($this->TRUE_COLOR,255,255,255); $this->TRUE_COLOR=imagerotate ($this->TRUE_COLOR, $this->CIRCUMROTATE, $WHITE); } /* 写真锐化 */ 関数シャープ() { $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); $cnt=0; for ($x=0; $xPICTURE_WIDTH; $x++) { for ($y=0; $yPICTURE_HEIGHT; $y++) { $src_clr1 = imagecolorsforindex($this->TRUE_COLOR, imagecolorat($this->PICTURE_CREATE, $x-1, $y-1)); $src_clr2 = imagecolorsforindex($this->TRUE_COLOR, imagecolorat($this->PICTURE_CREATE, $x, $y)); $r = intval($src_clr2["red"]+$this->SHARP*($src_clr2["red"]-$src_clr1["red"])); $g = intval($src_clr2["green"]+$this->SHARP*($src_clr2["green"]-$src_clr1["green"])); $b = intval($src_clr2["blue"]+$this->SHARP*($src_clr2["blue"]-$src_clr1["blue"])); $r = min(255, max($r, 0)); $g = min(255, max($g, 0)); $b = min(255, max($b, 0)); if (($DST_CLR=imagecolorexact($this->PICTURE_CREATE, $r, $g, $b))==-1) $DST_CLR = imagecolorallocate($this->PICTURE_CREATE, $r, $g, $b); $cnt++; if ($DST_CLR==-1) die("$x, $y ($cnt) でカラー割り当てに失敗しました。"); imagesetpixel($this->TRUE_COLOR, $x, $y, $DST_CLR); } } } /* 图片反色処理?? */ 関数 return_color() { /* 创建一画布 */ $NEW_PICTURE_CREATE=imagecreate($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); $WHITE=imagecolorallocate($NEW_PICTURE_CREATE,255,255,255); /* 将背景画像を画布中に */ imagecopy($NEW_PICTURE_CREATE, $this->PICTURE_CREATE, 0, 0, 0, 0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); $this->TRUE_COLOR=$NEW_PICTURE_CREATE; } /* 目标图片并表示を生成 */ 関数 show() { // 判断浏览器,若是IE就不送头 if(isset($_SERVER['HTTP_USER_AGENT'])) { $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); if(!preg_match('/^.*MSIE.*)$/i',$ua)) { header("Content-type:$this->PICTURE_MIME"); } } $OUT=$this->PICTURE_TYPE; $OUT($this->TRUE_COLOR); } /* 生成目标图片并保存 */ 関数 save_picture() { // JPEG 形式で画像をファイルまたはファイルに出力します $OUT=$this->PICTURE_TYPE; if(function_exists($OUT)) { // ブラウザを決定します。IE の場合、ヘッダーは送信されません if(isset($_SERVER['HTTP_USER_AGENT'])) { $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); if(!preg_match('/^.*MSIE.*)$/i',$ua)) { header("Content-type:$this->PICTURE_MIME"); } } if(!$this->TRUE_COLOR) { exit($this->ERROR['unaviable']); } その他 { $OUT($this->TRUE_COLOR,$this->DEST_URL); $OUT($this->TRUE_COLOR); } } } /* デストラクター: 画像を解放します */ 関数__destruct() { /*写真公開*/ imagedestroy($this->TRUE_COLOR); imagedestroy($this->PICTURE_CREATE); } //授業終了 } ?> |
この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。