そろそろ webp でいいかな
Page No.2
webp or AVIF -> jpg へのコンバート
逆の変換も、基本的にはたいして違わない。ただ、ちょっと webp においては一筋縄ではいかないところもあるけれど・・・。
imagecreatefromwebp は animated WebP を読んでくれない
表題のとおり、imagecreatefromwebp() は アニメーションする webp をその引数に指定すると 下記のような Fatal error を吐き出して止まってしまう。
Fatal error: gd-webp cannot allocate temporary buffer
そもそも imagecreatefromwebp() は、アニメーションwebp は読み取れない、と php.net/manual function.imagecreatefromwebp のページにも書いてある。
自分がこれに気がついたのは、いろいろテストをしているときに、ネットで拾った webp 画像においてこのエラーに遭遇した時である。そして、このエラーを回避しようとしてあれこれと策を講じることになる。ちなみに、その時拾ったいくつかのアニメーション webp ファイルは、拡張子を gif に変更すると、そのまま gif ファイルとして有効だった。たまたまなのかもしれないけれど・・・。
どうすればこのエラーを回避できるかと。
とりあえず思い浮かんだのは、エラーといえば、try & catch だろうかと。いままでほとんど使ったことがない、try & catch ではある。で、調べていろいろ試してみる。が、まず、try & catch では基本的に Fatal error は拾えないということ。
で、set_error_handler() を使う方法というのもいくつかあったけれど、結局、これも Fatal error の時は、 呼び出されないということらしく、徒労に終わる。
それならば、その webp ファイルがアニメーションかということを判別できれば!ということを考えた。まぁ、結果を言うとその方法を取るしかないようであり、php.net manual imagecreatefromwebp のページにもちゃんとそれ用の webpinfo() という関数が掲載されている。
しかしである。これはありがたい!とばかりにこの関数を使ってみた。が、自分の持っている animated webp は、この関数では網にかからなかった。しかたなく、再びネットを探してみると、animeted に限って判別する件のページを見つけることができた。ここにあり ->「stackoverflow – How to identify whether webp image is static or animated?」
ここにある関数や先の webpinfo() 関数を見ていると、アニメーションファイルには、そのファイル内に anim もしくは anmf という識別子があるようだ。で、あればそんなにややこしいことをする必要はないようであり、掲載されていた関数をちょっとアレンジして下のようにして使わせてもらうことにした。
一応、この関数は機能した。しかし、一応である。と、いうのは、あるファイルは網にかかるけれど、別のファイルはかからないという、不可解な現象となる。これはいったいなぜ?ってな具合。で、最初に使った webpinfo() という関数を改めて見てみると、strtoupper() を使っていることで、なるほど!となる。
animated WebP の判別関数
これは大文字小文字が混在しているということである。ならば、ということで速くなった正規表現を使うことにする。stripos() でもいいんだけれど、条件が複数あるなら正規表現でいいのでは無いかと思う。
この正規表現を使った関数で、どちらも捉えることができた。テストしたのがわずかな数なので完璧とはいいがたいけれど。それにしても、だとしたらなぜ最初に使った webpinfo() 関数ではこぼれ落ちてしまったのだろうか。ちょっと気になるので、対象の文字列がファイルのどのあたりで現れるのか、strpos() にて出現場所を取得してみた(この時なぜか stripos() を使わなかったのである)。
anim、anmf の文字列をそれぞれ全部大文字、全部小文字の4種類で試してみたところ、正規表現で網にかかっていた一つのファイルがかからなくなってしまった。???である。で、疑問に思い、再び正規表現でマッチした文字列を取得してみると、これがなんと、anIM と、大小混ざった文字列となってた。なんでこんなことになっているんだろうか。微妙に不思議である。
webp or AVIf -> jpg converter page application
て、ことで、webp or AVIF を jpg に変換するアプリケーションページのコード。AVIF の方も gif アニメーションにも対応しているとのことなんだけれど、そちらの具合はまだよくわからない。
デフォルトではこのファイルのあるフォルダ直下の targets フォルダにある webp & AVIF ファイルを jpg に変換します。一応、animated webp は除外するはず。できなければ、そのファイルの時点で Fatal error となって止まってしまう。
もし仮にこのコードを使用する場合、このコードを使用しての一切の責任は負いませんから完全自己責任にて使用して下さい。
Post : 2021/12/18 16:15