WordPress カスタマイズ カスタマイズ 伝えたいこと 備忘録

プロモーションを含みます

プラグイン使わずに既にアップロードしたjpg画像をavifに一括変換方法

メルカリ招待コード:

所要時間目安: 5

This session is using  IPv4  is established in

今日は2025年10月14日です。

目次に行く・戻る

アイキャッチ画像は、[[ファイル:Avif-logo-rgb.svg|thumb|Avif-logo-rgb]]Alliance for Open Media - https://aomediacodec.github.io/av1-avif/, BSD, https://commons.wikimedia.org/w/index.php?curid=114334559による

先日は、プラグイン使わずに既にアップロードしたjpg画像をwebpに一括変換方法について記載しました。そこで、現在では、拡張子がavifになっている画像形式もありますので、同じようにプラグインを使用せずにこれまでにアップロード済みのjpg画像とpng画像をavif形式にwp-content-upload内の画像ファイルを一括変換することも必要かなと思いavifへの一括変換についても記載しておこうかと思います。

この記事を読む方へのオススメ

拡張子AVIF画像形式は、webpと共に次世代画像形式と言われているフォーマットです。ファイルサイズが非常に小さくで出来てかつ、画像劣化が少ない拡張子のものです。

Wikipediaに詳細は記されています。

2020年にNetflixが行った多くのテストで、AVIFはJPEGよりも圧縮効率が優れているだけでなく、細部がより維持され、ブロックノイズが減り、自然の画像、文字列、グラフィックを合成したときのハードエッジ周りの色のにじみ(英語版)が少なくなった[3]。 2024年1月以降、AVIFは主要なWebブラウザ全てでサポートされている
AVIF - Wikipedia

ということです。

具体的にプラグインなどを使わずにfunction.php内にコードを記載しjpg、png画像をavif形式に一括変換する方法のコードは以下になります。

/**
 * 既存の JPG / PNG ファイルを AVIF に一括変換(元画像は残す)
 * 実行トリガー:管理者が管理画面にアクセスしたとき(1日1回)
 */
add_action( 'admin_init', 'convert_existing_images_to_avif' );

function convert_existing_images_to_avif() {
    // 管理者のみ実行
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }

    // 二重実行防止(1日に1回だけ)
    $last_run = get_transient( 'convert_existing_images_to_avif_last_run' );
    if ( $last_run ) {
        return;
    }
    set_transient( 'convert_existing_images_to_avif_last_run', time(), DAY_IN_SECONDS );

    $upload_dir = wp_get_upload_dir();
    $base_dir   = trailingslashit( $upload_dir['basedir'] );

    // jpg / jpeg / png を再帰的にスキャン
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator( $base_dir, RecursiveDirectoryIterator::SKIP_DOTS )
    );

    foreach ( $iterator as $file ) {
        if ( $file->isFile() ) {
            $ext = strtolower( $file->getExtension() );

            if ( in_array( $ext, array( 'jpg', 'jpeg', 'png' ), true ) ) {
                $file_path = $file->getPathname();
                $file_info = pathinfo( $file_path );
                $avif_path = $file_info['dirname'] . '/' . $file_info['filename'] . '.avif';

                // 既に avif が存在すればスキップ
                if ( file_exists( $avif_path ) ) {
                    continue;
                }

                // 画像読み込み
                if ( $ext === 'png' ) {
                    $image = @imagecreatefrompng( $file_path );
                    if ( $image ) {
                        imagepalettetotruecolor( $image );
                        imagealphablending( $image, true );
                        imagesavealpha( $image, true );
                    }
                } else {
                    $image = @imagecreatefromjpeg( $file_path );
                }

                if ( ! $image ) {
                    continue;
                }

                // --- AVIF生成 ---
                if ( function_exists( 'imageavif' ) ) {
                    imageavif( $image, $avif_path, 80 ); // GD対応環境ならこれでOK
                } elseif ( class_exists( 'Imagick' ) ) {
                    try {
                        $im = new Imagick( $file_path );
                        $im->setImageFormat( 'avif' );
                        $im->setImageCompressionQuality( 80 );
                        $im->writeImage( $avif_path );
                        $im->clear();
                        $im->destroy();
                    } catch ( Exception $e ) {
                        // 失敗時はスキップ
                    }
                }

                imagedestroy( $image );
            }
        }
    }
}

