代码
$files = scandir("images");
$exclude = array(".", "..");
$images = array_diff($files, $exclude);
foreach($images as $image) {
$original_image = imagecreatefromjpeg("images/{$image}");
$original_width = imagesx($original_image);
$original_height = imagesy($original_image);
$new_width = 180;
$new_height = floor($original_height * ($new_width/$original_width));
$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);
header("Content-Type: image/jpeg");
imagejpeg($new_image);
}
问题
代码的调整大小部分工作正常,但它只输出第一个调整大小的图像。我怎样才能使它转储所有已调整大小的图像?
答案 0 :(得分:2)
你不能这样做。 imagejpeg
“打印”图像的字节(这就是为什么,结合正确的标题,您在浏览器中看到该图片)。但是,打印多个图像(以及尝试更改标题)将无法正常工作,因为您正在“修改”第一个图像的字节,而不是将新图像附加到输出。如果你想使用这样的解决方案,你可以:
保存服务器中的每个图像,然后以其他方式访问这些图像(通过打印指向图片的<img>
标签或投放某种列出图像的结构)。
如果您不想保存它们,您始终可以使用base64对字节进行编码,然后将其用作<img src>
:
ob_start ();
imagejpeg ($new_image);
$image_data = ob_get_contents ();
ob_end_clean ();
$image_data_base64 = base64_encode ($image_data);
echo '<img src="data:image/jpg;base64,'.$image_data_base64.'" />';
你应该每次都这样做。
非常重要:在php中输出(或完成你的工作)图像对象后总是使用imagedestroy($new_image)
:它会释放资源,所以你不会收到“内存”筋疲力尽“错误很容易。
答案 1 :(得分:1)
该行:
header("Content-Type: image/jpeg");
让您的浏览器了解您的内容是 图片。
如果您在文件夹中选择2个图像,则右键单击并打开它们。您的图像不会像在一起一样显示在一起。
完成工作的一种方法是创建一个可以完成两件事的页面:
<img>
标记
这是一个例子。
// The argument is set: we display one image as png
if (array_key_exists('img', $_GET)) {
$image = $_GET['img'];
// security: prevents access to unauthorized directories (by giving "../../file.jpg" as file)
$goodPath = realpath('images');
$wantedImage = realpath("images/{$image}");
if (strncmp($wantedImage, $goodPath, strlen($goodPath)) != 0) {
die();
}
// if user wants an image that does not exists, we prevent GD errors
if (!is_file($wantedImage))
{
die();
}
// and your code here, to display only ONE image
$original_image = imagecreatefromjpeg("images/{$image}");
$original_width = imagesx($original_image);
$original_height = imagesy($original_image);
$new_width = 180;
$new_height = floor($original_height * ($new_width/$original_width));
$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);
header("Content-Type: image/jpeg");
imagejpeg($new_image);
die();
// No argument: we display all images as image tags
} else {
// security: prevents from xss exploits
$self = htmlentities($_SERVER['PHP_SELF']);
// glob will get all files that matches your pattern
$files = glob("images/*.[jJ][pP][gG]");
// display image tags
foreach ($files as $image) {
$image = htmlentities($image);
echo "<img src='{$self}?img={$image}' />";
}
die();
}