CodeIgniter 图像水印在使用动态输出时返回空白图像

Posted

技术标签:

【中文标题】CodeIgniter 图像水印在使用动态输出时返回空白图像【英文标题】:CodeIgniter image watermark returns blank image when using dynamic output 【发布时间】:2016-04-10 01:03:11 【问题描述】:

我正在使用 jquery 将数据发布到控制器函数,该控制器函数为位于服务器上的图像添加水印并动态将其回传。水印功能在我不使用动态输出时有效,但当我这样做时,它只会返回一个空白图像,其周围有一个 1 像素的灰色边框。

返回的图像名称正确,并且应用了正确的图像类型标头。这是网络检查器中返回的 gobble-de-gook 的第一行:

ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v90), quality = 90

任何实现此目的的替代方法将不胜感激,现在已经花了几天时间但收效甚微。如果可能的话,我宁愿让服务器上的图像保持原样。

Java:

$('#body').on('click', '#get_file', function(ev)

    ev.preventDefault();

    var type = 'file';
    var uid = $('#file_select').val();

    var v1 = retD['res'][0].v1;
    var v2 = retD['res'][0].v2;
    var v3 = retD['res'][0].v3;
    var v4 = retD['res'][0].v4;

    $.ajax(
        type: 'POST',
        url: '<?php echo site_url("Home_controller/drawInfo") ?>',
        data: v1:v1, v2:v2, v3:v3, v4:v4,
        dataType: 'html',
        success: function(img)
        
            $("#i").attr("src", img);
        
    ); 
); 

控制器:

function drawInfo()

    $v1 = $_POST['v1'];
    $v2 = $_POST['v2'];
    $v3 = $_POST['v3'];
    $v4 = $_POST['v4'];

    $config['image_library'] = 'gd2';
    $config['source_image'] = './img/Test_image.jpg';
    $config['wm_text'] = 'v1: ' . $v1 . ' v2: ' . $v2 . ' v3: ' . $v3 . ' v4: ' . $v4;
    $config['wm_type'] = 'text';
    $config['dynamic_output'] = true;
    $config['wm_font_color'] = 'ff0000';
    $config['wm_font_path'] = './system/fonts/texb.ttf';
    $config['wm_vrt_alignment'] = 'bottom';
    $config['wm_hor_alignment'] = 'center';
    $config['wm_padding'] = '20';

    $this->image_lib->initialize($config); 

    if(!$this->image_lib->watermark())
    
        echo $this->image_lib->display_errors();
    

【问题讨论】:

【参考方案1】:

从控制器返回图像二进制数据,但在 javascript 中,您希望将其用作 img 元素的 'src' 属性。

在控制器中,您应该返回新生成图像的 src。 设置路径时请小心,并为您将生成图像的文件夹设置正确的权限(它应该是 apache 可写的)。

控制器:

function drawInfo()

    $return = array(
        'src'   => '',
        'error' => '',
    );
    $v1 = $_POST['v1'];
    $v2 = $_POST['v2'];
    $v3 = $_POST['v3'];
    $v4 = $_POST['v4'];

    $config['image_library'] = 'gd2';
    // set image path
    $config['source_image'] = FCPATH . 'img/Test_image.jpg';
    // this image will be watermarked (path should be writable by apache!!!)
    $config['new_image'] = FCPATH . 'img/Test_image_new.jpg';
    $config['wm_text'] = 'v1: ' . $v1 . ' v2: ' . $v2 . ' v3: ' . $v3 . ' v4: ' . $v4;
    $config['wm_type'] = 'text';
    // to false to save image to file instead of print it (you can leave this setting because the false is the default value)
    $config['dynamic_output'] = false;
    $config['wm_font_color'] = 'ff0000';
    // set the proper path!!
    $config['wm_font_path'] = FCPATH . 'system/fonts/texb.ttf';
    $config['wm_vrt_alignment'] = 'bottom';
    $config['wm_hor_alignment'] = 'center';
    $config['wm_padding'] = '20';

    $this->image_lib->initialize($config);

    if(!$this->image_lib->watermark())
    
        $return['error'] = $this->image_lib->display_errors();
    
    else 
    
        // generate the URL of the new watermarked image (modify to your needs)
        $return['src'] = base_url() .'/'. $config['new_image'];
    
    echo json_encode($return);

JavaScript:

    $.ajax(
        type: 'POST',
        url: '<?php echo site_url("Home_controller/drawInfo") ?>',
        data: v1:v1, v2:v2, v3:v3, v4:v4,
        dataType: 'html',
        success: function(response)
        
            if(response.error) 
            
                alert(response.error);
            
            else 
            
                $("#i").attr("src", response.src);    
            
        
    );

【讨论】:

对不起,伙计,不起作用 - JS 忽略响应(仍然是图像数据而不是编码数组)我认为问题是当 dynamic_output 启用时,GD/CI 只是直接返回图像- 返回数组甚至没有被传递。羞耻,我真的希望这能解决问题:( 只需删除 $config['dynamic_output'] 设置或将其设置为 false。 (我修改了代码)。 是的,它确实在服务器上创建了一个我希望避免的图像,但是一旦将图像提供给浏览器就删除它是没有意义的。 TVM 伙计,我浪费了几天的时间来尝试让它工作!

以上是关于CodeIgniter 图像水印在使用动态输出时返回空白图像的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeIgniter 中动态调整图像大小而不使用 CI 图像处理函数

动态水印 php 脚本给出“图像无法显示,因为它包含错误”

codeIgniter3 学习笔记七(图像)

php中的图像水印

使用 PHP/CodeIgniter 动态检测动画 GIF

PHP php动态图像水印