misskey-dev / misskey

🌎 An interplanetary microblogging platform 🚀
https://misskey-hub.net/
GNU Affero General Public License v3.0
9.85k stars 1.33k forks source link

画像の圧縮にAVIFかJPEG XLを使う #9283

Open tamaina opened 1 year ago

tamaina commented 1 year ago

Summary

Related to #6626, #9275

Mastodon v4からAVIFに対応したらしいので

https://caniuse.com/avif

image

saschanaz commented 1 year ago

Chromeってawait VideoEncoder.isConfigSupported({ codec: 'av01.0.01M.08', width: 256, height: 256 })するとsupported: trueだすのでAVIFエンコード不可能なのは意外です

何とかVideoEncoder使ってAVIF作る方法はないかな

acid-chicken commented 1 year ago

何とかVideoEncoder使ってAVIF作る方法はないかな

これはそんなに大変でもなさそう

tamaina commented 1 year ago

Mastodon関係なく、アニメーションでない場合(Safari, FirefoxがAnimated Avif非対応)、メディアプロキシやサムネイルではavifにするぐらいのことはして良さそう

saschanaz commented 1 year ago

Safari, FirefoxがAnimated Avif非対応

ツイッターみたいにGIF系は全て同映像に変換する方法も一応はあります

tamaina commented 1 year ago

Safari 16.4からAnimated AVIFに対応
Firefoxは113からAnimated AVIF対応?

(本当はEdgeを無視してAVIFにしたいところ)

saschanaz commented 1 year ago

妥協案でAV1にしたい説

(Safariがサポートしてなかった…)

saschanaz commented 1 year ago

image proxyでAV1➡️AVIFとか逆とかできないでしょうか

tamaina commented 1 year ago

image proxyでAV1➡️AVIFとか逆とかできないでしょうか

av1→jpgでやった方が(Mastodonに対しても)いろいろ潰しが効きそう

saschanaz commented 1 year ago

image proxyでAV1➡️AVIFとか逆とかできないでしょうか

av1→jpgでやった方が(Mastodonに対しても)いろいろ潰しが効きそう

なぜwebpじゃなくjpgでしょう

tamaina commented 1 year ago

av1→じゃなくてavif→か

webpじゃなくjpg

ActivityPubを拡張しちゃえばMastodon v3がwebp対応していない問題にも対応できそう

tamaina commented 1 year ago

…webpでいいか(実装がややこしいのと透過対応しないなと思った)

saschanaz commented 1 year ago

v3 forkでもその気さえあればWebP対応するのはそこまで難しくないはずですので

tamaina commented 1 year ago

Edge 114 (6月第1週リリース) より、AVIF がデフォルトでアクティブ化されるようです。 https://twitter.com/xakuro_com/status/1647606715792379906

tamaina commented 1 year ago

全部avifにするか

acid-chicken commented 1 year ago

JPEG XL がプログレッシブかつ JPEG から損失なし変換できるのはかなり魅力的なんだけど Chrome サポート終了の件で非常に悩ましい

saschanaz commented 1 year ago

AVIFもprogressiveできるらしいです https://github.com/AOMediaCodec/av1-avif/pull/134

saschanaz commented 1 year ago

JPEG や WebP から損失なし変換できる

JPEGからはできますがWebPからはできないはず

acid-chicken commented 1 year ago

記憶違いかも……(なんか 3 コーデックぐらいあった気がするんだけど他なんだっけ)

acid-chicken commented 1 year ago

AVIFもprogressiveできるらしいです https://github.com/AOMediaCodec/av1-avif/pull/134

全部 AVIF にするか

tamaina commented 1 year ago

AVIF progressive、sharp.jsにはprogressiveオプションないけど大丈夫かしら

((sharpのlibvipsで使っている)rav1eが対応しているのかみたいな)

acid-chicken commented 1 year ago

画像圧縮 sharp やめて Rust ベースに移行するか

tamaina commented 1 year ago

Sharpでやってるのは縮小とかbadge生成とかもあるので(まあ圧縮部分だけRustにすればいいだろうけど)

