PHP: создать образ с ImagePng и преобразовать с base64_encode в один файл?

Я создал изображение с 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 ).