24/7 twenty-four seven

iOS/OS X application programing topics.

iOSDC 2025「作って学ぶWebP入門」

先日のiOSDC 2025にて「作って学ぶWebP入門」という発表をしました。

fortee.jp

スライド: speakerdeck.com

台本とアニメーション付きのスライド: www.icloud.com

サンプルコード: github.com

何かの原理や仕組みを学ぶための最も優れた方法の一つは、自分で作ってみることです。

WebPのデコーダ・エンコーダの実装は類似のソフトウェアを書いた経験がなければ非常に難易度が高いです。 その理由は、圧縮の工程が複数の処理から成り立っていて、各工程が前の工程に依存するために、各工程を独立して一つずつ検証しながら実装することが難しいためです。

そこでこの講演では、WebPのLossless圧縮における最も唯一必須かつ難解に使われている圧縮手法であるハフマン符号化について重点的に解説し、ハフマン符号化だけを適用したWebP画像が作れるエンコーダをサンプルコードとして提供することで、段階的に実装を進めていける環境を提供しました。

サンプルコードを順番に実装していくことでフル機能(Lossless圧縮のみ。Lossyについては完成版のみ提供。)のWebPコーデックが実装できるようになっています。

講演後に多くの人から聞かれたことに「WebPについて話そうと思ったきっかけは何か」ということがあります。

きっかけは少し前にiOS 18でWebPのアニメーション再生のパフォーマンスが非常に劣化した、という問題を見たことです。

iOS 18 で Animated WebP 再生時のパフォーマンスが著しく悪くなった問題と対応 - Mirrativ Tech Blog

WebP animations lag on iOS but not Android

以前に私はSMBというファイル共有プロトコルのクライアントをSwiftで実装しましたが、それは何年もAppleプラットフォームではSMBによるファイル共有に問題を抱えていたためです。 何年も直らないので、自分で作るしかない、と考えたのでした。 この試みを非常にうまくいっていて、私は普段のファイル共有のアクセスは今は自作のファイルブラウザを使っていて、AppleのSMB実装による問題をまったく受けずに快適に使えています。

WebPの問題も同様にAppleの実装に何か問題があるのでは、と考えて自分で作れば直せると思ったためです。 実際は自分で作ったWebPのデコーダはAppleの実装よりも3倍ほど遅く、またiOS 18でパフォーマンスが悪い理由も全くわかりませんでしたが、とても良い勉強になりました。

WebPに限らず、自分で作ってみることによって学べることは多いです。 下記のリポジトリはさまざまな技術について、そんな「作って学ぶ」ためのガイド集です。

Swiftのコンテンツは残念ながらほとんどないのですが、多言語の内容を参考にして自分でやってみる、というのもいいかもしれません。

github.com