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
).