rav1eじゃなくてlibaom使ってた https://github.com/lovell/sharp-libvips/issues/97

tamaina commented 1 year ago

wasmビルドも作って欲しい(Service Worker内で実行する)

acid-chicken commented 1 year ago

Sharpでやってるのは縮小とかbadge生成とかもあるので(まあ圧縮部分だけRustにすればいいだろうけど)

全部 Rust ベースにして良さそうじゃね

wasmビルドも作って欲しい(Service Worker内で実行する)

misskey-dev/slacc はあくまでバインディングのみを目的としているからロジックは分離して slacc 経由でのバックエンドバインドと wasm バインドそれぞれ作ればよさそう

tamaina commented 1 year ago

全部 Rust ベース

まあ可能なら(もはやそれ単体ですごいライブラリだと思う…)

acid-chicken commented 1 year ago

全部 Rust ベース

まあ可能なら(もはやそれ単体ですごいライブラリだと思う…)

優れた crate がいっぱいあるしそこまで大変でもないと思う(楽観視)

acid-chicken commented 1 year ago

😅 image

acid-chicken commented 1 year ago

とりあえず libavif で未リリース機能としては存在するっぽい https://github.com/AOMediaCodec/libavif/blob/905e30049fda48053fc2049bc08422cdb3292ac8/CHANGELOG.md#unreleased

acid-chicken commented 1 year ago

libaom にありそう https://github.com/m-ab-s/aom/blob/79fc28c8a0592850456a8ed3e23e70e358e79ad7/aom_dsp/pyramid.c#L166-L193

tamaina commented 1 year ago

そういう調子だとブラウザのデコーダーが対応してるか怪しくない?

saschanaz commented 1 year ago

https://github.com/AOMediaCodec/av1-avif/pull/134 で追加されたファイルのデコーディングはFirefox/Chrome/Safariで全部問題なさそうです

tamaina commented 1 year ago

Speed: the encoding process is single-threaded and dead slooow (I mean, really, really slow) - encoding a single 3072*2048 pixel image using the default options above takes ~4 min!

https://github.com/saschazar21/wasm-rav1e

wasmやっぱ遅いのか

saschanaz commented 1 year ago

https://github.com/kleisauke/wasm-vips もあります

tamaina commented 1 year ago

(生vips使いたくない…と思ったけどd.tsがあるからまだマシかしら)

tamaina commented 1 year ago

(wasm、ネイティブより遅いのとバンドルサイズが馬鹿にならないのは注意すべきよね)

acid-chicken commented 1 year ago

どのみちメディアが十分大きいしキャッシュ効くから気にするほどではない

tamaina commented 1 year ago

そろそろ手をつけたいがまだむり

tamaina commented 1 year ago

Edgeってavif対応したんだろうか

tamaina commented 1 year ago

Edge 114はダメらしい

saschanaz commented 1 year ago

https://front-end.social/@jensimmons/110497266298128289

Yes, Safari 17 supports JPEG XL.

👀

tamaina commented 1 year ago

JPEG XLにするか

tamaina commented 1 year ago

(webpでも他のソフトに取り込めないとそれなりに文句が出てるわけだけど、jpeg xlにしたら大変なことになりそう)

tamaina commented 1 year ago

ん、Firefoxはトグルがデフォルトでオフなのか

@saschanaz なんとかして

saschanaz commented 1 year ago

サーバーどうしにAccept="image/jxl"とかしたらなんとかなるかも

tamaina commented 1 year ago

Chromeもデフォルトが無効だった

ijs01140 commented 7 months ago

Edgeも121からAVIFに対応したようです https://caniuse.com/avif image

temtemy commented 7 months ago

I don't think browser support should matter much in JPEG XL. It supports compressing legacy JPEG images further without any quality loss (while being fully reversible bit-by-bit), so we can reencode all saved JPEGs as JPEG XL internally and just serve JPEG on-the-fly. That's some free storage just waiting to be reclaimed for pretty large servers like misskey.io (up to 20% filesize saved on average)

tamaina commented 7 months ago