ホームページ >バックエンド開発 >PHPチュートリアル >画像を異なる仕様の画像として保存するための PHP コード

画像を異なる仕様の画像として保存するための PHP コード

WBOY
WBOYオリジナル
2016-07-25 09:03:39879ブラウズ
  1. /**
  2. 画像処理クラス
  3. */
  4. class imagecls
  5. {
  6. /**
  7. *ファイル情報
  8. */
  9. var $file = array();
  10. /**
  11. * ディレクトリを保存します
  12. */
  13. var $dir = '';
  14. /**
  15. * エラーコード
  16. */
  17. var $error_code = 0;
  18. /**
  19. *最大ファイルアップロードサイズ KB
  20. */
  21. var $max_size = -1;
  22. 関数 es_imagecls()

  23. {

  24. }

  25. プライベート関数 checkSize($size)
  26. {
  27. return !($size > $this->max_size) || (-1 == $this->max_size);
  28. }
  29. /**
  30. * アップロードされたファイルを処理します
  31. * @param array $file アップロードされたファイル
  32. * @param string $dir 保存されたディレクトリ
  33. * @return bool
  34. */
  35. function init($file, $dir = 'temp')
  36. {
  37. if(!is_array($file) || 空($file) || !$this->isUploadFile($file['name']) == '' $file['size'] == 0)
  38. {
  39. $this->file = array();
  40. $this->error_code = -1;
  41. return false;
  42. }
  43. else
  44. {
  45. $file['size'] = intval( $file['size']);
  46. $file['name'] = トリム($file['name']);
  47. $file['thumb'] = '';
  48. $file['ext'] = $this->fileExt($file['name']);
  49. $file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);
  50. $file['is_image'] = $this- >isImageExt($file['ext']);
  51. $file['file_dir'] = $this->getTargetDir($dir);
  52. $file['prefix'] = md5(microtime(true))。 rand(10,99);
  53. $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //相对
  54. $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';// 物理
  55. $this ->file = &$file;
  56. $this->error_code = 0;
  57. return true;
  58. }
  59. }

  60. /**

  61. * ファイルを保存
  62. * @return bool
  63. */
  64. function save()
  65. {
  66. if(empty($this->file) || empty($this->file['tmp_name']))
  67. $this->error_code = -101;
  68. elseif(!$this-> ;checkSize($this->file['size']))
  69. $this->error_code = -105;
  70. elseif(!$this->file['is_image'])
  71. $this->error_code = -102;
  72. elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))
  73. $this->error_code = -103 ;
  74. elseif($this->file['is_image'] &&
  75. (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))
  76. {
  77. $this->error_code = -104;
  78. @unlink($this->file['local_target']);
  79. }
  80. else
  81. {
  82. $this->error_code = 0;
  83. return true;
  84. }
  85. return false;
  86. }

  87. /**

  88. * エラーコードを取得します
  89. * @戻り番号
  90. */
  91. function error()
  92. {
  93. return $this->error_code;
  94. }

  95. /**

  96. * ファイル拡張子を取得します
  97. * @return string
  98. */
  99. function fileExt($file_name)
  100. {
  101. returnaddslashes(strto lower(substr(strrchr($file_name, '.'), 1, 10)));
  102. }

  103. /**

  104. * 拡張子に基づいてファイルが画像であるかどうかを判断します
  105. * @param string $ext extension
  106. * @return bool
  107. */
  108. 関数 isImageExt($ext)
  109. {
  110. static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif','gif');
  111. return in_array($ext, $img_ext) ? 1 : 0;
  112. }

  113. /**

  114. * 画像情報を取得します
  115. * @param string $target ファイルパス
  116. * @returnmixed
  117. */
  118. function getImageInfo($target)
  119. {
  120. $ext = es_imagecls::fileExt($target);
  121. $is_image = es_imagecls::isImageExt($ext);

  122. < ;p> if(!$is_image)
  123. return false;
  124. elseif(!is_readable($target))
  125. return false;
  126. elseif($image_info = @getimagesize($target))
  127. {
  128. list($width, $height, $type ) = !empty($image_info) ? $image_info :
  129. array('', '', '');
  130. $size = $width * $height;
  131. if($is_image && !in_array($type, array(1,2,3,6,13) ))
  132. return false;

  133. $image_info['type'] =

  134. strto lower (substr(image_type_to_extension($image_info[2]),1));
  135. return $image_info;
  136. }
  137. else
  138. return false;
  139. }

  140. * ファイルのアップロードが許可されているかどうかを取得します
  141. * @param string $source file path
  142. * @return bool
  143. */
  144. function isUploadFile($source)
  145. {
  146. return $source && ($source != 'none') &&
  147. (is_uploaded_file($source) || is_uploaded_file(str_replace('\', ' ', $source)));
  148. }

  149. /**

  150. * 保存されたパスを取得します
  151. * @param string $dir 指定された保存ディレクトリ
  152. * @return string
  153. */
  154. function getTargetDir($dir)
  155. {
  156. if (!is_dir(APP_ROOT_PATH."public/".$dir)) {
  157. @mkdir(APP_ROOT_PATH."public/".$dir);
  158. @chmod(APP_ROOT_PATH."public/".$dir, 0777);
  159. }
  160. return $dir;
  161. }

  162. /**

  163. * ファイルを保存します
  164. * @param string $source ソース ファイル パス
  165. * @param string $target ディレクトリ ファイル パス
  166. * @return bool
  167. */
  168. プライベート関数 saveFile($source, $target)
  169. {
  170. if(!es_imagecls::isUploadFile($source))
  171. $succeed = false;
  172. elseif(@copy($source, $ target)))
  173. $succeed = true;
  174. elseif(function_exists('move_uploaded_file') &&
  175. @move_uploaded_file($source, $target))
  176. $succeed = true;
  177. elseif (@is_readable($source) &&
  178. (@$ fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))
  179. {
  180. while (!feof($fp_s))
  181. {
  182. $s = @fread( $fp_s, 1024 * 512);
  183. @fwrite($fp_t, $s);
  184. }
  185. fclose($fp_s);
  186. fclose($fp_t);
  187. $succeed = true;
  188. }

  189. < ;p> if($succeed)
  190. {
  191. $this->error_code = 0;
  192. @chmod($target, 0644);
  193. @unlink($source);
  194. }
  195. else
  196. {
  197. $this->error_code = 0 ;
  198. }

  199. return $succeed;

  200. }

  201. パブリック関数thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,

  202. $interlace=true,$filepath = '',$is_preview = true)
  203. {
  204. $info = es_imagecls::getImageInfo( $image);

  205. if($info !== false)

  206. {
  207. $srcWidth = $info[0];
  208. $srcHeight = $info[1];
  209. $type = $info['type'];

  210. < ;p> $インターレース = $インターレース? 1:0;
  211. unset($info);

  212. if($maxWidth > 0 && $maxHeight > 0)

  213. $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
  214. // 計算缩放率
  215. elseif($maxWidth == 0)
  216. $scale = $maxHeight/$srcHeight;
  217. elseif($maxHeight == 0)
  218. $scale = $maxWidth/$srcWidth;

  219. $paths = pathinfo($image);
  220. $paths['filename'] = トリム(strto lower($paths['basename']),
  221. ".".strto lower($paths['extension']));
  222. $basefilename =explode("_",$paths['filename']);
  223. $basefilename = $basefilename[0];
  224. if(empty($filepath))
  225. {
  226. if($is_preview)
  227. $thumbname = $ paths['dirname'].'/'.$basefilename.
  228. '_'.$maxWidth.'x'.$maxHeight.'.jpg';
  229. else
  230. $thumbname = $paths['dirname'].'/ '.$basefilename.
  231. 'o_'.$maxWidth.'x'.$maxHeight.'.jpg';
  232. }
  233. else
  234. $thumbname = $filepath;

  235. $thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);

  236. if($scale >= 1)
  237. {
  238. // 超过原图大小不再缩略
  239. $width = $srcWidth;
  240. $height = $srcHeight;
  241. if(!$is_preview)
  242. {
  243. //非预览模式写入原图
  244. file_put_contents($thumbname,file_get_contents($image)); //用原图写入
  245. return array('url'=>$thumburl,'path'=>$thumbname);
  246. }
  247. }
  248. else
  249. {
  250. // 缩略图寸
  251. $width = (int )($srcWidth*$scale);
  252. $height = (int)($srcHeight*$scale);
  253. }
  254. if($gen == 1)
  255. {
  256. $width = $maxWidth;
  257. $height = $ maxHeight;
  258. }

  259. // ダウンロード入原图

  260. $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);
  261. if(!function_exists($createFun))
  262. $createFun = 'imagecreatefromjpeg';< ;/p>
  263. $srcImg = $createFun($image);

  264. //创建缩略图

  265. if($type!='gif' && function_exists('imagecreatetruecolor'))
  266. $thumbImg = imagecreatetruecolor($width, $height);
  267. else
  268. $thumbImg = imagecreate($width, $height) ;

  269. $x = 0;

  270. $y = 0;

  271. if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

  272. {
  273. $resize_ratio = $maxWidth/$maxHeight;
  274. $src_ratio = $srcWidth/$srcHeight;
  275. if($src_ratio >= $resize_ratio)
  276. {
  277. $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
  278. $width = ($height * $srcWidth) / $srcHeight;
  279. }
  280. else
  281. {
  282. $y = ( $srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
  283. $height = ($width * $srcHeight) / $srcWidth;
  284. }
  285. }

  286. // 复制图片

  287. if(function_exists("imagecopyresampled"))
  288. imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  289. $srcWidth,$srcHeight);
  290. else
  291. imagecopyresize($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  292. $srcWidth,$srcHeight);
  293. if('gif'==$type || 'png'==$ type) {
  294. $background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一个绿色
  295. imagecolortransparent($thumbImg,$background_color);
  296. // 透明色、若注释毥行出绿色の画像に設定されています
  297. }

  298. // 对jpeg图形配置隔行扫描

  299. if('jpg'==$type || 'jpeg'==$type)
  300. imageinterlace($thumbImg,$interlace);

  301. // 画像生成

  302. imagejpeg($thumbImg,$thumbname,100);
  303. imagedestroy($thumbImg);
  304. imagedestroy($srcImg);

  305. return array('url'=>$thumburl,'path'=>$thumbname);

  306. }
  307. return false;
  308. }

  309. public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,

  310. $maxHeight=50,$gen = 0)
  311. {

  312. $インターレース = $インターレース? 1:0;

  313. if($maxWidth > 0 && $maxHeight > 0)

  314. $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
  315. // 計算缩放率
  316. elseif($maxWidth == 0)
  317. $スケール = $maxHeight/$srcHeight;
  318. elseif($maxHeight == 0)
  319. $scale = $maxWidth/$srcWidth;

  320. if($scale >= 1)

  321. {
  322. // 超过原图大小不再缩略
  323. $width = $srcWidth;
  324. $height = $srcHeight;
  325. }
  326. else
  327. {
  328. // 缩略图尺寸
  329. $ width = (int)($srcWidth*$scale);
  330. $height = (int)($srcHeight*$scale);
  331. }

  332. if($gen == 1)

  333. {
  334. $width = $maxWidth;
  335. $height = $maxHeight;
  336. }

  337. //创建缩略图
  338. if($type!=' gif' && function_exists('imagecreatetruecolor'))
  339. $thumbImg = imagecreatetruecolor($width, $height);
  340. else
  341. $thumbImg = imagecreatetruecolor($width, $height);

  342. $x = 0;

  343. $y = 0;

  344. if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

  345. {
  346. $resize_ratio = $maxWidth/$maxHeight;
  347. $src_ratio = $srcWidth/$srcHeight;
  348. if($src_ratio >= $resize_ratio)
  349. {
  350. $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
  351. $width = ($height * $srcWidth) / $srcHeight;
  352. }
  353. else
  354. {
  355. $y = ( $srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
  356. $height = ($width * $srcHeight) / $srcWidth;
  357. }
  358. }

  359. // 画像をコピー

  360. if(function_exists("imagecopyresampled"))
  361. imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  362. $srcWidth,$srcHeight);
  363. else
  364. imagecopyresize($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  365. $srcWidth,$srcHeight);
  366. if('gif'== $type || 'png'==$type) {
  367. $background_color = imagecolorallocate($thumbImg, 255,255,255);
  368. // 緑色を割り当てます
  369. imagecolortransparent($thumbImg,$background_color)
  370. // 透明色に設定しますこの行をコメントアウトすると、緑色の画像が出力されます
  371. }

  372. // JPEG グラフィックスのインターレースを設定します

  373. if('jpg'==$type || 'jpeg'==$type)
  374. imageinterlace ($thumbImg,$interlace);

  375. return $thumbImg;

  376. }

  377. public function Water($source,$water,$alpha= 80 ,$position="0")
  378. {
  379. //ファイルが存在するかどうかを確認します
  380. if(!file_exists($source)||!file_exists($water))
  381. return false;

  382. //画像情報

  383. $sInfo = es_imagecls::getImageInfo($source);
  384. $wInfo = es_imagecls::getImageInfo($water);

  385. //画像がウォーターマークより小さい場合画像の場合、生成されません 画像

  386. if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])
  387. return false;

  388. < ;p>
  389. if(is_animated_gif($source))
  390. {
  391. require_once APP_ROOT_PATH."system/utils/gif_encoder.php";
  392. require_once APP_ROOT_PATH."system/utils/gif_reader.php";

  393. < ;p> $gif = new GIFReader();
  394. $gif->load($source);
  395. foreach($gif->IMGS['frames'] as $k=> $img)
  396. {
  397. $ im = imagecreatefromstring($gif->getgif($k));
  398. //im にウォーターマークを追加します
  399. $sImage=$im;
  400. $wCreateFun="imagecreatefrom".$wInfo['type '];
  401. if(! function_exists($wCreateFun))
  402. $wCreateFun = 'imagecreatefromjpeg';
  403. $wImage=$wCreateFun($water);
  404. //画像ブレンドモードを設定します
  405. imagealphablending($wImage, true);
  406. switch (intval($position))
  407. {
  408. case 0: Break;
  409. //左上
  410. case 1:
  411. $posY=0;
  412. $posX=0;
  413. // 混合画像を生成
  414. imagecopymerge($sImage, $wImage, $posX, $ posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  415. Break;
  416. //右上
  417. case 2:
  418. $posY=0;
  419. $posX =$sInfo[0]-$ wInfo[0];
  420. //混合画像を生成
  421. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1], $alpha);
  422. Break;
  423. //左下
  424. case 3:
  425. $posY=$sInfo[1]-$wInfo[1];
  426. $posX=0;
  427. //混合画像を生成
  428. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  429. Break;
  430. //右下
  431. case 4:
  432. $posY=$sInfo[1] -$wInfo[1];
  433. $ posX=$sInfo[0]-$wInfo[0];
  434. //混合画像を生成
  435. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo [0],$wInfo[1] ,$alpha);
  436. Break;
  437. //中央揃え
  438. case 5:
  439. $posY=$sInfo[1]/2-$wInfo[1]/2;
  440. $posX=$ sInfo[0]/2-$wInfo [0]/2;
  441. //混合画像を生成
  442. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1 ],$alpha);
  443. Break;
  444. }
  445. //ウォーターマークが入っています
  446. ob_start();
  447. imagegif($sImage);
  448. $content = ob_get_contents();
  449. ob_end_clean();
  450. $frames [ ] = $content;
  451. $framed [ ] = $img['frameDelay'];
  452. }
  453. $gif_maker = 新しい GIFEncoder (
  454. $frames,
  455. $framed,
  456. 0,
  457. 2,
  458. 0, 0, 0,
  459. "bin" //bin はバイナリ URL はアドレスです
  460. );
  461. $image_rs = $gif_maker->GetAnimation ( );
  462. // 保存ファイル名が指定されていない場合、デフォルトは元の画像名です
  463. @unlink ($source);
  464. //画像を保存します
  465. file_put_contents($source,$image_rs);
  466. return true;
  467. }
  468. //画像を作成します
  469. $sCreateFun="imagecreatefrom".$sInfo['type'];
  470. if(!function_exists($sCreateFun))
  471. $sCreateFun = 'imagecreatefromjpeg';
  472. $sImage=$sCreateFun($source ) ;

  473. $wCreateFun="imagecreatefrom".$wInfo['type'];

  474. if(!function_exists($wCreateFun))
  475. $wCreateFun = 'imagecreatefromjpeg';
  476. $wImage=$ wCreateFun ($water);

  477. //画像のカラーブレンディングモードを設定します

  478. imagealphablending($wImage, true);

  479. Position))

  480. {
  481. case 0: Break;
  482. //左上
  483. case 1:
  484. $posY=0;
  485. $posX=0;
  486. // 混合画像を生成
  487. imagecopymerge($sImage, $wImage, $posX, $posY, 0 , 0, $wInfo[0],$wInfo[1],$alpha);
  488. Break;
  489. //右上
  490. case 2:
  491. $posY=0;
  492. $posX=$sInfo[0] -$wInfo[0 ];
  493. //混合画像を生成
  494. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  495. Break ;
  496. //左下
  497. ケース 3:
  498. $posY=$sInfo[1]-$wInfo[1];
  499. $posX=0;
  500. // 混合画像を生成
  501. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0 , $wInfo[0],$wInfo[1],$alpha);
  502. Break;
  503. //右下
  504. case 4:
  505. $posY=$sInfo[1]-$wInfo[1] ;
  506. $posX=$ sInfo[0]-$wInfo[0];
  507. //混合画像を生成
  508. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo [1],$alpha );
  509. Break;
  510. //中央揃え
  511. case 5:
  512. $posY=$sInfo[1]/2-$wInfo[1]/2;
  513. $posX=$sInfo[0]/2 -$wInfo[0] /2;
  514. //混合画像を生成
  515. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  516. Break;
  517. }< ;/p>
  518. //保存ファイル名が指定されていない場合、デフォルトは元の画像名です

  519. @unlink($source);
  520. //画像を保存します
  521. imagejpeg($ sImage,$source,100);
  522. imagedestroy($sImage);
  523. }
  524. }

  525. if(!function_exists('image_type_to_extension'))

  526. {
  527. function image_type_to_extension($imagetype)
  528. {
  529. if(empty($imagetype))
  530. return false;

  531. switch($imagetype)

  532. {
  533. case IMAGETYPE_GIF : return '.gif';
  534. case IMAGETYPE_JPEG : return '.jpeg';
  535. IMAGETYPE_PNG の場合: '.png' を返す;
  536. IMAGETYPE_SWF の場合: '.swf' を返す;
  537. IMAGETYPE_PSD の場合: '.psd' を返す;
  538. IMAGETYPE_BMP の場合: '.bmp' を返す;
  539. IMAGETYPE_TIFF_II の場合: '.tiff' を返す;
  540. IMAGETYPE_TIFF_MM の場合: '.tiff' を返す;
  541. IMAGETYPE_JPC の場合: '.jpc' を返す;
  542. IMAGETYPE_JP2 の場合: '.jp2' を返す;
  543. IMAGETYPE_JPX の場合: '.jpf' を返す;
  544. IMAGETYPE_JB2 の場合: '.jb2' を返す;
  545. IMAGETYPE_SWC の場合: '.swc' を返す;
  546. IFF の場合: '.aiff' を返す;
  547. IMAGETYPE_WBMP の場合: '.wbmp' を返す;
  548. IMAGETYPE_XBM の場合: '.xbm' を返す;
  549. デフォルト: false を返す;
  550. }
  551. }
  552. }
  553. ?>
