はじめに
webで利用する画像ファイルはwebpにするのがページ表示速度の観点でコスパが良いという記事を書いていました。webpを使い始めると、それに関連する関数の登場頻度が上がるのですが、imagecreatefromwebpでハマったことがあったのでまとめます。
ファイルによって読み込めない
下記のコードをご覧ください。
<?php
$source = 'img/aaa.webp';
imagecreatefromwebp($source);
?>
たった2行なのですが、これがうまくいかないケースがありました。
ここで利用している「aaa.webp」はネット上で公開されていたwebpファイルだったのですが、どうもこのファイル特有の問題があるようです。
そこで下記のようにしてみました。
<?php
$source = 'img/aaa.webp';
$file_info = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $file_info->file($source);
echo $mime_type;
echo "<br>";
print_r (pathinfo($badwebpFilePath));
?>
その結果、出力されたのが下記です。
image/jpeg Array ( [dirname] => ./images [basename] => bad_file.webp [extension] => webp [filename] => bad_file )
つまり、拡張子が「webp」となっていたのですが、実際jpegだったということです。
MIMEと拡張子についてはこちらで詳しく記事化されていますが、実際はJPEGファイルであるにもかかわらず、拡張子をwebpと書き換えることは可能であり、ファイルとしては問題なく表示されるということですね。
ちなみに、下記はうまくいきます。
<?php
$source = 'img/aaa.webp';
imagecreatefromjpeg($source);//.webpだがjpegで読み込む
?>
こういった場合の影響を抑えるには拡張子を信じずにMIMEを見て判断するということになると思います。
最後に
gokeでは上記のようなプログラムを駆使して新しいサービスを制作しています。気になることなどがあればコメントまたはTwitterでご連絡ください。