勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

PHPでjpg / png画像をAVIF形式の画像に変換する方法

  PHP

PHPでjpg / png画像をAVIF形式の画像に変換しサーバに保存したい。WebP画像だとclass.upload.phpを使うのが楽で良いんだけどAVIF画像は対応していない模様。そのためバニラPHPにてAVIF画像に変換(場合によっては圧縮)する方法をメモ。

 

ソースコード

<?php
$file = './001.png';
$quality = 30;

changeAVIF($file, $quality);

function changeAVIF( $file, $quality = 30 ){
    $path_parts = pathinfo($file);
    $ext = $path_parts['extension'];

    if( $ext == 'jpg' ){
        $old_img = imagecreatefromjpeg($file);
    }else if( $ext == 'png' ){
        $old_img = imagecreatefrompng($file);
    }else{
        return false;
    }

    imageavif($old_img, $path_parts['filename'] . '.avif', $quality);
}

changeAVIF関数の第一引数に変換したいファイルパスを、第二引数に圧縮具合を数値を渡すと変換される。

 

imageavif

リファレンス

https://www.php.net/manual/ja/function.imageavif.php

注意点

圧縮用オプションのデフォルトは30

圧縮に関して第三引数で設定する。0~100までで数値の大きい方が画質が高くなる。尚、デフォルトは30になる点に注意。

PHPのバージョンは8.1以上

imageavif関数が使えるのはPHPのバージョンが8.1以上となる点に注意。

 

その他

圧縮後のサイズについて

圧縮のオプションをデフォルトの30で試したところ、以下のよう約10分の1になった。

  • png 1,074,853byte -> 117,227byte
  • jpg 117,227byte -> 11,903byte

AVIFの対応ブラウザについて

こちらのサイトを見る限り主要ブラウザは対応している模様。

 - PHP

  関連記事

PHPにて指定した画像に対して、繰り返し透かし画像処理する方法
PHPにて指定した画像に対して、繰り返し透かし画像処理する方法

画像素材等のサイトで無料版の画像に対して「sample」等の透かし画像処理を行っ ...

CKEditor5(WYSIWYGエディタ)に画像アップロード機能を追加する方法
CKEditor5(WYSIWYGエディタ)に画像アップロード機能を追加する方法

CKEditor5(ウィジウィグエディタ)に画像アップロード機能を追加したい。公 ...

PHPにてSVGファイルをjpg / png画像に変換する方法
PHPにてSVGファイルをjpg / png画像に変換する方法

PHPにてSVGファイルをjpgもしくはpng形式の画像ファイルに変換したいとい ...

バニラJS対応(jQuery非依存)の画像遅延読み込みプラグイン「echo.js」の利用方法
バニラJS対応(jQuery非依存)の画像遅延読み込みプラグイン「echo.js」の利用方法

あるサイトをブラウザの開発者ツールで見ていると「echo.js」と聞いたことの無 ...

「slick」でarrows(次に進む・前に戻るボタン)を設定しても表示されない場合の対応方法
「slick」でarrows(次に進む・前に戻るボタン)を設定しても表示されない場合の対応方法

「slick」で画像スライダーを表示する際にarrows(次に進む・前に戻るボタ ...