コードをコピー

2.get_spec_img() は画像クラスを呼び出し、次のメソッドを使用して異なる仕様の画像を保存し、画像接続を返します。

  1. //対応する仕様の画像アドレスを取得します
  2. //gen=0: 比例スケーリングを維持し、クリップしません。高さが 0 の場合、幅はスケーリングされることが保証されます。 gen=1: 幅が長いことが保証され、クリッピング
  3. function get_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true)
  4. {
  5. if($width== 0)
  6. $new_path = $img_path;
  7. else
  8. {
  9. $img_name = substr($img_path,0,-4);
  10. $img_ext = substr($img_path,-3);
  11. if($is_preview)
  12. $new_path = $img_name."_".$width."x".$height.".jpg";
  13. else
  14. $new_path = $img_name."o_".$width."x".$height.".jpg" ;
  15. if(!file_exists($new_path))
  16. {
  17. require_once "imagecls.php";
  18. $imagec = new imagecls();
  19. $thumb = $imagec->thumb($img_path,$width,$height, $gen,true,"
  20. ",$is_preview );
  21. if(app_conf("PUBLIC_DOMAIN_ROOT")!='')
  22. {
  23. $paths = pathinfo($new_path);
  24. $path = str_replace("./" ,"",$paths['dirname'] );
  25. $filename = $paths['basename'];
  26. $pathwithoupublic = str_replace("public/","",$path);
  27. $file_data = @file_get_contents ($path.$file);
  28. $img = @imagecreatefromstring($file_data);
  29. if($img!==false)
  30. ); 使用方法:
  31. //im: ストア画像を 3 つの仕様で保存します: 小画像: 48x48、中画像 120x120、大画像 200x200
  32. $small_url=get_spec_image($data['image'],48,48,0 );
  33. $
  34. middle_url=get_spec_image($data['image'], 120,120, 0);
  35. $big_url=get_spec_image($data['image'],200,200,0);
  36. コードをコピー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。