ホームページ  >  記事  >  バックエンド開発  >  よく使用される PHP 画像処理クラス_PHP チュートリアル

よく使用される PHP 画像処理クラス_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:49:471004ブラウズ

よく使われるPHP画像処理クラス

この記事は主によく使われる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 );

}

以上がこの記事の全内容ですが、皆さんに気に入っていただければ幸いです。

www.bkjia.com本当http://www.bkjia.com/PHPjc/1018926.html技術記事一般的に使用される PHP 画像処理クラス この記事では、主に 2 つの一般的に使用される PHP 画像処理クラス (透かし、比例拡大縮小、高さと幅の固定) をまとめて紹介します。これは非常にシンプルで実用的です。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。