将图像转换为灰度时遇到一些问题,请参阅下面的代码:
<?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);
?>
这只会产生以下内容,请参见下方打印屏幕的左上角,因为您可以看到它正在生成“损坏的图像链接”图像。
如果我使用下面的代码实际保存照片,我只会收到错误:
<?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]
但这不起作用,任何指针?
答案 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请求等......总是假设失败,检查失败,并将成功视为一个惊喜