zoukankan      html  css  js  c++  java
  • php生成水印类(生成缩略图.缩略水印),gif,png透明水印, 图片水印,文字水印

      1 <?php
      2 
      3 /**
      4  * 测试 of test
      5  * php生成水印类(生成缩略图.缩略图水印), 网上其它的代码都PNG不透明的问题..这个全透明.包括gif的操作, 包括生成的缩略图 ,支持图片水印,文字水印,水印透明
      6  * @author wc1217
      7  */
      8 class test extends spController{
      9 
     10     function index(){
     11 //        $d = spClass('encryptClass')->encode(json_encode(array('wc1217', 'wcwc')));
     12 //        echo $d . '<br>';
     13 //        echo spClass('encryptClass')->decode($d);
     14         echo filesize('E:\\WEB\\chuangyiwang\\views\\bottom.tpl');
     15     }
     16 
     17     function waterMarkAndThumb(){
     18         $file_path = 'E://WEB//chuangyiwang//themes//images//main.png'; //原文件名
     19         $makeThumb = true; //是否创建缩略图
     20         $thumbMark = true; //缩略图是否要水印
     21         $waterText = false; //是否启用文字水印,启用直接使用数组:如下:
     22         //array('waterText' => "创意革命网 | www.chuangyiwang.com", 'waterTextColor' => "#000000", 'waterTextSize' => '10', 'waterTextFont' => OA_LIB_PATH . '/simsun.ttc')
     23         $imgWaterPos = 9; //水印位置
     24         $transparent = 50; //图片水印透明度
     25         $bigFile = 10; //超过多少M不操作(视php限制内存而定,0为不准定)
     26         $thumbnail = array(
     27             'upload_dir' => 'nail',
     28             'max_width' => 150,
     29             'max_height' => 400,
     30             'jpeg_quality' => 80,
     31             'png_quality' => 9,
     32         ); //缩略图参数
     33 
     34         if($bigFile && filesize($file_path) > $bigFile * 1024 * 1024)
     35             return false;
     36         //后缀
     37         $extension = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
     38 
     39         //得到原始文件宽高
     40         list($img_width, $img_height) = getimagesize($file_path);
     41         if(!$img_width || !$img_height){
     42             return false;
     43         }
     44 
     45         //创建等尺寸的真彩色画布
     46         $new_img = $this->getImageTrueColor($img_width, $img_height, $extension);
     47         //生成图片参数
     48         switch($extension){
     49             case 'jpg':
     50             case 'jpeg':
     51                 $src_img = imagecreatefromjpeg($file_path);
     52                 $write_image = 'imagejpeg';
     53                 $image_quality = $thumbnail['jpeg_quality'];
     54                 break;
     55             case 'bmp':
     56                 $src_img = imagecreatefromwbmp($file_path);
     57                 $write_image = 'imagewbmp';
     58                 $image_quality = null;
     59                 break;
     60             case 'gif':
     61                 $src_img = imagecreatefromgif($file_path);
     62                 $write_image = 'imagegif';
     63                 $image_quality = null;
     64                 break;
     65             case 'png':
     66                 $src_img = imagecreatefrompng($file_path);
     67                 $write_image = 'imagepng';
     68                 $image_quality = $thumbnail['png_quality'];
     69                 break;
     70             default:
     71                 return false;
     72         }
     73         //将图载入画布
     74         imagecopyresampled($new_img, $src_img, 0, 0, 0, 0, $img_width, $img_height, $img_width, $img_height);
     75 
     76         if(is_array($waterText)){
     77             //得到文字大小信息
     78             $waterTextInfo = imagettfbbox(ceil($waterText['waterTextSize'] * 1.2), 0, $waterText['waterTextFont'], $waterText['waterText']);
     79             $maskWidth = $waterTextInfo[4] - $waterTextInfo[6];
     80             $maskHeight = $waterTextInfo[1] - $waterTextInfo[7];
     81             unset($waterTextInfo);
     82             $waterPos = $this->setWaterPos($imgWaterPos, $img_width, $img_height, $maskWidth, $maskHeight);
     83             //使用文字水印
     84             $new_img && imagettftext($new_img, $waterText['waterTextSize'], 0, $waterPos[0], $maskHeight + $waterPos[1]
     85                             , imagecolorallocate($new_img, hexdec(substr($waterText['waterTextColor'], 1, 2)), hexdec(substr($waterText['waterTextColor'], 3, 2))
     86                                     , hexdec(substr($waterText['waterTextColor'], 5, 2))), $waterText['waterTextFont'], $waterText['waterText']);
     87         }else{
     88             //以下为固定水印图片
     89             $maskWidth = 226;
     90             $maskHeight = 22;
     91             $maskHandle = imagecreatefromgif(OA_LIB_PATH . '/waterMask.gif');
     92             //设置水印位置
     93             $waterPos = $this->setWaterPos($imgWaterPos, $img_width, $img_height, $maskWidth, $maskHeight);
     94             //拷贝水印图片
     95             $new_img && imagecopymerge($new_img, $maskHandle, $waterPos[0], $waterPos[1], 0, 0, $maskWidth, $maskHeight, $transparent);
     96         }
     97         //写入文件,原图直接覆盖
     98         $succeed = $write_image($new_img, $file_path);
     99 
    100         if($makeThumb){
    101             //创建文件相关
    102             $new_file_path = 'E:/WEB/test/watermark/'; //dirname($file_path) . DIRECTORY_SEPARATOR . $thumbnail['upload_dir'] . DIRECTORY_SEPARATOR;
    103             if(!file_exists($new_file_path))
    104                 mkdir($new_file_path, 0777, true);
    105             $new_file_path .= basename($file_path);
    106 
    107             //生成缩略图比例,缩略图不要水印的话不能直接复制
    108             $scale = min($thumbnail['max_width'] / $img_width, $thumbnail['max_height'] / $img_height);
    109             if($thumbMark && $scale >= 1){
    110                 if($file_path !== $new_file_path){
    111                     return copy($file_path, $new_file_path);
    112                 }
    113                 return true;
    114             }
    115             //生成新的宽高
    116             $new_width = $img_width * $scale;
    117             $new_height = $img_height * $scale;
    118             //创建新的宽高真彩色画布
    119             $thumb_img = $this->getImageTrueColor($new_width, $new_height, $extension);
    120             //将图载入画布
    121             imagecopyresampled($thumb_img, ($thumbMark ? $new_img : $src_img), 0, 0, 0, 0, $new_width, $new_height, $img_width, $img_height);
    122             //写入文件
    123             $write_image($thumb_img, $new_file_path, $image_quality);
    124             imagedestroy($thumb_img);
    125         }
    126         //销毁对象
    127         imagedestroy($src_img);
    128         imagedestroy($new_img);
    129         return $succeed;
    130     }
    131 
    132     /**
    133      * 生成一块真彩色画布
    134      * @param int $img_width
    135      * @param int $img_height
    136      * @param string $img_type
    137      * @return boolean or imageHandle
    138      */
    139     private function getImageTrueColor($img_width, $img_height, $img_type){
    140         $new_img = imagecreatetruecolor($img_width, $img_height);
    141         //生成图片参数
    142         switch($img_type){
    143             case 'gif':
    144                 imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0));
    145                 break;
    146             case 'png':
    147                 imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0));
    148                 imagealphablending($new_img, false);
    149                 imagesavealpha($new_img, true);
    150                 break;
    151             default:
    152                 return false;
    153         }
    154         return $new_img;
    155     }
    156 
    157     /**
    158      * 设置水印位置
    159      * @param int $waterPosType 位置
    160      * @param int $groundImageWidth 原图宽
    161      * @param int $groundImageHeight 原图高
    162      * @param int $waterWidth 水印宽
    163      * @param int $waterHeight 水印高
    164      * @return array include x,y
    165      */
    166     function setWaterPos($waterPosType, $groundImageWidth, $groundImageHeight, $waterWidth, $waterHeight){
    167         switch($waterPosType){
    168             case 1://1为顶端居左
    169                 $waterPosX = 0;
    170                 $waterPosY = 0;
    171                 break;
    172             case 2://2为顶端居中
    173                 $waterPosX = ($groundImageWidth - $waterWidth) / 2;
    174                 $waterPosY = 0;
    175                 break;
    176             case 3://3为顶端居右
    177                 $waterPosX = $groundImageWidth - $waterWidth;
    178                 $waterPosY = 0;
    179                 break;
    180             case 4://4为中部居左
    181                 $waterPosX = 0;
    182                 $waterPosY = ($groundImageHeight - $waterHeight) / 2;
    183                 break;
    184             case 5://5为中部居中
    185                 $waterPosX = ($groundImageWidth - $waterWidth) / 2;
    186                 $waterPosY = ($groundImageHeight - $waterHeight) / 2;
    187                 break;
    188             case 6://6为中部居右
    189                 $waterPosX = $groundImageWidth - $waterWidth;
    190                 $waterPosY = ($groundImageHeight - $waterHeight) / 2;
    191                 break;
    192             case 7://7为底端居左
    193                 $waterPosX = 0;
    194                 $waterPosY = $groundImageHeight - $waterHeight * rand(115, 125) / 100;
    195                 break;
    196             case 8://8为底端居中
    197                 $waterPosX = ($groundImageWidth - $waterWidth) / 2;
    198                 $waterPosY = $groundImageHeight - $waterHeight * rand(115, 125) / 100;
    199                 break;
    200             case 9://9为底端居右
    201                 $waterPosX = $groundImageWidth - $waterWidth;
    202                 $waterPosY = $groundImageHeight - $waterHeight * rand(115, 120) / 100;
    203                 break;
    204             default://随机
    205                 $waterPosX = rand(0, ($groundImageWidth - $waterWidth));
    206                 $waterPosY = rand(0, ($groundImageHeight - $waterHeight));
    207         }
    208         return array($waterPosX, $waterPosY);
    209     }
    210 
    211 }
    212 
    213 ?>
  • 相关阅读:
    Oracle 与.NET Framework 数据类型映射
    mvc使用JsonResult返回Json数据(转)
    like参数替换
    jquery 等比缩放
    【linq to sql】已有打开的与此命令相关联的 DataReader,必须首先将它关闭
    脚本
    2012年计划——开始我的敏捷个人之行
    在Win7 64位机器上安装Oracle 10客户端以及PlSql
    词干提取算法Porter Stemming Algorithm解读
    开源搜索框架Lucene学习之分词器(2)——TokenFilter类及其子类
  • 原文地址:https://www.cnblogs.com/wc1217/p/2700718.html
Copyright © 2011-2022 走看看