Ошибка при попытке записать gif-изображение в буфер

#vips

Вопрос:

Я использую библиотеку PHP libvips, когда я использую эту функцию writeToBuffer для записи в буфер изображения, она выдает мне следующие типы ошибок.

 Fatal error: Uncaught JcupittVipsException: magicksave_buffer: libMagick error: no decode delegate for this image format `' @ error/blob.c/ImagesToBlob/2413  

Примечание — Эта ошибка возникает только в том случае, если мой тип изображения-gif

 $imagePathInfo = pathinfo($inputFileName); $imgExtension = $imagePathInfo['extension']; $img = VipsImage::newFromFile($inputFileName, ['access' =gt; 'sequential']); $img = $img-gt;writeToBuffer('.' . $imgExtension);  

Образ, который я пытаюсь

Ответ №1:

По умолчанию libvips загружает только первый кадр анимации. Чтобы загрузить все кадры, установите n параметр (количество страниц) равным -1. Воспользуйся:

 $img = VipsImage::newFromFile($inputFileName, [  'access' =gt; 'sequential',   'n' =gt; -1 ]);  

libvips 8.11 использует imagemagick для записи GIF-изображений. Вам нужно указать imagemagick, в каком формате писать с format помощью параметра, например.:

 $img = $img-gt;writeToBuffer('.' . $imgExtension, [  'format' =gt; $imgExtension ]);  

libvips 8.12 (срок поставки до конца ноября 2021 года) автоматически передаст правильное значение формата в imagemagick, а также имеет специальный и гораздо более быстрый GIF-редактор.

Комментарии:

1. Если я передам расширение изображения, будет ли оно работать для всех изображений, как у меня в общей функции в моем классе, которая принимает имя файла (с расширением jpg, jpeg и т. Д.). Мой вопрос в том, будет ли последнее решение, которое вы дали, работать для всех типов изображений?

2. Нет, пока вам нужно будет обрабатывать GIF-файлы как отдельный случай. libvips 8.12 исправляет это.