• 技术文章 >php教程 >PHP源码

    php给图片加水印六

    2016-06-08 17:30:52原创350

    function _countMaskPos()
    {
    if($this->_isFull())
    {
    switch($this->mask_position)
    {
    case 1:
    // 左上
    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
    break;

    case 2:
    // 左下
    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
    $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;
    break;

    case 3:
    // 右上
    $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;
    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
    break;

    case 4:
    // 右下
    $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;
    $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;
    break;

    default:
    // 默认将水印放到右下,偏移指定像素
    $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;
    $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;
    break;
    }
    }
    else
    {
    switch($this->mask_position)
    {
    case 1:
    // 左上
    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
    break;

    case 2:
    // 左下
    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
    $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;
    break;

    case 3:
    // 右上
    $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;
    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
    break;

    case 4:
    // 右下
    $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;
    $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;
    break;

    default:
    // 默认将水印放到右下,偏移指定像素
    $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;
    $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;
    break;
    }
    }
    }

    /**
    * 设置字体信息
    */
    function _setFontInfo()
    {
    if(is_numeric($this->font))
    {
    $this->font_w = imagefontwidth($this->font);
    $this->font_h = imagefontheight($this->font);

    // 计算水印字体所占宽高
    $word_length = strlen($this->mask_word);
    $this->mask_w = $this->font_w*$word_length;
    $this->mask_h = $this->font_h;
    }
    else
    {
    $arr = imagettfbbox ($this->font_size,0, $this->font,$this->mask_word);
    $this->mask_w = abs($arr[0] - $arr[2]);
    $this->mask_h = abs($arr[7] - $arr[1]);
    }
    }

    /**
    * 设置新图尺寸
    *
    * @param integer $img_w 目标宽度
    * @param integer $img_h 目标高度
    */
    function _setNewImgSize($img_w, $img_h=null)
    {
    $num = func_num_args();
    if(1 == $num)
    {
    $this->img_scale = $img_w;// 宽度作为比例
    $this->fill_w = round($this->src_w * $this->img_scale / 100) - $this->img_border_size*2;
    $this->fill_h = round($this->src_h * $this->img_scale / 100) - $this->img_border_size*2;

    // 源文件起始坐标
    $this->src_x = 0;
    $this->src_y = 0;
    $this->copy_w = $this->src_w;
    $this->copy_h = $this->src_h;

    // 目标尺寸
    $this->dst_w = $this->fill_w + $this->img_border_size*2;
    $this->dst_h = $this->fill_h + $this->img_border_size*2;
    }

    if(2 == $num)
    {
    $fill_w = (int)$img_w - $this->img_border_size*2;
    $fill_h = (int)$img_h - $this->img_border_size*2;
    if($fill_w < 0 || $fill_h < 0)
    {
    die("图片边框过大,已超过了图片的宽度");
    }
    $rate_w = $this->src_w/$fill_w;
    $rate_h = $this->src_h/$fill_h;

    switch($this->cut_type)
    {
    case 0:
    // 如果原图大于缩略图,产生缩小,否则不缩小
    if($rate_w < 1 && $rate_h < 1)
    {
    $this->fill_w = (int)$this->src_w;
    $this->fill_h = (int)$this->src_h;
    }
    else
    {
    if($rate_w >= $rate_h)
    {
    $this->fill_w = (int)$fill_w;
    $this->fill_h = round($this->src_h/$rate_w);
    }
    else
    {
    $this->fill_w = round($this->src_w/$rate_h);
    $this->fill_h = (int)$fill_h;
    }
    }

    $this->src_x = 0;
    $this->src_y = 0;

    $this->copy_w = $this->src_w;
    $this->copy_h = $this->src_h;

    // 目标尺寸
    $this->dst_w = $this->fill_w + $this->img_border_size*2;
    $this->dst_h = $this->fill_h + $this->img_border_size*2 - 10 ;//补偿round误差 消除白边;
    break;

    // 自动裁切
    case 1:
    // 如果图片是缩小剪切才进行操作
    if($rate_w >= 1 && $rate_h >=1)
    {
    if($this->src_w > $this->src_h)
    {
    $src_x = round($this->src_w-$this->src_h)/2;
    $this->setSrcCutPosition($src_x, 0);
    $this->setRectangleCut($fill_h, $fill_h);

    $this->copy_w = $this->src_h;
    $this->copy_h = $this->src_h;

    }
    elseif($this->src_w < $this->src_h)
    {
    $src_y = round($this->src_h-$this->src_w)/2;
    $this->setSrcCutPosition(0, $src_y);
    $this->setRectangleCut($fill_w, $fill_h);

    $this->copy_w = $this->src_w;
    $this->copy_h = $this->src_w;
    }
    else
    {
    $this->setSrcCutPosition(0, 0);
    $this->copy_w = $this->src_w;
    $this->copy_h = $this->src_w;
    $this->setRectangleCut($fill_w, $fill_h);
    }
    }
    else
    {
    $this->setSrcCutPosition(0, 0);
    $this->setRectangleCut($this->src_w, $this->src_h);

    $this->copy_w = $this->src_w;
    $this->copy_h = $this->src_h;
    }

    // 目标尺寸
    $this->dst_w = $this->fill_w + $this->img_border_size*2;
    $this->dst_h = $this->fill_h + $this->img_border_size*2;

    break;

    // 手工裁切
    case 2:
    $this->copy_w = $this->fill_w;
    $this->copy_h = $this->fill_h;

    // 目标尺寸
    $this->dst_w = $this->fill_w + $this->img_border_size*2;
    $this->dst_h = $this->fill_h + $this->img_border_size*2;

    break;
    default:
    break;

    }
    }

    // 目标文件起始坐标
    $this->start_x = $this->img_border_size;
    $this->start_y = $this->img_border_size;
    }

    /**
    * 检查水印图是否大于生成后的图片宽高
    */
    function _isFull()
    {
    Return ( $this->mask_w + $this->mask_offset_x > $this->fill_w
    || $this->mask_h + $this->mask_offset_y > $this->fill_h)
    ?true:false;
    }

    /**
    * 检查水印图是否超过原图
    */
    function _checkMaskValid()
    {
    if( $this->mask_w + $this->mask_offset_x > $this->src_w
    || $this->mask_h + $this->mask_offset_y > $this->src_h)
    {
    die("水印图片尺寸大于原图,请缩小水印图");
    }
    }

    /**
    * 取得图片类型
    *
    * @param string $file_path 文件路径
    */
    function _getImgType($file_path)
    {
    $type_list = array("1"=>"gif","2"=>"jpg","3"=>"png","4"=>"swf","5" => "psd","6"=>"bmp","15"=>"wbmp");
    if(file_exists($file_path))
    {
    $img_info = @getimagesize ($file_path);
    if(isset($type_list[$img_info[2]]))
    {
    Return $type_list[$img_info[2]];
    }
    }
    else
    {
    die("文件不存在,不能取得文件类型!");
    }
    }

    /**
    * 检查图片类型是否合法,调用了array_key_exists函数,此函数要求
    * php版本大于4.1.0
    *
    * @param string $img_type 文件类型
    */
    function _checkValid($img_type)
    {
    if(!array_key_exists($img_type, $this->all_type))
    {
    Return false;
    }
    }

    /**
    * 按指定路径生成目录
    *
    * @param string $path 路径
    */
    function _mkdirs($path)
    {
    $adir = explode('//m.sbmmt.com/m/',$path);
    $dirlist = '';
    $rootdir = array_shift($adir);
    if(($rootdir!='.'||$rootdir!='..')&&!file_exists($rootdir))
    {
    @mkdir($rootdir);
    }
    foreach($adir as $key=>$val)
    {
    if($val!='.'&&$val!='..')
    {
    $dirlist .= "//m.sbmmt.com/m/".$val;
    $dirpath = $rootdir.$dirlist;
    if(!file_exists($dirpath))
    {
    @mkdir($dirpath);
    @chmod($dirpath,0777);
    }
    }
    }
    }

    /**
    * 垂直翻转
    *
    * @param string $src 图片源
    */
    function _flipV($src)
    {
    $src_x = $this->getImgWidth($src);
    $src_y = $this->getImgHeight($src);

    $new_im = imagecreatetruecolor($src_x, $src_y);
    for ($y = 0; $y < $src_y; $y++)
    {
    imagecopy($new_im, $src, 0, $src_y - $y - 1, 0, $y, $src_x, 1);
    }
    $this->h_src = $new_im;
    }

    /**
    * 水平翻转
    *
    * @param string $src 图片源
    */
    function _flipH($src)
    {
    $src_x = $this->getImgWidth($src);
    $src_y = $this->getImgHeight($src);

    $new_im = imagecreatetruecolor($src_x, $src_y);
    for ($x = 0; $x < $src_x; $x++)
    {
    imagecopy($new_im, $src, $src_x - $x - 1, 0, $x, 0, 1, $src_y);
    }
    $this->h_src = $new_im;
    }
    }
    ?>

    下面来看使用方法:

    require_once('lib/ImageHandler.phpcls');
    $imgHandler_Obj = new ImageHandler();

    /* 默认缩小放大 */
    $imgHandler_Obj->setSrcImg("img/xrk.jpg");
    $imgHandler_Obj->setDstImg("tmp/New_Image_0.jpg");
    $imgHandler_Obj->setCutType(0);
    // 指定缩放比例
    $imgHandler_Obj->createImg(20);//50 100 200 试试

    /* 1, 文字水印图片缩小

    $imgHandler_Obj->setSrcImg("img/xrk.jpg");
    $imgHandler_Obj->setMaskFont("Fonts/STXINGKA.TTF");
    $imgHandler_Obj->setMaskFontSize(15);
    $imgHandler_Obj->setMaskFontColor("#0061A7");
    $imgHandler_Obj->setMaskTxtPct(20);
    $imgHandler_Obj->setDstImgBorder(0,"#dddddd");
    $imgHandler_Objext = "Happy漫步者";
    //$str = mb_convert_encoding($imgHandler_Objext,"UTF-8","GBK");
    $imgHandler_Obj->setMaskWord($imgHandler_Objext);

    // 指定固定宽高 输出到浏览器
    $imgHandler_Obj->createImg(400,400);
    */


    /* 2, 加水印图片缩小
    $imgHandler_Obj->setSrcImg("img/test.jpg");
    $imgHandler_Obj->setDstImg("tmp/New_Image_2.jpg");
    $imgHandler_Obj->setMaskImg("img/t.gif");
    $imgHandler_Obj->setMaskPosition(0);//0为在图片右下角加入水印
    $imgHandler_Obj->setMaskImgPct(60);
    $imgHandler_Obj->setDstImgBorder(1,"#dddddd");

    // 指定缩放比例
    $imgHandler_Obj->createImg(400,400);
    */

    /* 3, 同步缩小
    $imgHandler_Obj->setSrcImg("img/test.jpg");
    $imgHandler_Obj->setCutType(0);//同步缩小
    $imgHandler_Obj->setDstImg("tmp/New_Image_3.jpg");
    $imgHandler_Obj->createImg(150,160);

    */

    /* 4, 剪裁图片
    $imgHandler_Obj->setSrcImg("img/test.jpg");
    $imgHandler_Obj->setCutType(2);//指明为手工裁切
    $imgHandler_Obj->setSrcCutPosition(50, 50);// 源图起点坐标
    $imgHandler_Obj->setRectangleCut(300, 200);// 裁切尺寸
    $imgHandler_Obj->setDstImg("tmp/New_Image_4.jpg");
    $imgHandler_Obj->createImg(300,200);
    */

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:nbsp this gt quot mask
    上一篇:用 PHP 读取和编写 XML DOM 下一篇:用 Smarty 分离 PHP 应用程序中的形式与功能

    相关文章推荐

    • php学习笔记之面向对象编程• PHP $ _POST函数 与$_GET函数详解• php文件上传代码[带缩略图与水印]• php经典分页函数_适合初学才• 剖析PHP中的输出缓冲 flush之类

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网