note 126269 added to function.imagecreatefromwebp
| From: | kawewong at gmail dot com | Date: | Fri, 23 Jul 2021 09:43:03 +0000 |
| Subject: | note 126269 added to function.imagecreatefromwebp | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-216641@lists.php.net to get a copy of this message | ||
PHP GD and WebP support:
Normal WebP (VP8): supported since PHP 5.4
Transparent WebP or alpha transparency (VP8X, VP8L): supported since PHP 7.0
Animated WebP (VP8X): not supported at all.
You can use the images from here https://developers.google.com/speed/webp/gallery2
here https://ezgif.com/help/alternative-animated-image-formats
and here https://developers.google.com/speed/webp/gallery1
Test with imagecreatefromwebp('your-image.webp'); and see the errors.
You can detect animated or transparent webp using this code.
<?php
/**
* Get WebP file info.
*
* @link https://www.php.net/manual/en/function.pack.php
unpack format reference.
* @link https://developers.google.com/speed/webp/docs/riff_container
WebP document.
* @param string $file
* @return array|false Return associative array if success, return
false for otherwise.
*/
function webpinfo($file) {
if (!is_file($file)) {
return false;
} else {
$file = realpath($file);
}
$fp = fopen($file, 'rb');
if (!$fp) {
return false;
}
$data = fread($fp, 90);
fclose($fp);
unset($fp);
$header_format = 'A4Riff/' . // get n string
'I1Filesize/' . // get integer (file size but not actual size)
'A4Webp/' . // get n string
'A4Vp/' . // get n string
'A74Chunk';
$header = unpack($header_format, $data);
unset($data, $header_format);
if (!isset($header['Riff']) || strtoupper($header['Riff']) !==
'RIFF') {
return false;
}
if (!isset($header['Webp']) || strtoupper($header['Webp']) !==
'WEBP') {
return false;
}
if (!isset($header['Vp']) || strpos(strtoupper($header['Vp']),
'VP8') === false) {
return false;
}
if (
strpos(strtoupper($header['Chunk']), 'ANIM') !== false ||
strpos(strtoupper($header['Chunk']), 'ANMF') !== false
) {
$header['Animation'] = true;
} else {
$header['Animation'] = false;
}
if (strpos(strtoupper($header['Chunk']), 'ALPH') !== false) {
$header['Alpha'] = true;
} else {
if (strpos(strtoupper($header['Vp']), 'VP8L') !== false) {
// if it is VP8L, I assume that this image will be transparency
// as described in https://developers.google.com/speed/webp/docs/riff_container#simple_file_format_lossless
$header['Alpha'] = true;
} else {
$header['Alpha'] = false;
}
}
unset($header['Chunk']);
return $header;
}// webpinfo
?>
Reference: https://stackoverflow.com/a/68491679/128761
Usage:
<?php
$info = webpinfo('your-image.webp');
if (isset($info['Animation']) && $info['Animation'] === true) {
echo 'It is animated webp.';
}
if (isset($info['Alpha']) && $info['Alpha'] === true) {
echo 'It is transparent webp.';
}
?>
----
Server IP: 45.112.84.4
Probable Submitter: 45.112.85.242 (proxied: 49.228.225.130)
----
Manual Page -- https://php.net/manual/en/function.imagecreatefromwebp.php
Edit -- https://main.php.net/note/edit/126269
Del: integrated -- https://main.php.net/note/delete/126269/integrated
Del: useless -- https://main.php.net/note/delete/126269/useless
Del: bad code -- https://main.php.net/note/delete/126269/bad+code
Del: spam -- https://main.php.net/note/delete/126269/spam
Del: non-english -- https://main.php.net/note/delete/126269/non-english
Del: in docs -- https://main.php.net/note/delete/126269/in+docs
Del: other reasons-- https://main.php.net/note/delete/126269
Reject -- https://main.php.net/note/reject/126269
Search -- https://main.php.net/manage/user-notes.php