以下に上記コードの処理内容を簡単に記載しておきますので、参考にしてください。

項目内容
出力形式.avif
関数imageavif()(GD) または Imagick
実行トリガー管理者がダッシュボードを開いたときに自動実行(1日1回)
元画像削除せず保持
処理対象/wp-content/uploads/ 配下すべて

使用方法としては以下に箇条書きにしておきます。

  • 上記コードを functions.php の最後に追加します。
  • 変換結果は 同名.avif ファイルとして uploads に保存されます。
  • WordPress管理画面に1回アクセスすると自動で1日1回だけ実行されます。

というように処理が行われます。

先日のwebpの処理内容とほぼ同じになります。

ですので、管理画面を開かなくても一度だけ処理を実行したい場合には以下のコードを追記して、実行後に削除して問題ないと思われます。

add_action( 'init', 'convert_existing_images_to_avif' );

その他、大量の一括変換以外であれば以下の先日も記載リンクした以下のSquooshにてサイト上でavif変換も可能です。

AV1 Image File Format(AVIF)は、画像や画像シーケンスをAV1で圧縮してHEIFファイル形式で保存するための画像ファイルフォーマットの仕様である。ISOBMFF(英語版)という同じコンテナフォーマットを使用し圧縮にHEVCを使用しているHEICと競合している。バージョン1.0.0は、2019年2月19日に策定された[52]。 AVIFでは、AV1のイントラフレーム(Iフレーム)符号化群の技術を応用して静止画を圧縮している。AVIFのように既存の動画コーデックの符号化技術を応用した例としては、VP8のWebPやH.265のHEIFがある。 AVIFは、以下のような機能をサポートしている。 ハイダイナミックレンジ(HDR) 8、10、12 bitの色深度 ロスレス圧縮と非可逆圧縮 モノクロ(alpha/depth)またはmulti-components 広色域(WCG)、ISO/IEC CICP、ICCプロファイルを含む、任意の色空間 4:2:0、4:2:2、4:4:4のクロマサブサンプリング 粒状性(film grain) AVIFの対応環境[編集] 2018年12月14日、Netflixは最初の.avif形式のサンプル画像を公開し、VLCにサポートが追加された。MicrosoftもWindows 10の「19H1(英語版)」プレビューリリースでFile Explorer、Paint、複数のAPIでの対応を発表し、サンプル画像を公開した。主要ブラウザでもサポートが進んできている。2020年8月、Google Chromeのバージョン85でAVIFがサポートされた[53]。また、2021年10月、 Mozilla Firefoxがバージョン93でAVIFを標準サポート。 [54] (アニメーション対応は大幅に遅れて2023年5月のバージョン113でサポート[55][56])尚Mozillaは当初、バージョン86での標準サポートを予定していたが、これはリリースの前日に撤回されていた [57] [58]。WebKitは2021年3月5日にAVIFをサポート。Safariの画像デコードはmacOS, iOS, iPadOSによって処理されていたが[59]、Safari 16.4以降ではmacOS Ventura, macOS Monterey, macOS Big Surで[60]、iOS 16以降, iPadOS 16以降でAVIFをサポートしている。Microsoft Edgeは2024年1月25日、バージョン121で対応した。Paint.NETは2019年9月18日に読み込みに対応し[61]、2020年10月23日には保存にも対応した[62]。Colorist format conversionとDarktable RAW image dataは、それぞれサポートをリリースし、libavifのリファレンス実装を公開して、プラグインAPIのバージョン3.xと2.10.xに対応するGIMPプラグインの実装が開発された。
AV1 - Wikipedia

あなたにおすすめ


Multiplex 広告

入学入社まであと…入学入社祝いはどんなPresent(プレゼント)でどのように過ごされますか?

ホワイトデープレゼントは以下などの豊富なキャンペーン商品から選ぶと良いと思います。

ブログサービスが始まってから:


カウントダウンタイマー

おすすめの記事一部広告

Total13


アドセンス336pxPC閲覧記事下表示1つ目コード

目次に戻る

よろしかったらシェアよろしくお願いします。

-WordPress, カスタマイズ, カスタマイズ, 伝えたいこと, 備忘録

目次に戻る

目次に戻る


コメントを表示(0)

コメントを書く

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

新着コメント