Blog. Just Blog

Как получить размер изображения WebP на PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Как получить размер изображения WebP на PHP
Как получить размер изображения WebP на PHP

Столкнулся с ситуацией, что PHP-шная функция для получения размера изображения GetImageSize возвращает нулевые значения при попытке обработать картинки WebP. При этом поддержка WebP в PHP частично имеется. Пришлось все делать самостоятельно.

В процессе изучения материала выяснилось, что файлы WebP по внутренней структуре могут быть трех форматов: Simple File Format (Lossy), Simple File Format (Lossless) и Extended File Format. Размер изображения в каждом из форматов хранится по-своему. В результате у меня получился вот такой код для определения размеров изображения WebP, который учитывает все три формата.
  1. // Путь к файлу изображения
  2. $file_path='sample.webp';
  3.  
  4. $f=fopen($file_path,'r');
  5. $data=fread($f,32);
  6. fclose($f);
  7. // Simple File Format (Lossy)
  8. if (substr($data,8,8)=='WEBPVP8 ') {
  9.     $tmp=unpack('v',substr($data,0x1A,2));
  10.     $x=$tmp[1];
  11.     $tmp=unpack('v',substr($data,0x1C,2));
  12.     $y=$tmp[1];
  13. }
  14. // Simple File Format (Lossless)
  15. elseif (substr($data,8,8)=='WEBPVP8L') {
  16.     $tmp=unpack('V',substr($data,0x15,4));
  17.     $x=($tmp[1] & 0x3FFF)+1;
  18.     $y=(($tmp[1]>>14) & 0x3FFF)+1;
  19. }
  20. // Extended File Format
  21. elseif (substr($data,8,8)=='WEBPVP8X') {
  22.     $tmp=unpack('V',substr($data,0x18,4));
  23.     $x=($tmp[1] & 0xFFFFFF)+1;
  24.     $tmp=unpack('V',substr($data,0x1B,4));
  25.     $y=($tmp[1] & 0xFFFFFF)+1;
  26. }
  27. else {
  28.     $x=0;
  29.     $y=0;
  30. }
Код оставлен минимально необходимый, никаких проверок на наличие и доступность файла не производится, это вы можете сделать сами в зависимости от поставленной задачи.

Поделиться ссылкой ВКонтакте
Просмотров: 1691 | Комментариев: 4

Метки: PHP, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Сергей (06.04.2024 в 00:23):
Да, впервые getimagesize не сработал для WebP, воспользовался вашим кодом, благодарю!
Дмитрий (04.01.2022 в 12:56):
ManHunter, да я тестирую на 7.3.

Но WEBP это пол беды, сейчас пришла новая напасть в виде HEIC, даже на Windows 10 пришлось расширение ставить чтобы это чудо лицезреть, а как с ним работать на php (без imagemagick), одному богу ведомо...
ManHunter (04.01.2022 в 11:43):
В PHP7-8 это уже вроде починили, как и работу с lossless и расширенным webp. У меня PHP5.
Дмитрий (04.01.2022 в 11:31):
На своих сайтах активно использую webp и проблем с getimagesize не разу не наблюдал, хотя ресайз изображений для превьюшек там идет постоянно. Возможно просто не попадались разные версии webp файлов. Если вам не сложно дополните эту статью, тремя изображениями разных форматов для теста.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.004 сек.) / Память: 4.5 Mb
Наверх