用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2099|回复: 0
收起左侧

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

[复制链接]
发表于 2014-11-27 17:55:33 | 显示全部楼层 |阅读模式
本帖最后由 lyoncn 于 2014-11-27 17:55 编辑

今天我准备写一个网站上的图片水印操作方法.
我先把朋友做好的水印png放到固定位置(ky_watermark.png),然后写了两个方法.一个方法是全站统一的打水印方法.
PHP复制代码
    /* 图像水印处理 */
    /* 图像水印处理
     * $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的方法.
PHP复制代码
 
    /* 基于图像水印处理的,循环回溯子文件水印处理 */
    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[0] == 'd' || $file[0] == 't' || $file[0] == '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行
PHP复制代码
//  Output the image
        if ($this->dynamic_output == TRUE)
        {
            $this->image_display_gd($src_img);
        }
复制代码

此风骚的判断导致我的'FALSE'字符串被判断为TRUE.
此举浪费了我近2小时的时间,一度崩溃,各种尝试.
虽然我以后不可能再犯相同的错误,但肯定有不少CI初学者在调用时出现类似的错误.
谁会想到成片的字符串config参数中忽然夹杂一个布尔型,一不小心就写错了亲.......

如果用三个等号强判断
PHP复制代码
 
if ($this->dynamic_output === TRUE)
        {
            $this->image_display_gd($src_img);
        }
 
复制代码

我觉得效果会更好


邮箱348963373@qq.com

本版积分规则