设为首页收藏本站

PHPIN.NET

 找回密码
 立即注册
查看: 2608|回复: 0

[7.X版] 帝国CMS缩略图函数改进(GD库改进)

[复制链接]

374

主题

381

帖子

2554

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2554
发表于 2014-2-22 16:55:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
帝国CMS缩略图函数改进(GD库改进)
本文关键字词:缩略图,缩略图函数,帝国CMS,帝国CMS,帝国CMS缩略图去黑边框

第一种方式 帝国默认:
sys_ResizeImg($r[titlepic],宽,高,0);//帝国默认的不裁剪缩放生成缩略图的方式

第二种方式 帝国默认:
sys_ResizeImg($r[titlepic],宽,高,1);//帝国默认的裁剪缩放生成缩略图的方式

第三种方式 去掉裁剪不够时的黑边并且从图片缩放后中间裁剪:
sys_ResizeImg($r[titlepic],宽,高,2);//新加去黑边裁剪生成缩略图的方式

第四种方式 只固定图片的宽,高度不限制(类似不规则瀑布流的图片形式),高填写为大于0的任意整数数字:
sys_ResizeImg($r[titlepic],宽,高,3);//新加去黑边生成类似瀑布流格式的方式

/e/class/gd.php 函数全部代码如下:


  1. <?php
  2. define('InEmpireCMSGd',TRUE);

  3. //原文件,新文件,宽度,高度,维持比例
  4. function ResizeImage($big_image_name, $new_name, $max_width = 400, $max_height = 400, $resize = 1){
  5.     $returnr['file']='';
  6.     $returnr['filetype']='';
  7.     if($temp_img_type = @getimagesize($big_image_name)) {preg_match('/\/([a-z]+)$/i', $temp_img_type[mime], $tpn); $img_type = $tpn[1];
  8.     }else{
  9.         preg_match('/\.([a-z]+)$/i', $big_image_name, $tpn); $img_type = $tpn[1];
  10.     }
  11.     $all_type = array(
  12.         "jpg" => array("create"=>"ImageCreateFromjpeg", "output"=>"imagejpeg" , "exn"=>".jpg"),
  13.         "gif" => array("create"=>"ImageCreateFromGIF" , "output"=>"imagegif" , "exn"=>".gif"),
  14.         "jpeg" => array("create"=>"ImageCreateFromjpeg", "output"=>"imagejpeg" , "exn"=>".jpg"),
  15.         "png" => array("create"=>"imagecreatefrompng" , "output"=>"imagepng" , "exn"=>".png"),
  16.         "wbmp" => array("create"=>"imagecreatefromwbmp", "output"=>"image2wbmp" , "exn"=>".wbmp")
  17.     );

  18.     $func_create = $all_type[$img_type]['create'];
  19.     if(empty($func_create) or !function_exists($func_create)) {
  20.         return $returnr;
  21.     }
  22. //输出
  23.     $func_output = $all_type[$img_type]['output'];
  24.     $func_exname = $all_type[$img_type]['exn'];
  25.     if(($func_exname=='.gif'||$func_exname=='.png'||$func_exname=='.wbmp')&&!function_exists($func_output)) {
  26.         $func_output='imagejpeg';
  27.         $func_exname='.jpg';
  28.     }
  29.     $big_image = $func_create($big_image_name);
  30.     $big_width = imagesx($big_image);
  31.     $big_height = imagesy($big_image);
  32.     if($big_width <= $max_width and $big_height <= $max_height) {
  33.         $func_output($big_image, $new_name.$func_exname);
  34.         $returnr['file']=$new_name.$func_exname;
  35.         $returnr['filetype']=$func_exname;
  36.         return $returnr;
  37.     }
  38.     $ratiow = $max_width / $big_width;
  39.     $ratioh = $max_height / $big_height;
  40.     $new_width = ($ratiow > 1) ? $big_width : $max_width;
  41.     $new_height = ($ratioh > 1) ? $big_height : $max_height;
  42.     if($resize == 1) {
  43.         if($big_width >= $max_width and $big_height >= $max_height) {
  44.             if($big_width > $big_height) {
  45.                 $tempx = $max_width / $ratioh;
  46.                 $tempy = $big_height;
  47.                 $srcX = ($big_width - $tempx) / 2;
  48.                 $srcY = 0;
  49.             } else {
  50.                 $tempy = $max_height / $ratiow;
  51.                 $tempx = $big_width;
  52.                 $srcY = ($big_height - $tempy) / 2;
  53.                 $srcX = 0;
  54.             }
  55.         } else {
  56.             if($big_width > $big_height){
  57.                 $tempx = $max_width;
  58.                 $tempy = $big_height;
  59.                 $srcX = ($big_width - $tempx) / 2;
  60.                 $srcY = 0;
  61.             } else {
  62.                 $tempy = $max_height;
  63.                 $tempx = $big_width;
  64.                 $srcY = ($big_height - $tempy) / 2;
  65.                 $srcX = 0;
  66.             }
  67.         }
  68.     }elseif($resize == 2){//同比例缩放超出裁切
  69.         if($big_width >= $max_width and $big_height >= $max_height){
  70.             if($max_width > ($big_width * $ratioh)){
  71.                 $tempx=$big_width;
  72.                 $tempy=$max_height / $ratiow;
  73.                 $srcX=0;
  74.                 $srcY=($big_height - $tempy) / 2;
  75.             }elseif($max_height > ( $big_height * $ratiow)){
  76.                 $tempx=$max_width / $ratioh;
  77.                 $tempy=$big_height;
  78.                 $srcX=($big_width - $tempx) / 2;
  79.                 $srcY=0;
  80.             }
  81.         }else{
  82.             if($max_height > $big_height){
  83.                 $tempx=$max_width;
  84.                 $tempy=$big_height;
  85.                 $srcX=($big_width - $max_width) / 2;
  86.                 $srcY=0;
  87.             }elseif($max_width > $big_width){
  88.                 $tempx=$big_width;
  89.                 $tempy=$max_height;
  90.                 $srcX=0;
  91.                 $srcY=($big_height - $max_height) / 2;
  92.             }
  93.         }
  94.     }elseif($resize == 3){//宽度固定 高度同比例任意
  95.         $srcX = 0;
  96.         $srcY = 0;
  97.         $tempx = $big_width;
  98.         $tempy = $big_height;
  99.         if($big_width >= $max_width){
  100.             $new_height=$big_height*$ratiow;
  101.         }else{
  102.             $new_height=$big_height;
  103.         }
  104.     }else { //不保持比例
  105.         $srcX = 0;
  106.         $srcY = 0;
  107.         $tempx = $big_width;
  108.         $tempy = $big_height;
  109.     }
  110.     if(function_exists("imagecopyresampled")){
  111.         $temp_image = imagecreatetruecolor($new_width, $new_height);
  112.         imagecopyresampled($temp_image, $big_image, 0, 0, $srcX, $srcY, $new_width, $new_height, $tempx, $tempy);
  113.     } else {
  114.         $temp_image = imagecreate($new_width, $new_height);
  115.         imagecopyresized($temp_image, $big_image, 0, 0, $srcX, $srcY, $new_width, $new_height, $tempx, $tempy);
  116.     }
  117.     /*增加高质量输出图像*/
  118.     $zhiliang=$func_exname=='.png'?9:100;
  119.     $func_output($temp_image, $new_name.$func_exname,$zhiliang);
  120. //$func_output($temp_image, $new_name.$func_exname);
  121.     ImageDestroy($big_image);
  122.     ImageDestroy($temp_image);
  123.     $returnr['file']=$new_name.$func_exname;
  124.     $returnr['filetype']=$func_exname;
  125.     return $returnr;
  126. }

  127. /*
  128. * 功能:图片加水印 (水印支持图片或文字)
  129. * 参数:
  130. * $groundImage背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
  131. * $waterPos水印位置,有10种状态,0为随机位置;
  132. *1为顶端居左,2为顶端居中,3为顶端居右;
  133. *4为中部居左,5为中部居中,6为中部居右;
  134. *7为底端居左,8为底端居中,9为底端居右;
  135. * $waterImage图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
  136. * $waterText文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
  137. * $textFont文字大小,值为1、2、3、4或5,默认为5;
  138. * $textColor文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
  139. *
  140. * 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
  141. * $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
  142. * 当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
  143. * 加水印后的图片的文件名和 $groundImage 一样。
  144. */
  145. function imageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000",$myfontpath="../data/mask/cour.ttf",$w_pct,$w_quality){
  146.     global $fun_r,$editor;
  147.     if($editor==1){$a='../';}
  148.     elseif($editor==2){$a='../../';}
  149.     elseif($editor==3){$a='../../../';}
  150.     else{$a='';}
  151.     $waterImage=$waterImage?$a.$waterImage:'';
  152.     $myfontpath=$myfontpath?$a.$myfontpath:'';
  153.     $isWaterImage = FALSE;
  154.     $formatMsg = $fun_r['synotdotype'];

  155. //读取水印文件
  156.     if(!empty($waterImage) && file_exists($waterImage)){
  157.         $isWaterImage = TRUE;
  158.         $water_info = getimagesize($waterImage);
  159.         $water_w= $water_info[0];//取得水印图片的宽
  160.         $water_h= $water_info[1];//取得水印图片的高

  161.         switch($water_info[2]){//取得水印图片的格式
  162.             case 1:$water_im = imagecreatefromgif($waterImage);break;
  163.             case 2:$water_im = imagecreatefromjpeg($waterImage);break;
  164.             case 3:$water_im = imagecreatefrompng($waterImage);break;
  165.             default:echo $formatMsg;return "";
  166.         }
  167.     }

  168. //读取背景图片
  169.     if(!empty($groundImage) && file_exists($groundImage)) {
  170.         $ground_info = getimagesize($groundImage);
  171.         $ground_w= $ground_info[0];//取得背景图片的宽
  172.         $ground_h= $ground_info[1];//取得背景图片的高

  173.         switch($ground_info[2]){//取得背景图片的格式
  174.             case 1:$ground_im = imagecreatefromgif($groundImage);break;
  175.             case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
  176.             case 3:$ground_im = imagecreatefrompng($groundImage);break;
  177.             default:echo $formatMsg;return "";
  178.         }
  179.     }else {
  180.         echo $fun_r['synotdoimg'];
  181.         return "";
  182.     }

  183. //水印位置
  184.     if($isWaterImage){//图片水印
  185.         $w = $water_w;
  186.         $h = $water_h;
  187.         $label = "图片的";
  188.     }else{//文字水印
  189.         $temp = imagettfbbox(ceil($textFont*2.5),0,$myfontpath,$waterText);//取得使用 TrueType 字体的文本的范围
  190.         $w = $temp[2] - $temp[6];
  191.         $h = $temp[3] - $temp[7];
  192.         unset($temp);
  193.         $label = "文字区域";
  194.     }
  195.     if( ($ground_w<$w) || ($ground_h<$h) ) {
  196.         echo $fun_r['sytoosmall'];
  197.         return '';
  198.     }
  199.     switch($waterPos) {
  200.         case 0://随机
  201.             $posX = rand(0,($ground_w - $w));
  202.             $posY = rand(0,($ground_h - $h));
  203.             break;
  204.         case 1://1为顶端居左
  205.             $posX = 0;
  206.             $posY = 0;
  207.             break;
  208.         case 2://2为顶端居中
  209.             $posX = ($ground_w - $w) / 2;
  210.             $posY = 0;
  211.             break;
  212.         case 3://3为顶端居右
  213.             $posX = $ground_w - $w;
  214.             $posY = 0;
  215.             break;
  216.         case 4://4为中部居左
  217.             $posX = 0;
  218.             $posY = ($ground_h - $h) / 2;
  219.             break;
  220.         case 5://5为中部居中
  221.             $posX = ($ground_w - $w) / 2;
  222.             $posY = ($ground_h - $h) / 2;
  223.             break;
  224.         case 6://6为中部居右
  225.             $posX = $ground_w - $w;
  226.             $posY = ($ground_h - $h) / 2;
  227.             break;
  228.         case 7://7为底端居左
  229.             $posX = 0;
  230.             $posY = $ground_h - $h;
  231.             break;
  232.         case 8://8为底端居中
  233.             $posX = ($ground_w - $w) / 2;
  234.             $posY = $ground_h - $h;
  235.             break;
  236.         case 9://9为底端居右
  237.             $posX = $ground_w - $w;
  238.             $posY = $ground_h - $h;
  239.             break;
  240.         default://随机
  241.             $posX = rand(0,($ground_w - $w));
  242.             $posY = rand(0,($ground_h - $h));
  243.             break;
  244.     }

  245. //设定图像的混色模式
  246.     imagealphablending($ground_im, true);

  247.     if($isWaterImage){//图片水印
  248.         if($water_info[2]==3) {
  249.             imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件
  250.         }else {
  251.             imagecopymerge($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h,$w_pct);//拷贝水印到目标文件
  252.         }
  253.     }else{//文字水印
  254.         if( !empty($textColor) && (strlen($textColor)==7) ) {
  255.             $R = hexdec(substr($textColor,1,2));
  256.             $G = hexdec(substr($textColor,3,2));
  257.             $B = hexdec(substr($textColor,5));
  258.         }else {
  259.             echo $fun_r['synotfontcolor'];
  260.             return "";
  261.         }
  262.         imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));
  263.     }

  264. //生成水印后的图片
  265.     @unlink($groundImage);
  266.     switch($ground_info[2]){//取得背景图片的格式
  267.         case 1:imagegif($ground_im,$groundImage);break;
  268.         case 2:imagejpeg($ground_im,$groundImage,$w_quality);break;
  269.         case 3:imagepng($ground_im,$groundImage);break;
  270.         default:echo $formatMsg;return "";
  271.     }

  272. //释放内存
  273.     if(isset($water_info)) unset($water_info);
  274.     if(isset($water_im)) imagedestroy($water_im);
  275.     unset($ground_info);
  276.     imagedestroy($ground_im);
  277. }
  278. ?>
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|PHPIN.NET ( 冀ICP备00000001号 )|网站地图  

GMT+8, 2016-12-3 23:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表