我正在做一些PHP +图像处理的实验。我正在尝试将一些图像转换为黑白版本。我大部分时间都想到了,但有一个小问题。
为了减轻服务器的压力,我想保存B& W版本,只对以前没有通过脚本运行的图像运行图像过滤。所以,我有这样的事情:
<?php
header("Content-type: image/jpeg");
$file = $_GET['img'];
$name = md5($file).".jpg";
if(file_exists("/path/to/file" . $name)) {
ob_clean();
flush();
readfile("path/to/file" . $name);
exit;
}
else {
$image = imagecreatefromjpeg($file);
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagejpeg($image, "/path/to/file" . $name);
imagedestroy($image);
};
?>
这会创建文件的B&amp; W版本并将其保存到服务器。最初的“if”语句也可以正常工作 - 如果图像已经存在,它会正确地提供图像。
问题是,对于运行的新图像,这会保存它们,但不会将它们输出到浏览器。为了做到这一点,我可以使用/改变什么?
此外,这是我第一次做这样的事情。任何有关上述操作的一般提示都将受到赞赏。
答案 0 :(得分:5)
上述功能的紧凑且正确的形式可以是:
<?php
header("Content-type: image/jpeg");
$file = $_GET['img'];
$name = md5($file).".jpg";
if(!file_exists("/path/to/file" . $name)) {
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagejpeg($image, "/path/to/file" . $name);
} else {
$image = imagecreatefromjpeg("/path/to/file" . $name);
}
imagejpeg($image);
imagedestroy($image);
?>
答案 1 :(得分:2)
由于您要在imagejpeg()
部分保存else
的图片,因此您的图片不会显示。
所以你必须添加
readfile("/path/to/file". $name);
在imagedestroy()
;)之后。
答案 2 :(得分:1)
您可以将图像输出代码包装在一个函数中 - 类似这样(未经测试):
function output_image ( $image_file ) {
header("Content-type: image/jpeg");
header('Content-Length: ' . filesize($image_file));
ob_clean();
flush();
readfile($image_file);
}
$file = $_GET['img'];
$name = md5( $file ) . ".jpg";
$image_file = "/path/to/file/" . $name;
if(!file_exists( $image_file )) {
$image = imagecreatefromjpeg( $file );
imagefilter( $image, IMG_FILTER_GRAYSCALE );
imagejpeg( $image, $image_file );
imagedestroy( $image );
}
output_image( $image_file );