lyoncn 发表于 2014-11-27 17:55:33

使用CI水印时,对CI框架自带图像处理包image_lib的一点小建议

本帖最后由 lyoncn 于 2014-11-27 17:55 编辑

今天我准备写一个网站上的图片水印操作方法.
我先把朋友做好的水印png放到固定位置(ky_watermark.png),然后写了两个方法.一个方法是全站统一的打水印方法.
    /* 图像水印处理 */
    /* 图像水印处理
   * $prefix为缩略后重命名图片的前缀 */
    public function ky_watermark($source_image,$overlay_path='ky_watermark.png',$prefix='ky') {
      $this->load->library('image_lib');
      $config['image_library'] = 'gd2';
      $config['source_image'] = $source_image;
      $config['dynamic_output'] = FALSE; //动态输出,即输出后删除
      $config['wm_type'] = 'overlay'; //选text为文字水印
      $config['quality'] = '80'; //质量
      $config['wm_vrt_alignment'] = 'middle'; //居中对齐
      $config['wm_hor_alignment'] = 'center'; //居中对齐
      $config['wm_padding'] = '5'; //图像相对位置(单位像素)
      $config['wm_vrt_offset'] = '0'; //指定一个垂直偏移量(以像素为单位)
      $config['wm_hor_offset'] = '0'; //指定一个横向偏移量(以像素为单位)
      $config['wm_x_transp'] = '4'; //水印图像通道
      $config['wm_y_transp'] = '4'; //水印图像通道
      $config['wm_overlay_path'] = $overlay_path;
      $this->image_lib->initialize($config);
      if ($this->image_lib->watermark()) {
            rename($source_image, dirname($source_image) . '/'.$prefix . basename($source_image));//成功后重命名原图片
      } else {
            echo $this->image_lib->display_errors();//失败输出错误
      }
      
    }
另一个方法是在ky_watermark的基础上,对文件夹下所有文件进行ky_watermark的方法.

    /* 基于图像水印处理的,循环回溯子文件水印处理 */
    public function sub_ky_watermark($source_dir) {
      $current_dir = opendir($source_dir);    //opendir()返回一个目录句柄,失败返回false
      while (($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目
            $sub_dir = $source_dir . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
            if ($file == '.' || $file == '..' || $file == 'd' || $file == 't' || $file == 'k') {
                //检测是否为缩略图,已删除图片,或者已水印
                continue;
            } else if (is_dir($sub_dir)) {    //如果是目录,进行递归
                $this->sub_ky_watermark($sub_dir);
            } else {    //如果是文件,打水印
                $this->ky_watermark($sub_dir);
            }
      }
    }


希望对大家有帮助




下面,重点来了.
我在写这个方法的时候,曾经把$config['dynamic_output'] = FALSE;写成了$config['dynamic_output'] = 'FALSE';
然后我就卷进了无休止的调bug之中.因为在system/libraries/Image_lib.php中,第958行//Output the image
      if ($this->dynamic_output == TRUE)
      {
            $this->image_display_gd($src_img);
      }
此风骚的判断导致我的'FALSE'字符串被判断为TRUE.
此举浪费了我近2小时的时间,一度崩溃,各种尝试.
虽然我以后不可能再犯相同的错误,但肯定有不少CI初学者在调用时出现类似的错误.
谁会想到成片的字符串config参数中忽然夹杂一个布尔型,一不小心就写错了亲.......

如果用三个等号强判断

if ($this->dynamic_output === TRUE)
      {
            $this->image_display_gd($src_img);
      }

我觉得效果会更好


邮箱348963373@qq.com
页: [1]
查看完整版本: 使用CI水印时,对CI框架自带图像处理包image_lib的一点小建议