Я создал изображение с ImagePng (). Я не хочу, чтобы он сохранял изображение в файловой системе, но хотел бы вывести его на ту же страницу, что и base64 encode inline Image, например
print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>';
который не работает.
Возможно ли это в одном файле PHP?
Заранее спасибо!
Трюк здесь будет заключаться в использовании буферизации вывода для захвата вывода из imagepng()
, который либо отправляет вывод в браузер, либо в файл. Он не возвращает его для хранения в переменной (или в кодировке base64):
// Enable output buffering ob_start(); imagepng($png); // Capture the output $imagedata = ob_get_contents(); // Clear the output buffer ob_end_clean(); print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>';
Это адаптировано из пользовательского примера в документах imagepng()
.
У меня возникли проблемы с использованием ob_get_contents () при использовании PHP с AJAX, поэтому я попробовал это:
$id = generateID(); //Whereas this generates a random ID number $file="testimage".$id.".png"; imagepng($image, $file); imagedestroy($image); echo(base64_encode(file_get_contents($file))); unlink($file);
Это сохраняет временный файл изображения на сервере, а затем удаляется после его кодирования и эхоподавления.
Если вы не хотите хранить явный файл, и вы уже используете ob_start()
для чего-то другого (поэтому вы не можете использовать ob_start для этого случая без большого количества рефакторинга), вы можете определить свою собственную оболочку потока, которая хранит поток вывод в переменную.
Вы используете stream_wrapper_register
для регистрации новой stream_wrapper_register
потока и реализуете свой метод stream_write
чтобы записать ее в переменную, значение которой вы можете получить позже. Затем вы передаете этот поток (на самом деле вам просто нужно передать URI для этого потока) в imagepng
. imagepng
желающий закрыть ваш поток, не беспокоит вас, если ваша stream_close
потока не уничтожает данные, когда он закрыт ( stream_close
метод stream_close
).