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

tamaina commented 1 year ago

Mastodon v4はあまり普及してないので後回しかな

saschanaz commented 1 year ago

Mastodon v4はあまり普及してないので

これに関してなにかデータとかありますか?ただ気になるだけですが

tamaina commented 1 year ago

まず大きなインスタンス(fedibird, mstdn.jp)あたりが対応しないことには…

tamaina commented 1 year ago

よしんばMastodon v4が普及したとしてもImageMagick 7が必要なので対応するインスタンスは限られそう(v6が広く使われているようなので)

ImageMagick supports AVIF. As ofversion 7.0.25, it supports AVIF compression natively. https://avif.io/blog/tutorials/imagemagick/#imagemagicksupportsavif

saschanaz commented 1 year ago

FedibirdはまだMastodon 3.4.1使っているし、時間かかりそうですね

tamaina commented 1 year ago

MEMO: Webpもv4からっぽい https://github.com/mastodon/mastodon/commit/379a7a7ca7cf913cbc130a6323f821b534fc14c4

tamaina commented 1 year ago

Mastodonや他のソフトウェアが問題なので、高互換と圧縮優先の2種類を用意して使い分けるというのはどうだろう
(ただ2種類をストレージに保存するのは微妙、片方をプロキシにする?)

tamaina commented 1 year ago

AVIFを検討するならJPEG XLも検討して良さそうだけど、ブラウザの対応が全滅している

image

https://caniuse.com/jpegxl

Sharp.jsの対応も面倒 https://github.com/lovell/sharp/issues/2731#issuecomment-1349856411

tamaina commented 1 year ago

片方をプロキシにする?

圧縮優先低互換の方をストレージに保存するのがサーバーのCPU的にもストレージ的にも無難そう

tamaina commented 1 year ago

avifは重たすぎるし、jpeg xlはブラウザ対応の見込みがわからないためnot planned

acid-chicken commented 1 year ago

AVIF 重いのは昔の話では

saschanaz commented 1 year ago

avifは重たすぎるし

WebPに比べてどのくらい重たいのか数字をみたいですね

acid-chicken commented 1 year ago

なんなら WebP (VP8) エンコーダー (libwebp) の方が wasm に持ち込むのが高コストという事象などがある

tamaina commented 1 year ago

WebPに比べてどのくらい重たいのか数字をみたい

sharp.jsで試してみるか

なんなら WebP (VP9) エンコーダーの方が wasm に持ち込むのが高コストという事象

ならサーバーで圧縮するのはwebp, クライアントではavifにするとかの対応もありうる

saschanaz commented 1 year ago

WebPってVP9サポートします?

acid-chicken commented 1 year ago

WebPってVP9サポートします?

すみません VP8 です

tamaina commented 1 year ago

sharp-webp-avif-test

webp (smartSubsample: false) vs avif

image

webp (smartSubsample: true) vs avif

image

tamaina commented 1 year ago

effort 0, smartSubsample false

image

tamaina commented 1 year ago

effort: 0だと、avifは写真は得意だがイラストがかなりノイズが多くなる

saschanaz commented 1 year ago

effort: 1もかなりノイズありますね。rav1e使うとどうなるかなと調べてみましたがsharpはlibvipsからencoder選べる機能がなかったです。https://github.com/lovell/sharp/issues/3582

wasm-vipsも試して見たかったですがAVIFサポートがなかったです https://github.com/kleisauke/wasm-vips/issues/44

tamaina commented 1 year ago

avifの個人的な指針

写真:
quality: 50, lossless: false, effort: 1

イラストlossy:
quality: 80, lossless: false, effort: 1
※qualityを上げるだけでかなり改善する

イラストロスレス: webpを用いる [webpより遅い割に、圧縮率はほぼ差がない]

saschanaz commented 1 year ago

でも写真とイラスト区分ができないですね

lossyだと圧縮の結果のサイズの違いが大きいのでオプションで両方できるようにするのはどうでしょう。

tamaina commented 1 year ago

写真とイラスト区分ができない

sharp.jsのstats()のentropyを見てなんとなく判断できないかな

tamaina commented 1 year ago

7以上は写真とみなすとか

saschanaz commented 1 year ago

test 4 この映像のentropy 7.023でました

saschanaz commented 1 year ago

sharpnessもほぼ違いないような…ううん

tamaina commented 1 year ago

image

じゃ、じゃあ7.1で(超適当

tamaina commented 1 year ago

原神のスクショってどうなんだろう(たまにベンチマークとかこういった用事で開くんだけど5GBのダウンロードが…

tamaina commented 1 year ago

image

7.3328

tamaina commented 1 year ago

これをresize 1024x1024 insideしてquality: 50, lossless: false, effort: 1でavifにしたら悲惨なことになってしまった

tamaina commented 1 year ago

ただ写真もディティールが低下したので、quality設定はターゲットとなる解像度によって変えるべきという感じがする

saschanaz commented 1 year ago

写真的なエフェクトだせたイラストのentropyって本物の写真より高く、7.6まで出てきました

saschanaz commented 1 year ago

これ7.8

3v58Hag9 jpg medium

tamaina commented 1 year ago

わー、これを写真品質をターゲットにして圧縮したら大変厳しいことになりそう

tamaina commented 1 year ago

イラストロスレス: webpを用いる [webpより遅い割に、圧縮率はほぼ差がない]

2048x2048にリサイズするとavifの方が有利になってくる

saschanaz commented 1 year ago

写真的なエフェクトだせたイラストのentropyって本物の写真より高く、7.6まで出てきました

逆に写真にテキスト加える場合とかも考えたいです

tamaina commented 1 year ago

image

文字がデカすぎたかも

saschanaz commented 1 year ago

文字がデカすぎたかも

あれはそうですね

tamaina commented 1 year ago

image

avifらしく?人間の目で見るとなんとかなっている

saschanaz commented 1 year ago

え、思ったより悪くありません

saschanaz commented 1 year ago

でもmisskey.artの方々からは不満があるかも?🤔

saschanaz commented 1 year ago

その場合には運営から調整できるようにオプション作ったら何とかなりそうです

tamaina commented 1 year ago

image

ふむ

saschanaz commented 1 year ago

なーーーんか色がちょっと違いませんか?気のせい?

tamaina commented 1 year ago

空の色は薄くなっている気がする

tamaina commented 1 year ago

今すぐできるsharp.jsで比較してるけど、よく考えたら実装の際はブラウザサイドでの圧縮が主になると思うので、これ意味ないかも

tamaina commented 1 year ago

なーーーんか色がちょっと違いませんか?

元画像のpngがDisplay P3なので、何も指定しないとsharpはsrgbに変換するので色は若干淡くなる

saschanaz commented 1 year ago

今すぐできるsharp.jsで比較してるけど、よく考えたら実装の際はブラウザサイドでの圧縮が主になると思うので、これ意味ないかも

言われてみればFirefoxもChromeもAVIFエンコードなんてサポートしてなかったです

await new OffscreenCanvas(1,1).convertToBlob({ type: "image/avif" })実行したらPNGが出てきます

tamaina commented 1 year ago

canvas.toBlobでavif吐けるブラウザあるの
(そうだとしてもtoBlobは細かい司令できない

ブラウザはwasm前提で

acid-chicken commented 1 year ago

photon-rs を呼び出すサブセット Rust モジュールを wasm にすればよさそう