首页 > 开发 > PHP > 正文

php将图片保存为不同尺寸图片的图片类实例

2024-05-04 23:33:36
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php将图片保存为不同尺寸图片的图片类,涉及php图片操作的保存、复制、缩略图等常用技巧,并封装成一个类文件以便于调用,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了php将图片保存为不同规格的图片类。分享给大家供大家参考。具体如下:

图片处理类.imagecls.php如下:

  1. <?php 
  2. /** 
  3. 图片处理类 
  4. */ 
  5. class imagecls 
  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. function es_imagecls() 
  23. private function checkSize($size
  24. return !($size > $this->max_size) || (-1 == $this->max_size); 
  25. /** 
  26. * 处理上传文件 
  27. * @param array $file 上传的文件 
  28. * @param string $dir 保存的目录 
  29. * @return bool 
  30. */ 
  31. function init($file$dir = 'temp'
  32. if(!is_array($file) || emptyempty($file) || !$this->isUploadFile($file['tmp_name']) || trim($file['name']) == '' || $file['size'] == 0) 
  33. $this->file = array(); 
  34. $this->error_code = -1; 
  35. return false; 
  36. else 
  37. $file['size'] = intval($file['size']); 
  38. $file['name'] = trim($file['name']); 
  39. $file['thumb'] = ''
  40. $file['ext'] = $this->fileExt($file['name']); 
  41. $file['name'] = htmlspecialchars($file['name'], ENT_QUOTES); 
  42. $file['is_image'] = $this->isImageExt($file['ext']); 
  43. $file['file_dir'] = $this->getTargetDir($dir); 
  44. $file['prefix'] = md5(microtime(true)).rand(10,99); 
  45. $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'//相对 
  46. $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'//物理 
  47. $this->file = &$file
  48. $this->error_code = 0; 
  49. return true; 
  50. /** 
  51. * 保存文件 
  52. * @return bool 
  53. */ 
  54. function save() 
  55. if(emptyempty($this->file) || emptyempty($this->file['tmp_name'])) 
  56. $this->error_code = -101; 
  57. elseif(!$this->checkSize($this->file['size'])) 
  58. $this->error_code = -105; 
  59. elseif(!$this->file['is_image']) 
  60. $this->error_code = -102; 
  61. elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target'])) 
  62. $this->error_code = -103; 
  63. elseif($this->file['is_image'] && (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true))) 
  64. $this->error_code = -104; 
  65. @unlink($this->file['local_target']); 
  66. else 
  67. $this->error_code = 0; 
  68. return true; 
  69. return false; 
  70. /** 
  71. * 获取错误代码 
  72. * @return number 
  73. */ 
  74. function error() 
  75. return $this->error_code; 
  76. /** 
  77. * 获取文件扩展名 
  78. * @return string 
  79. */ 
  80. function fileExt($file_name
  81. return addslashes(strtolower(substr(strrchr($file_name'.'), 1, 10))); 
  82. /** 
  83. * 根据扩展名判断文件是否为图像 
  84. * @param string $ext 扩展名 
  85. * @return bool 
  86. */ 
  87. function isImageExt($ext
  88. static $img_ext = array('jpg''jpeg''png''bmp','gif','giff'); 
  89. return in_array($ext$img_ext) ? 1 : 0; 
  90. /** 
  91. * 获取图像信息 
  92. * @param string $target 文件路径 
  93. * @return mixed 
  94. */ 
  95. function getImageInfo($target
  96. $ext = es_imagecls::fileExt($target); 
  97. $is_image = es_imagecls::isImageExt($ext); 
  98. if(!$is_image
  99. return false; 
  100. elseif(!is_readable($target)) 
  101. return false; 
  102. elseif($image_info = @getimagesize($target)) 
  103. list($width$height$type) = !emptyempty($image_info) ? $image_info : array(''''''); 
  104. $size = $width * $height
  105. if($is_image && !in_array($typearray(1,2,3,6,13))) 
  106. return false; 
  107. $image_info['type'] = strtolower(substr(image_type_to_extension($image_info[2]),1)); 
  108. return $image_info
  109. else 
  110. return false; 
  111. /** 
  112. * 获取是否充许上传文件 
  113. * @param string $source 文件路径 
  114. * @return bool 
  115. */ 
  116. function isUploadFile($source
  117. return $source && ($source != 'none') && (is_uploaded_file($source) || is_uploaded_file(str_replace('////', '//', $source))); 
  118. /** 
  119. * 获取保存的路径 
  120. * @param string $dir 指定的保存目录 
  121. * @return string 
  122. */ 
  123. function getTargetDir($dir
  124. {  
  125. if (!is_dir(APP_ROOT_PATH."public/".$dir)) { 
  126. @mkdir(APP_ROOT_PATH."public/".$dir); 
  127. @chmod(APP_ROOT_PATH."public/".$dir, 0777); 
  128. return $dir
  129. /** 
  130. * 保存文件 
  131. * @param string $source 源文件路径 
  132. * @param string $target 目录文件路径 
  133. * @return bool 
  134. */ 
  135. private function saveFile($source$target
  136. if(!es_imagecls::isUploadFile($source)) 
  137. $succeed = false; 
  138. elseif(@copy($source$target)) 
  139. $succeed = true; 
  140. elseif(function_exists('move_uploaded_file') && @move_uploaded_file($source$target)) 
  141. $succeed = true; 
  142. elseif (@is_readable($source) && (@$fp_s = fopen($source'rb')) && (@$fp_t = fopen($target'wb'))) 
  143. while (!feof($fp_s)) 
  144. $s = @fread($fp_s, 1024 * 512); 
  145. @fwrite($fp_t$s); 
  146. fclose($fp_s); 
  147. fclose($fp_t); 
  148. $succeed = true; 
  149. if($succeed
  150. $this->error_code = 0; 
  151. @chmod($target, 0644); 
  152. @unlink($source); 
  153. else 
  154. $this->error_code = 0; 
  155. return $succeed
  156. public function thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,$interlace=true,$filepath = '',$is_preview = true) 
  157. $info = es_imagecls::getImageInfo($image); 
  158. if($info !== false) 
  159. $srcWidth = $info[0]; 
  160. $srcHeight = $info[1]; 
  161. $type = $info['type']; 
  162. $interlace = $interlace? 1:0; 
  163. unset($info); 
  164. if($maxWidth > 0 && $maxHeight > 0) 
  165. $scale = min($maxWidth/$srcWidth$maxHeight/$srcHeight); // 计算缩放比例 
  166. elseif($maxWidth == 0) 
  167. $scale = $maxHeight/$srcHeight
  168. elseif($maxHeight == 0) 
  169. $scale = $maxWidth/$srcWidth
  170. $paths = pathinfo($image); 
  171. $paths['filename'] = trim(strtolower($paths['basename']),".".strtolower($paths['extension'])); 
  172. $basefilename = explode("_",$paths['filename']); 
  173. $basefilename = $basefilename[0]; 
  174. if(emptyempty($filepath)) 
  175. if($is_preview
  176. $thumbname = $paths['dirname'].'/'.$basefilename.'_'.$maxWidth.'x'.$maxHeight.'.jpg'
  177. else 
  178. $thumbname = $paths['dirname'].'/'.$basefilename.'o_'.$maxWidth.'x'.$maxHeight.'.jpg'
  179. else 
  180. $thumbname = $filepath
  181. $thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname); 
  182. if($scale >= 1) 
  183. // 超过原图大小不再缩略 
  184. $width = $srcWidth
  185. $height = $srcHeight;  
  186. if(!$is_preview
  187. {  
  188. //非预览模式写入原图 
  189. file_put_contents($thumbname,file_get_contents($image)); //用原图写入  
  190. return array('url'=>$thumburl,'path'=>$thumbname); 
  191. else 
  192. // 缩略图尺寸 
  193. $width = (int)($srcWidth*$scale); 
  194. $height = (int)($srcHeight*$scale); 
  195. }  
  196. if($gen == 1) 
  197. $width = $maxWidth
  198. $height = $maxHeight
  199. // 载入原图 
  200. $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type); 
  201. if(!function_exists($createFun)) 
  202. $createFun = 'imagecreatefromjpeg'
  203. $srcImg = $createFun($image); 
  204. //创建缩略图 
  205. if($type!='gif' && function_exists('imagecreatetruecolor')) 
  206. $thumbImg = imagecreatetruecolor($width$height); 
  207. else 
  208. $thumbImg = imagecreate($width$height); 
  209. $x = 0; 
  210. $y = 0; 
  211. if($gen == 1 && $maxWidth > 0 && $maxHeight > 0) 
  212. $resize_ratio = $maxWidth/$maxHeight
  213. $src_ratio = $srcWidth/$srcHeight
  214. if($src_ratio >= $resize_ratio
  215. $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2; 
  216. $width = ($height * $srcWidth) / $srcHeight
  217. else 
  218. $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2; 
  219. $height = ($width * $srcHeight) / $srcWidth
  220. // 复制图片 
  221. if(function_exists("imagecopyresampled")) 
  222. imagecopyresampled($thumbImg$srcImg, 0, 0, $x$y$width$height$srcWidth,$srcHeight); 
  223. else 
  224. imagecopyresized($thumbImg$srcImg, 0, 0, $x$y$width$height$srcWidth,$srcHeight); 
  225. if('gif'==$type || 'png'==$type) { 
  226. $background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一个绿色 
  227. imagecolortransparent($thumbImg,$background_color); // 设置为透明色,若注释掉该行则输出绿色的图 
  228. // 对jpeg图形设置隔行扫描 
  229. if('jpg'==$type || 'jpeg'==$type
  230. imageinterlace($thumbImg,$interlace); 
  231. // 生成图片 
  232. imagejpeg($thumbImg,$thumbname,100); 
  233. imagedestroy($thumbImg); 
  234. imagedestroy($srcImg); 
  235. return array('url'=>$thumburl,'path'=>$thumbname); 
  236. return false; 
  237. public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,$maxHeight=50,$gen = 0) 
  238. $interlace = $interlace? 1:0; 
  239. if($maxWidth > 0 && $maxHeight > 0) 
  240. $scale = min($maxWidth/$srcWidth$maxHeight/$srcHeight); // 计算缩放比例 
  241. elseif($maxWidth == 0) 
  242. $scale = $maxHeight/$srcHeight
  243. elseif($maxHeight == 0) 
  244. $scale = $maxWidth/$srcWidth
  245. if($scale >= 1) 
  246. // 超过原图大小不再缩略 
  247. $width = $srcWidth
  248. $height = $srcHeight
  249. else 
  250. // 缩略图尺寸 
  251. $width = (int)($srcWidth*$scale); 
  252. $height = (int)($srcHeight*$scale); 
  253. if($gen == 1) 
  254. $width = $maxWidth
  255. $height = $maxHeight
  256. //创建缩略图 
  257. if($type!='gif' && function_exists('imagecreatetruecolor')) 
  258. $thumbImg = imagecreatetruecolor($width$height); 
  259. else 
  260. $thumbImg = imagecreatetruecolor($width$height); 
  261. $x = 0; 
  262. $y = 0; 
  263. if($gen == 1 && $maxWidth > 0 && $maxHeight > 0) 
  264. $resize_ratio = $maxWidth/$maxHeight
  265. $src_ratio = $srcWidth/$srcHeight
  266. if($src_ratio >= $resize_ratio
  267. $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2; 
  268. $width = ($height * $srcWidth) / $srcHeight
  269. else 
  270. $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2; 
  271. $height = ($width * $srcHeight) / $srcWidth
  272. // 复制图片 
  273. if(function_exists("imagecopyresampled")) 
  274. imagecopyresampled($thumbImg$srcImg, 0, 0, $x$y$width$height$srcWidth,$srcHeight); 
  275. else 
  276. imagecopyresized($thumbImg$srcImg, 0, 0, $x$y$width$height$srcWidth,$srcHeight); 
  277. if('gif'==$type || 'png'==$type) { 
  278. $background_color = imagecolorallocate($thumbImg, 255,255,255); // 指派一个绿色 
  279. imagecolortransparent($thumbImg,$background_color); // 设置为透明色,若注释掉该行则输出绿色的图 
  280. // 对jpeg图形设置隔行扫描 
  281. if('jpg'==$type || 'jpeg'==$type
  282. imageinterlace($thumbImg,$interlace); 
  283. return $thumbImg
  284. public function water($source,$water,$alpha=80,$position="0"
  285. //检查文件是否存在 
  286. if(!file_exists($source)||!file_exists($water)) 
  287. return false; 
  288. //图片信息 
  289. $sInfo = es_imagecls::getImageInfo($source); 
  290. $wInfo = es_imagecls::getImageInfo($water); 
  291. //如果图片小于水印图片,不生成图片 
  292. if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1']) 
  293. return false; 
  294. if(is_animated_gif($source)) 
  295. require_once APP_ROOT_PATH."system/utils/gif_encoder.php"
  296. require_once APP_ROOT_PATH."system/utils/gif_reader.php"
  297. $gif = new GIFReader(); 
  298. $gif->load($source); 
  299. foreach($gif->IMGS['frames'as $k=>$img
  300. $im = imagecreatefromstring($gif->getgif($k));  
  301. //为im加水印 
  302. $sImage=$im;  
  303. $wCreateFun="imagecreatefrom".$wInfo['type']; 
  304. if(!function_exists($wCreateFun)) 
  305. $wCreateFun = 'imagecreatefromjpeg'
  306. $wImage=$wCreateFun($water); 
  307. //设定图像的混色模式 
  308. imagealphablending($wImage, true);  
  309. switch (intval($position)) 
  310. case 0: break
  311. //左上 
  312. case 1: 
  313. $posY=0; 
  314. $posX=0; 
  315. //生成混合图像 
  316. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  317. break
  318. //右上 
  319. case 2: 
  320. $posY=0; 
  321. $posX=$sInfo[0]-$wInfo[0]; 
  322. //生成混合图像 
  323. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  324. break
  325. //左下 
  326. case 3: 
  327. $posY=$sInfo[1]-$wInfo[1]; 
  328. $posX=0; 
  329. //生成混合图像 
  330. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  331. break
  332. //右下 
  333. case 4: 
  334. $posY=$sInfo[1]-$wInfo[1]; 
  335. $posX=$sInfo[0]-$wInfo[0]; 
  336. //生成混合图像 
  337. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  338. break
  339. //居中 
  340. case 5: 
  341. $posY=$sInfo[1]/2-$wInfo[1]/2; 
  342. $posX=$sInfo[0]/2-$wInfo[0]/2; 
  343. //生成混合图像 
  344. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  345. break
  346. //end im加水印 
  347. ob_start(); 
  348. imagegif($sImage); 
  349. $content = ob_get_contents(); 
  350. ob_end_clean(); 
  351. $frames [ ] = $content
  352. $framed [ ] = $img['frameDelay']; 
  353. $gif_maker = new GIFEncoder ( 
  354. $frames
  355. $framed
  356. 0, 
  357. 2, 
  358. 0, 0, 0, 
  359. "bin" //bin为二进制 url为地址 
  360. ); 
  361. $image_rs = $gif_maker->GetAnimation ( ); 
  362. //如果没有给出保存文件名,默认为原图像名 
  363. @unlink($source); 
  364. //保存图像 
  365. file_put_contents($source,$image_rs); 
  366. return true; 
  367. }  
  368. //建立图像 
  369. $sCreateFun="imagecreatefrom".$sInfo['type']; 
  370. if(!function_exists($sCreateFun)) 
  371. $sCreateFun = 'imagecreatefromjpeg'
  372. $sImage=$sCreateFun($source); 
  373. $wCreateFun="imagecreatefrom".$wInfo['type']; 
  374. if(!function_exists($wCreateFun)) 
  375. $wCreateFun = 'imagecreatefromjpeg'
  376. $wImage=$wCreateFun($water); 
  377. //设定图像的混色模式 
  378. imagealphablending($wImage, true); 
  379. switch (intval($position)) 
  380. case 0: break
  381. //左上 
  382. case 1: 
  383. $posY=0; 
  384. $posX=0; 
  385. //生成混合图像 
  386. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  387. break
  388. //右上 
  389. case 2: 
  390. $posY=0; 
  391. $posX=$sInfo[0]-$wInfo[0]; 
  392. //生成混合图像 
  393. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  394. break
  395. //左下 
  396. case 3: 
  397. $posY=$sInfo[1]-$wInfo[1]; 
  398. $posX=0; 
  399. //生成混合图像 
  400. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  401. break
  402. //右下 
  403. case 4: 
  404. $posY=$sInfo[1]-$wInfo[1]; 
  405. $posX=$sInfo[0]-$wInfo[0]; 
  406. //生成混合图像 
  407. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  408. break
  409. //居中 
  410. case 5: 
  411. $posY=$sInfo[1]/2-$wInfo[1]/2; 
  412. $posX=$sInfo[0]/2-$wInfo[0]/2; 
  413. //生成混合图像 
  414. imagecopymerge($sImage$wImage$posX$posY, 0, 0, $wInfo[0],$wInfo[1],$alpha); 
  415. break
  416. //如果没有给出保存文件名,默认为原图像名 
  417. @unlink($source); 
  418. //保存图像 
  419. imagejpeg($sImage,$source,100); 
  420. imagedestroy($sImage); 
  421. if(!function_exists('image_type_to_extension')) 
  422. function image_type_to_extension($imagetype
  423. if(emptyempty($imagetype)) 
  424. return false; 
  425. switch($imagetype
  426. case IMAGETYPE_GIF : return '.gif'
  427. case IMAGETYPE_JPEG : return '.jpeg'
  428. case IMAGETYPE_PNG : return '.png'
  429. case IMAGETYPE_SWF : return '.swf'
  430. case IMAGETYPE_PSD : return '.psd'
  431. case IMAGETYPE_BMP : return '.bmp'
  432. case IMAGETYPE_TIFF_II : return '.tiff'
  433. case IMAGETYPE_TIFF_MM : return '.tiff'
  434. case IMAGETYPE_JPC : return '.jpc'
  435. case IMAGETYPE_JP2 : return '.jp2'
  436. case IMAGETYPE_JPX : return '.jpf'
  437. case IMAGETYPE_JB2 : return '.jb2'
  438. case IMAGETYPE_SWC : return '.swc'
  439. case IMAGETYPE_IFF : return '.aiff'
  440. case IMAGETYPE_WBMP : return '.wbmp'
  441. case IMAGETYPE_XBM : return '.xbm'
  442. default : return false; 
  443. ?> 



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,"",$is_preview);  
  20. if(app_conf("PUBLIC_DOMAIN_ROOT")!='')  
  21. {  
  22. $paths = pathinfo($new_path);  
  23. $path = str_replace("./","",$paths['dirname']);  
  24. $filename = $paths['basename'];  
  25. $pathwithoupublic = str_replace("public/","",$path);  
  26. $file_data = @file_get_contents($path.$file);  
  27. $img = @imagecreatefromstring($file_data);  
  28. if($img!==false)  
  29. {  
  30. $save_path = "public/".$path;  
  31. if(!is_dir($save_path))  
  32. {  
  33. @mk_dir($save_path);  
  34. }  
  35. @file_put_contents($save_path.$name,$file_data);  
  36. }  
  37. }  
  38. }  
  39. }  
  40. return $new_path;  



3.使用方法:

 

 
  1. //im:将店铺图片保存为3种规格:小图:48x48,中图120x120,大图200x200 
  2. $small_url=get_spec_image($data['image'],48,48,0); 
  3. #FormatTableID_2#lt;span id="result_box" class="short_text" lang="en"><span>middle_url</span></span>=get_spec_image($data['image'],120,120,0); 
  4. $big_url=get_spec_image($data['image'],200,200,0); 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表