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?

Спасибо заранее!

Ответы

Ответ 1

Хитрость в том, чтобы использовать выходную буферизацию для захвата вывода из imagepng(), который либо отправляет вывод в браузер, либо в файл. Он не возвращает его для хранения в переменной (или в кодировке base64):

// Enable output buffering
ob_start();
imagepng($png);
// Capture the output and clear the output buffer
$imagedata = ob_get_clean();

print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>';

Это адаптировано из пользовательского примера в документах imagepng().

Ответ 2

У меня возникли проблемы с использованием 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);

Это сохраняет временный файл изображения на сервере, а затем удаляется после его кодирования и эхо-сообщения.

Ответ 3

Если вы не хотите хранить явный файл, и вы уже используете ob_start() для чего-то другого (поэтому вы не можете использовать ob_start для этого случая без большого количества рефакторинга), вы можете определить свою собственную оболочку потока, которая сохраните поток для переменной.

Вы используете stream_wrapper_register для регистрации новой обтекателя потока и реализуете ее метод stream_write, чтобы записать его в переменную, значение которой вы можете получить позже. Затем вы передаете этот поток (на самом деле вам просто нужно передать URI для этого потока) в imagepng. imagepng, желающий закрыть ваш поток, не беспокоит вас, если ваша обтекатель потока не уничтожает данные, когда он закрыт (вызванный метод stream_close).