【Twitter/X】画像・イラストをほぼ劣化なしで高画質・高品質にアップロードする方法

# はじめに
- 筆者は、イラストレーター・写真家・画像のプロ・色の専門家ではありません。不適切な箇所、間違い等あるかもしれません。
  - （コメント等でそっと教えていただけると助かります。）
- ここで取り扱うのは、画像を高画質・高品質に保存できる外部サイトなどを利用するのではなく、あくまでTwitter内で閉じる前提での議論および検証です。
- 検証は、2022/06/04前後でのTwitterの仕様にもとづいています。
- 画像の「サイズ」という用語がわかりにくいので、この記事では以下のように使い分けています。
  - 画像サイズ：画像の縦横のピクセル数（例：1920x1080）
  - 画像容量：画像のデータサイズ（例：10MB）

# 結論
## 推奨方法
- ここでは、①～④の手順を順番に行います。
- ① イラストデータ（psdなど）をpng形式で書き出します。
  - 画像サイズは「**FullHD(1920x1080)相当以上、4096x4096以下**」にします。
- ② 何らかのソフトウェア（例：[paint.net](https://www.getpaint.net/index.html)）を用いて、png形式から**jpeg形式**に変換（jpegで保存）します。
  - 「**品質**」を「**97**」に設定します。
  - 「**クロマサブサンプリング**」の項目がある場合は、「**4:4:4**」を選択します。
- ③ ②で書き出したjpegの画像容量が「**5MB以下**」であればOK。
  - そうでない場合は、以下のいずれかもしくは全部を実施して画像容量の削減を試みます。
    - ①に戻ってpng画像を少し縮小する。
    - ②の「品質」を少し下げる。（1ポイントでも大きく容量を削減できます。）
    - ②の「クロマサブサンプリング」で、（色味に納得できれば）「4:2:2」を選択する。
- ④ 得られたjpegをTwitterにアップロードします。
- ※psdからpngを経由せずに上記に準じるような設定で、直接jpegで書き出してもOKだと思われます。
  - 下記の検証2では、[CLIP STUDIO PAINT](https://www.clipstudio.net/)を用いて1例のみトライし、ほぼ劣化なし投稿に成功しました（[追加テスト、ID=31](https://qiita.com/Navier/items/51b29fe81321644ea808#%E8%BF%BD%E5%8A%A0%E3%83%86%E3%82%B9%E3%83%88)）。
## 非推奨行為
- 画像をpng形式でアップロードする。
  - アップロード時に高圧縮jpeg変換が強制的に適用され、低品質なjpeg画像になると思われます。
  - ダウンロード時に画像のURLで「format=png」としても、おそらくjpeg→pngと再変換されるだけで、アップロード時の高圧縮jpeg変換は回避できないと思われます。
- jpeg画像を5MB以上の大きい画像容量のままアップロードする。
- FullHD相当未満の画像サイズでアップロードする。
  - アップロード時の高圧縮jpeg変換が強制的に適用される可能性があります。
- jpeg書き出し時に「品質」を「99」や「100」に設定する。
  - 画像容量が小さい場合でも、アップロード時の高圧縮jpeg変換が適用されてしまうケースがありました。
  - 後述の「圧縮率が1ピクセル／バイトより悪くないこと」が満たせなくなることが理由だと考えられます。
- jpeg書き出し時に「品質」を「95未満」に設定する。
  - 「イラスト画像」において、拡大したときに見えるノイズに対して、筆者がOKと思えるラインが95くらいでした（個人差あり）。
- jpeg書き出し時に「クロマサブサンプリング」で「4:2:0」を選択する。
  - 色味が変わってしまう可能性があります。

---
- 以下では、この記事を書くに至った動機や検証について書いています。

# ことの発端
- フォローしているイラストレーターさんのツイート
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Twitterに上げる絵せっかくなら画質の劣化防げないものか…😭<br>透過pngとかjpgにしたり縦横サイズいじったり色々試したけど、長辺900pxにする（劣化無いけど小さい）orデカいサイズにして気にならなくするorいっそそのまま上げるかって感じになってる</p>&mdash; 乃木𝕃ief 🍀🍀🍀🍀🍀🍀🍀 (@Lbx_Lief) <a href="https://twitter.com/Lbx_Lief/status/1532717584155811841?ref_src=twsrc%5Etfw">June 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- これは調べるしかない…！（だってキレイなイラスト見たいじゃないですか…！）

# Twitterで画質劣化が発生する理由
- Twitterで画質劣化が発生する理由は、画像をアップロードする際にある条件を満たさないと、Twitter側で低品質な高圧縮jpeg変換アルゴリズムにかけられてしまうからです。
- Twitter公式的には、以下のように説明されています。
  - [Twitter、高画質JPEG画像をほぼ劣化させず表示するように　長辺4096ピクセル・5MBまで](https://www.itmedia.co.jp/news/articles/1912/12/news125.html)
>（1）画像に回転情報がないこと
（2）長辺が4096ピクセル以下であること
（3）ファイルサイズが5MB以下であること
（4）圧縮率が1ピクセル／バイトより悪くないこと（つまり500万画素未満にもかかわらず5MBになるような低い圧縮率ではないこと）
──という条件をクリアしたjpeg画像であれば、画質をほとんど下げずにアップロードできる
- しかし、今回行った検証では、この基準を満たす画像に対しても、高圧縮jpeg変換アルゴリズムが適応されてしまうケースがありました。（[検証2のID=7,8の比較](https://qiita.com/Navier/items/51b29fe81321644ea808#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E7%94%BB%E5%83%8F1)）
- したがって、「[結論]()」では、この変換が適用されないようにする推奨方法と、変換が適用されてしまったり品質が下がりやすい非推奨行為を紹介しています。

# jpeg画像の品質について
- [paint.net](https://www.getpaint.net/index.html)では、画像をjpeg形式で保存するときに2つの項目を選択できます。
![スクリーンショット 2022-06-04 030101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/14597ea3-74e3-7b5c-e6f8-df1d6099cfba.png)
- 品質（q）
  - 0～100まで選択でき、値を小さくするほど画像の容量を小さくできる一方で、画質が劣化します。
  - 「圧縮率」「圧縮レベル」「品質」「クオリティー」などソフトウェアによって名称が異なります。
  - 「[Googleが薦める「Jpegの品質は85」を検証する](https://qiita.com/miyanaga/items/a616261de490cc342d08)」によると、q=85あたりを境に変化率が急激に変化するようです。
- クロマサブサンプリング（s）
  - 詳しいことは他の記事に任せるとして、簡単に言うと、どれくらい色情報を正確に記録しますかということです。
    | クロマサブサンプリング | 色の情報量 | 画像容量 |
    | :---: | :---: | :---: |
    | 4:4:4 | 多 | 大 |
    | 4:2:2 | 中 | 中 |
    | 4:2:0 | 少 | 小 |
  - どのクロマサブサンプリングが利用できるかはソフトウェアによって異なります。
  - 「4:2:2」や「4:2:0」では、人間の視覚特性を利用して、色差の情報量を落としています。
  - 「4:2:2」でも、多くのハイエンドデジタル・ビデオ形式およびインターフェイスで採用されているので、一般的には高品質と思われる水準です。

# 検証内容
- 今回は、「品質」と「クロマサブサンプリング」の2つの項目を色々振り、Twitterにアップロード・ダウンロードして、見た目の品質を調べてみました。
  - 検証1：アップロード前のjpeg画像の見比べによって、イラスト画像における「品質」と「クロマサブサンプリング」の妥協点を探ります。
  - 検証2：jpeg画像をTwitterにアップロードした後、ダウンロードを行い、画像容量や画像そのものを見比べることで、どのような条件ならTwitterの高圧縮なjpeg変換アルゴリズムを回避できるのか調べます。

# 用意した画像
- 今回は実画像ベースの検証の方がより説得力が増すと思い、[原神公式からpng形式で配布されている壁紙](https://genshin.hoyoverse.com/ja/news/detail/16987)を使わせていただくことにしました。
  - サンプル画像1：png、2560x1440、5.35MB
![original_2560x1440_5.35MB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/730f7156-25f3-d347-e3b9-cd68a69e2f54.png)
  - サンプル画像2：png、2560x1440、5.40MB
![another_original_2560x1440_5.40MB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/6fa0153e-98c7-0068-fa5f-75c2cbfaf120.png)
  - サンプル画像3：png、2560x1440、1.97MB
![sample3_2560x1440_3.70MB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/c0102a57-053e-3922-6139-368868116e80.png)
  - サンプル画像4：png、1125x2436、4.10MB
![sample4_1125x2436_4.10MB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/6ebd9b09-9ba4-20e6-fdda-e8abc112f19e.png)
  - サンプル画像5：png、1125x2436、3.71MB
![sample5_1125x2436_3.71MB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/515ef88d-b370-367b-71ed-38363821071e.png)
- また、画像サイズが検証に不足していたので、png形式の画像の持ち合わせとしてあったiPadの壁紙も用いることにしました。（ただし、ここに掲載するには容量が大きすぎるので、縮小版を掲載しています。）
  - サンプル画像6：png、4084x5450、30.7MB
![resize40_1634x2180_5.57MB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/89c8f182-2013-17be-1b7b-28c75b36c452.png)
# 検証1
- ここでは、アップロード前にpng→jpeg変換した画像を見比べることによって、「イラスト画像」における「品質」と「クロマサブサンプリング」での違いを見ます。

## 品質（q）による違い
- 共通：クロマサブサンプリング「4:4:4」
- 拡大画像1（元画像：サンプル画像1）
  - 左上：q=100、右上：q=95、左下：q=90、右下：q=85
![s444_1(q100_q95_q90_q85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/5235194c-29b8-e063-289a-9f290f7c4a8d.png)
- 拡大画像2（元画像：サンプル画像1）
  - 左上：q=100、右上：q=95、左下：q=90、右下：q=85
![s444_2(q100_q95_q90_q85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/0716f6b5-47bf-7b09-895a-8b9b853b1fa0.png)
- 「[Googleが薦める「Jpegの品質は85」を検証する](https://qiita.com/miyanaga/items/a616261de490cc342d08)」で述べられている通り、q=85では拡大するとかなりノイズが観察されました。
- 個人的にはイラストを壁紙にすることが多いので、95以上あると嬉しいかなと思いました。

## クロマサブサンプリング（s）による違い
- 共通：品質「100」
- 拡大画像（元画像：サンプル画像1）
  - 左：s=4:4:4、中央：s=4:2:2、右：s=4:2:0
![q100(s444_s422_s420).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/689bb4d6-3923-d58f-5df1-18a934489276.png)
- 赤色や青色の違いはわかりにくいですが、緑色では意外と違いがわかるという結果になりました。
  - 風スライム（各画像右上の緑色のスライム）の輪郭線がわかりやすいと思います。
- よって、緑色の成分が多いイラストの場合は「4:4:4」を選択するのが良いかなと思いました。
- 一方で、「4:2:2」を選択しても色味に影響ないと感じられる場合は、これを選択することで画像の容量を削減することができます。
  - 今回の検証で用いた画像では「4:4:4」→「4:2:2」にすることで約30%ほどの容量を削減することができました。

# 検証2
- ここでは、アップロード時にTwitterの高圧縮jpeg変換を回避できる条件を探ります。
- 高圧縮jpeg変換を回避できたかどうかは、アップロード時の画像容量とダウンロード時の画像容量から判断しています。
  - もちろん数枚に関しては直接見て見た目の品質においても確認しています。
- 以下の表をもとに考えた予想ですが、「（4）圧縮率が1ピクセル／バイトより悪くないこと」において評価される圧縮率（c）は、品質（q）とクロマサブサンプリング（s）と画像固有の特性（i）の関数になっているのではないかと思いました：
  - $$c = f(q, s, i)$$
- よって、最も安全めな設定は「q=95, s=4:2:2」で、最も攻めた設定が「q=99, s=4:4:4」もしくは「q=100, s=4:2:2」ではないかと思います。
- 「[Twitter、高画質JPEG画像をほぼ劣化させず表示するように　長辺4096ピクセル・5MBまで](https://www.itmedia.co.jp/news/articles/1912/12/news125.html)」に掲載されているNolan O'Brien氏のツイートでは、ツイート文から「q=97, s=4:4:4」の設定で投稿されていることが推測できるので、本記事の推奨設定としてもこの設定を採用することにしました。
  - ちなみに本検証でもサンプル画像5に対して、この推奨設定で成功しています（[ID=30](https://qiita.com/Navier/items/51b29fe81321644ea808#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E7%94%BB%E5%83%8F6)）。

---

## サンプル画像1
| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|  1 | 100 | 444 | 2560x1440 | 4.46MB |  735KB | × |
|  2 | 100 | 444 | 2048x1152 | 2.84MB |  489KB | × |
|  3 | 100 | 444 | 1920x1080 | 2.62MB |  450KB | × |
|  4 | 100 | 422 | 2560x1440 | 3.34MB | 3.01MB | ○ |
|  5 | 100 | 420 | 2560x1440 | 2.73MB | 2.44MB | ○ |
|  6 |  99 | 444 | 2560x1440 | 3.32MB | 3.01MB | ○ |
|  7 |  99 | 444 | 2048x1152 | 2.13MB | 1.93MB | ○ |
|  8 |  99 | 444 | 1920x1080 | 1.98MB |  451KB | × |
|  9 |  95 | 444 | 2560x1440 | 1.78MB | 1.64MB | ○ |
| 10 |  95 | 422 | 2560x1440 | 1.51MB | 1.38MB | ○ |
| 11 |  95 | 420 | 2560x1440 | 1.34MB | 1.22MB | ○ |

## サンプル画像2
| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 12 | 100 | 422 | 2560x1440 | 3.69MB |  845KB | × |
| 13 |  99 | 444 | 2560x1440 | 3.97MB |  860KB | × |
| 14 |  99 | 422 | 2560x1440 | 3.10MB | 2.79MB | ○ |
| 15 |  98 | 444 | 2560x1440 | 3.17MB | 2.90MB | ○ |
| 16 |  95 | 444 | 2560x1440 | 2.21MB | 2.03MB | ○ |
| 17 |  95 | 422 | 2560x1440 | 1.80MB | 1.65MB | ○ |

## サンプル画像3
| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 18 | 99 | 444 | 2560x1440 | 1.97MB | 1.83MB | ○ |

## サンプル画像4
| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 19 | 99 | 444 | 1125x2436 | 2.19MB | 2.01MB | ○ |

## サンプル画像5
| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 20 | 99 | 444 | 1125x2436 | 2.81MB |  603KB | × |
| 21 | 99 | 422 | 1125x2436 | 2.18MB | 1.96MB | ○ |
| 22 | 98 | 444 | 1125x2436 | 2.26MB | 2.07MB | ○ |

## サンプル画像6
| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 23 | 99 | 444 | 2042x2725 | 5.68MB |  628KB | × |
| 24 | 99 | 444 | 1634x2180 | 3.39MB |  409KB | × |
| 25 | 99 | 422 | 2042x2725 | 3.87MB | 3.57MB | ○ |
| 26 | 99 | 422 | 1634x2180 | 2.34MB | 2.15MB | ○ |
| 27 | 98 | 444 | 2450x3270 | 5.29MB |  858KB | × |
| 28 | 98 | 444 | 1634x2180 | 2.42MB | 2.24MB | ○ |
| 29 | 98 | 422 | 2450x3270 | 3.86MB | 3.58MB | ○ |
| 30 | 97 | 444 | 2450x3270 | 4.29MB | 3.98MB | ○ |

## 追加テスト
- psdデータから直接jpegで書き出したデータ（ここでは、品質=97では5MBを越えてしまったため、96にしています。）

| ID | 品質（q） | クロマサブサンプリング（s） | 画像サイズ | 画像容量（UP時） | 画像容量（DOWN時） | 回避できたか |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 31 | 96 | - | 3508x2480 | 4.37MB | 4.20MB | ○ |

# まとめ
- 本記事では、Twitterで「イラスト画像」の画像劣化をなるべく防いで高画質・高品質にアップロードする方法について検証を行い、まとめました。
- 今回の検証に用いた画像は少ないため、もしかすると、推奨方法に則っても高圧縮jpeg変換がかかるかもしれません。
  - そのときは、ごめんなさい。
- この記事が参考になれば幸いです。

# 参考文献
- [Twitter、高画質JPEG画像をほぼ劣化させず表示するように　長辺4096ピクセル・5MBまで](https://www.itmedia.co.jp/news/articles/1912/12/news125.html)
- [クロマサブサンプリング（Wikipedia）](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%9E%E3%83%BB%E3%82%B5%E3%83%96%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0)
- [4:4:4と4:2:0 - 映像情報メディア学会](https://www.ite.or.jp/contents/keywords/FILE-20120103130828.pdf)
- [Googleが薦める「Jpegの品質は85」を検証する](https://qiita.com/miyanaga/items/a616261de490cc342d08)