Иногда при работе с изображением с помощью PHP GD может потребоваться сохранить его в строку, а не файл. Например, такое может потребоваться для вывода картинки прямо в коде страницы в формате base64-encoded.
Первое что приходит в голову — это использовать ob_start для создания дополнительного буфера вывода, вывести изображение в него, и дальше получить изображение через ob_get_clean(). Но, как выяснилось, на практике это не работает должным образом — возвращается пустая строка. Возможно, проблема в нулевых байтах или в том, что в строке есть последовательности, которые с точки зрения utf-8 являются некорректными.
Но, как выяснилось, в PHP есть другое решение: открытие файла в памяти (в качестве имени файла нужно указать "php://memory") и работа с ним как с потоком. В этом случае можно добавить стандартный потоковый фильтр, кодирующий данные в base64 на лету. Это даёт возможность избежать проблем с бинарной строкой, описанных выше. Получаем такой код:
function jpeg_to_string($img, $jpeg_quality=80) {
$stream = fopen("php://memory", "w+"); // открываем поток в памяти
stream_filter_append($stream, 'convert.base64-encode', STREAM_FILTER_WRITE); //добавляем фильтр
imagejpeg($img, $stream, $jpeg_quality); // сам вывод картинки
rewind($stream); // возвращаемся к началу потока
$data = stream_get_contents($stream); // читаем содержимое потока в строку
fclose($stream);
return $data;
}

Был в Сети 19 сент. 2025 г., 02:55
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb, slow lifer.
- Перово, Москва, Россия
- me@4xpro.ru
- XXXXPro
Новости сайта в Telegram
t.me/4x_proКомпьютерное
Сохранение JPEG в строку, а не файл с помощью PHP GD
