PHP为图像添加过滤器问题

时间:2014-01-15 01:37:58

标签: php image-processing

将图像转换为灰度时遇到一些问题,请参阅下面的代码:

<?php
//Apply photo effects, load images using their ID from database
function applyEffect($id) {
    //Check if passed variable is an array
    if(gettype($id)=="array") {

    }

    //Testing
    $img = imagecreatefromjpeg("http://localhost:1234/ppa/data/images/18112013/0/image2.jpg");
    if($img && imagefilter($img, IMG_FILTER_GRAYSCALE)) {
        echo "Image converted to greyscale!";
        header('Content-Type: image/jpeg');
        imagejpeg($img);

        imagedestroy($img); 
    }
}

applyEffect(0);
?>

这只会产生以下内容,请参见下方打印屏幕的左上角,因为您可以看到它正在生成“损坏的图像链接”图像。

uhoh

如果我使用下面的代码实际保存照片,我只会收到错误:

<?php
//Apply photo effects, load images using their ID from database
function applyEffect($id) {
    //Check if passed variable is an array
    if(gettype($id)=="array") {

    }
    $img = imagecreatefromjpeg("http://localhost:1234/ppa/data/images/18112013/0/image2.jpg");

    //Testing
    if($img && imagefilter($img, IMG_FILTER_GRAYSCALE)) {
        echo "Image converted to greyscale!";

        imagejpeg($img,"C:\xampp\htdocs\ppa\data\images\18112013\0\image2_grey.jpg"); // <--- line 14

        imagedestroy($img); 
    }
}

applyEffect(0);
?>

错误:

  

警告:imagejpeg(C:\ tmpp \ htdocs \ ppa \ data \ images8112013):未能   open stream:C:\ xampp \ htdocs \ ppa \ test.php中的参数无效   14

修改 也可以使用相同的线程。假设我想通过函数参数发送效果,我是否也可以通过它发送附加参数,无法真正解释它,这就是我想象的方式。

<?php
//Apply photo effects
function applyEffect($url,$effect) {
    //List valid effects first


    $img = imagecreatefromjpeg($url);

    //Testing
    if($img && imagefilter($img, $effect)) {
        header('Content-Type: image/jpeg');
        imagejpeg($img);

        imagedestroy($img); 
    } else {
        return false;
    }
}

applyEffect("http://localhost:1234/ppa/data/images/18112013/0/image3.jpg",IMG_FILTER_BRIGHTNESS[20]);
?>

正如你所看到的,我通过函数参数传递了IMG_FILTER_BRIGHTNESS,但我正在使用的过滤器需要一个额外的参数,当我调用applyEffect函数时发送它会很好,如下所示:IMG_FILTER_BRIGHTNESS [20]

但这不起作用,任何指针?

1 个答案:

答案 0 :(得分:1)

您正在破坏您的形象:

    echo "Image converted to greyscale!";  <---this line
    header('Content-Type: image/jpeg');
    imagejpeg($img);

您可以 NOT 在header()调用之前输出任何类型的 ANY 。因此,标题调用将被完全忽略。 echo的输出也变为imagejpeg()输出的jpg数据的 PART 。您可能正在将此输出加载到浏览器中的<img>标记中,该标记期望看到图像。例如JPEG以两个十六进制数字0xFF 0xD8开头,但由于您要转出一些纯文本,因此您的jpeg图像实际上以

开头
Image converted to greyscale!0xFF0xD8

并且不能被浏览器解释为有效图像,因为图像数据不是它应该的位置 - 它之前是垃圾。

至于你的第二个代码,你只是假设imagecreatefromjpeg实际上成功了 - 你正在加载一个远程资源。如果它不存在,则不会获得jpeg,并且正在尝试从无效源创建GD句柄。然后你盲目地在进一步的操作中使用这个非句柄,这不可能成功,因为一切都从一开始就被打破了。

永远不要假设在处理远程资源时取得成功:数据库调用,HTTP请求等......总是假设失败,检查失败,并将成功视为一个惊喜