Я немного экспериментирую с манипуляциями PHP + Image. Я пытаюсь преобразовать некоторые изображения в черно-белые версии. Я в основном понял это, но имею одну небольшую проблему.
Чтобы уменьшить нагрузку на сервер, я хотел сохранить версии 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 & W версии файла и сохраняет их на сервере. Исходный оператор «if» также работает – он правильно служит для изображения, если он уже существует.
Проблема в том, что для запуска новых изображений это сохраняет их, но не выводит их в браузер. Что я могу использовать / изменить, чтобы сделать это?
Кроме того, я впервые делаю что-то подобное. Любые общие советы, которые вы имеете о выполнении вышеизложенного, будут оценены.
Компактная и правильная форма для вышеуказанной функции может быть:
<?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); ?>
Поскольку вы сохраняете изображение с помощью imagejpeg()
в части else
, ваше изображение не будет отображаться. Поэтому вы должны добавить
readfile("/path/to/file". $name);
после imagedestroy()
;).
Вы можете обернуть код вывода изображения в функцию – что-то вроде этого (untested):
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 );