Googleの次世代画像フォーマット(WEBP)で元画像サイズより-80%削減の検証結果とOSS化した話

## はじめに
※本記事は私の[技術ブログ](https://buddypia.com/2021/11/30/%e6%ac%a1%e4%b8%96%e4%bb%a3%e7%94%bb%e5%83%8f%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88webp%e3%81%a8%e7%94%bb%e5%83%8f%e3%82%92webp%e3%81%ab%e5%a4%89%e6%8f%9bapi%e3%82%92oss%e5%85%ac/)から引用して作成しました。
この検証のきっかけですが、私が個人で運営しているサイトの開発で画像を沢山表示していたら、ページロードに凄く時間がかかったてしまったので原因分析のためにPageSpeed Insightsで調査してみたら<strong>次世代フォーマットでの画像の配信</strong>というキーワードが出て調査をしてみました。
画像のロードの速度を上げるやり方はいくつかあります。例えば、スクロール領域に応じて動的に画像をロードしたり、画像の画質を落としたり、画像を小さくしたりなどですが、今回は元の画像のサイズを縮小することなく画質も維持することはできないか？について色々調べて次世代画像フォーマット(Webp)を見つけて検証してみて検証結果がよかったので<strong>JPGやPNGなどをWEBPに変換するサービスをOSS化してみた話</strong>です。

## 次世代画像フォーマットとは？
画像フォーマットと言えばpng,jpeg, gifが思い浮かびますよね？次世代画像フォーマットは簡単に言えばこの従来画像フォマットより優れた改良版です。次世代画像フォーマットの種類は幾つかありますが、全てが従来画像フォーマットより軽量で圧縮率が高いのが特徴です。
JPEGの次世代の<strong>JPEG 2000</strong>と<strong>JPEG-XR</strong>と米Googleが開発しているオープンな静止画像フォーマットの<strong>WebP</strong>が多く知られていますが、今回はブラウザーのサポートや普及率が高い<strong>WebP</strong>について話したいと思います。

### WebP（ウェッピー）とは？
<blockquote>WebPは、米Googleが開発しているオープンな静止画像フォーマット。ファイルの拡張子は「webp」。ウェブサイトのトラフィック量軽減と表示速度短縮を目的としており、インターネットのWebページで広く使われている非可逆圧縮のJPEGや可逆圧縮のGIF、PNGの置き換えを意図する規格である。JPEGとは異なり、非可逆圧縮でもアルファチャンネルを扱える。
<cite>https://ja.wikipedia.org/wiki/WebP</cite></blockquote>
要するにJPGやPNGの代替が可能な画像フォーマットのことです。アルファチャンネルを扱えるので透明表現ももちろん可能。

## Webpのブラウザサポート状況
![support.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18411/9183af88-8eea-d31d-42af-a7ddd30123f6.png)
緑になっているところがサポート状況。
IE以外は最新バージョンであればほとんど利用できます。
2年前のiPhoneやAndroidでは普通に見れます。


## なぜ普及しない（個人的見解）？
まだまだ調査が足りないこともありますが、Amazonも使ってないしメルカリも使ってませんでした。
恐らくIE11で使えないからではないですか？（日本だけで2021年まだ2~3%利用ユーザーが存在する）
![スクリーンショット 2021-12-25 19.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18411/8d979c29-66c2-4c15-da7c-2f360f0c457a.png)

## Webpを使ってる企業はある？
楽天市場がWEBPを利用していました。
URLから察するにjpgをwebpに変換しているようです。「?fitin=100:100」というクエリストリングを外したら本来のjpg画像で表示されました。数字をいじったらその大きさになったので変換システムがあるようですね。
![スクリーンショット 2021-12-25 19.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18411/416f17f2-e63c-4e9c-6d15-8df69ce176d0.png)

## WebPの評価
<blockquote>Googleの示した事例では、ファイルサイズは非可逆圧縮モードで（同一画像、同等画質の）JPEGと比較して25-34%小さくなり、可逆圧縮モードでPNGと比較して28%小さくなるとしている。また22%のファイルサイズ増加でアルファチャネルを追加できるとしている。可逆圧縮は、エンコードはPNGよりも時間がかかるが、デコードはPNGよりも高速であると主張している
<cite>https://ja.wikipedia.org/wiki/WebP#%E8%A9%95%E4%BE%A1</cite></blockquote>
WIKIによると平均約30%と小さくなりますね。実際に検証もしてみます。

## WebPの評価検証
Googleが開発している<strong>[cwebp](https://developers.google.com/speed/webp/docs/cwebp)</strong>というツールを利用して<strong>JPG→WebP</strong>に変換して検証してみました。
<strong>下記の返還後の画像は画質が75%に変換（cwebpのデフォルト設定）</strong>で検証が行われました。（wikiにも書いてある通り設定変更で同一画像、同等画質にすることも可能）

###１番目画像（変換前） 1,560,772バイト（１.6MB）
<img src="https://raw.githubusercontent.com/shoridevel/image-to-webp/master/docs/images/before/thomas-chan-a3wiRpcBmgY-unsplash.jpg" alt="変換前の画像１"/>
###１番目画像（変換後） 360,120バイト(360KB)
<img src="https://raw.githubusercontent.com/shoridevel/image-to-webp/master/docs/images/after/thomas-chan-a3wiRpcBmgY-unsplash.webp" alt="変換後の画像２"/>
###１番目画像（変換結果）
サイズ削減量の計算
((360120 - 1560772) / 1560772) * 100 = -76.92680289
<strong>1.6MB→330KBになって約-77%削減になります。</strong>


###２番目画像（変換前） 1,265,962バイト（1.3MB）
<img src="https://raw.githubusercontent.com/shoridevel/image-to-webp/master/docs/images/before/lubo-minar-j2RgHfqKhCM-unsplash.jpg" alt="変換前の画像１"/>
### ２番目画像（変換後） 205,600バイト(206KB)
<img src="https://raw.githubusercontent.com/shoridevel/image-to-webp/master/docs/images/after/lubo-minar-j2RgHfqKhCM-unsplash.webp" alt="変換後の画像２"/>

###２番目画像（変換結果）
サイズ削減量の計算
((205600 - 1265962) / 1265962) * 100 = -83.759386143
<strong>1.3MB→206KBになって約-84%削減になります。</strong>


### Chromeブラウザーのインスペクターで確認
変換前（PNG）
![png2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18411/7dc6d722-a182-4308-8693-69adde9e933c.png)

変換後（WebP）
![webp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18411/ee074814-e639-3c07-39c9-14336372fa3e.png)
※ファイル名は気にしないでください。Reactを使ってるので画像名にハッシュが付きました。
ファイルサイズが小さくなりダウンロード速度が上がったことが確認できます。

## 画像フォーマットをwebpに変換するOSS公開
[Github](https://github.com/shoridevel/image-to-webp)に公開しました。
Dockerもあるので気軽にローカル環境でテストもできると思います！
手順もREADMEに書いたのでぜひお試しください。
まだ開発途中ですが、[こちらのAPI仕様書（Swagger）](https://convert-cloud.com/api-docs/)でAPI呼び出しで変換もできます。（サーバーの負荷対策で3M以上画像は変換できません）
<strong>※今は無料で使い放題ですが、悪いことするとfail2banでIP制限されてしまいます。</strong>

## 最後に
- 検証結果平均元画像より-80%までサイズ削減ができました。
- JPGやPNG（アルファチャネル）を含むwebpに変換ができます。

従来画像フォーマット(jpg, png)をwebpに変換することで画像ファイルのサイズを小さくすることができてダウンロード速度が上がることがわかりました。
まだまだ調査が足りなくてこんなにいいのになぜwebpを使っていないか？大手でも楽天市場以外に使ってるところを見つけられなかったですが、知っていたらぜひコメントなどで教えてください。