【jpegtran】 出来る！ベースラインJPEG ⇔ プログレッシブJPEGのロスレス変換

# さよならプログレッシブJPEG。ようこそベースラインJPEG。


# ロスレス変換
## 実行環境
* Windows 10 Pro (x64)
* jpegtran (Version 9d 12-Jan-2020)

## Windowsバイナリ
* New jpegtran features
  https://jpegclub.org/jpegtran/

* mozilla/mozjpeg: Improved JPEG encoder.
  https://github.com/mozilla/mozjpeg/

※ 今回は ``jpegclub`` 版の ``jpegtran`` を使ってまいす。

※ (2021/03/30) ``jpegclub`` 版と  ``mozjpeg`` 版で ``jpegtran`` でのコマンド オプションが異なるので、追記。


## コマンド
### ``jpegclub`` 版の ``jpegtran``
```bat:command
@REM プログレッシブJPEGをベースラインJPEGへ変換。
@REM 特別オプションがない場合はベースラインJPEGが出力される。
jpegtan.exe -outfile baseline.jpg progressive.jpg

@REM ベースラインJPEGをログレッシブJPEGへ変換。
@REM -progressive オプションをつける
jpegtan.exe -progressive -outfile progressive.jpg baseline.jpg
```

### ``mozjpeg`` 版の ``jpegtran``
※ ``jpegclub`` 版の ``jpegtran`` とデフォルトが逆なので注意

```bat:command
@REM プログレッシブJPEGをベースラインJPEGへ変換。
@REM mozjpeg版のデフォルトはログレッシブのため、
@REM -revert オプションを付ける。
jpegtan.exe -revert -outfile baseline.jpg progressive.jpg

@REM 標準入出力も使えます
jpegtan.exe -revert < progressive.jpg > baseline.jpg 

@REM ベースラインJPEGをログレッシブJPEGへ変換。
@REM mozjpeg版のデフォルトはログレッシブのため、
@REM 指定無しでベースログレッシブJPEGが出力される。
jpegtan.exe -outfile progressive.jpg baseline.jpg

@REM mozjpeg版では標準入出力も使えます。
jpegtan.exe < baseline.jpg > progressive.jpg
```


# 検証
## 利用ツール
* Photoshop CC 2021 x64  の ``WEB用に保存 (従来)``  
* WinMerge x64 v2.16.8.1
* IrfanView x64 v4.51

# 検証⓪ 一般ツールによるロッシー変換検証👎 (ただの書き出し直し)
## 手順
1. **Photoshop** で **プログレッシブJPEG** を作る。  
  ⇒ ``sample.jpg``
2. **Photoshop** で **プログレッシブJPEG** から **ベースラインJPEG** を作る。  
  ``sample.jpg`` ⇒ ``baseline.jpg``
3. **Photoshop** で **ベースラインJPEG** から **プログレッシブJPEG** を作る。  
  ``baseline.jpg`` ⇒ ``progressive.jpg``
4. **WinMerge** で比較する。
5. **Irfanvie** で情報を比較する。

## 結果
### 1.PhotoshopでプログレッシブJPEGを作る
⇒ ``sample.jpg``
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/c9f1514b-fbb0-49aa-6cfe-4278dd1ad02e.jpeg)
※ pixivでは年齢制限がかかっているのでモザイク処理

### 2. PhotoshopでプログレッシブJPEGからベースラインJPEGを作る。
katuai

### 3. PhotoshopでベースラインJPEGからプログレッシブJPEGを作る。
katuai

### 4. WinMergeで比較する
沢山差異が出てくる。比較方法としては上々。
ぱっと見わかんないのでサンプルとして微妙(苦笑)。
(上が差分のハイライトあり。下はハイライトなし)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/cd368f01-4cbc-f10e-14b4-878955b73196.png)

### 5. Irfanvieで情報を比較する
ファイルサイズに大きな差は見られないが、再劣化のせいか色数が変化している。
比較方法としてが上々。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/a0efbbdf-f8aa-1e9d-3c30-aafb1c44b625.png)
う～ん、ロッシー。。。

# 検証① jpegtanロスレス変換検証👍
## 手順
1. **Photoshop** で **プログレッシブJPEG** を作る。  
  ⇒ ``sample.jpg``
2. **jpegtan** で **プログレッシブJPEG** を **ベースラインJPEG** に変換。  
  ``sample.jpg`` ⇒ ``baseline.jpg``
3. **jpegtan** で **ベースラインJPEG** を **プログレッシブJPEG** に変換。  
  ``baseline.jpg`` ⇒ ``progressive.jpg``
4. **WinMerge** で比較する。
5. **Irfanvie** で情報を比較する。

## 結果
### 1.PhotoshopでプログレッシブJPEGを作る。
⇒ ``sample.jpg``
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/c9f1514b-fbb0-49aa-6cfe-4278dd1ad02e.jpeg)
※ pixivでは年齢制限がかかっているのでモザイク処理

### 2, 3 jpegtanで変換。
```bat:command
@REM 2. sample.jpg ⇒ baseline.jpg
jpegtran.exe -outfile baseline.jpg sample.jpg
@REM 3. baseline.jpg ⇒ progressive.jpg
jpegtran.exe -progressive -outfile progressive.jpg baseline.jpg
```

### 4. WinMergeで比較する。
WinMergeさんの回答。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/6f4e20f0-7637-5786-1528-93e5f726e798.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/fd8255ca-a2ff-5957-ed9c-541c47ad3aab.png)
確かにぱっと見変なところ無い。
(もともとそんなにわかんないけど(苦笑))

### 5. Irfanvieで情報を比較する。
ファイルサイズやクオリティ情報などにもおかしな点は見られない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/38933a1a-3a13-4646-f194-5d22415e7150.png)

# 後記
Walkmanの三大欠点と言えば
1. ATRACKを廃止したのに代替のギャップレスの音声フォーマットが無い
2. プレイリストが上のフォルダに上れない
3. アルバム アートがプログレッシブJPEG非対応
と言う割とひどいクズっぷりなのだけど。

アルバム アートについては、このご時世にプログレッシブJPEG非対応ってのはほんとツラい。。。

どうしたって、頑張ってネットの海から集めなきゃなんないじゃん？昔のCDなんか特に。せっかく頑張ってアルバム アート用画像集めても、ベースラインかプログレッシブかなんて、パット見わからないし。ただでさえ判定方法も手順的には難しそうなのに、さらに音声データに登録されてりる中から探すとか。どすりゃ良いのさ。マイナーなフォーマットってわけでも無いのに。。。

そんなわけで、Walkmanのアルバム アートの ``プログレッシブJPEG`` を ``ベースラインJPEG`` に変換するにあたり、なんとかロスレス変換出来ないものかと思い、JPEGの仕様を読もうと思って諦めの瞬殺。そんなかで見つけた ``jpegtan`` まさに理想のツールだったため非常にありがたかった。

直近のものいくつかは画像データそのままあるから、まずはそこから走査と思うのだけど。さて、判定はどうしたものか。。。

``jpegtan`` によって、``ベースラインJPEG`` - ``プログレッシブJPEG`` のロスレス変換が可能、と言う証明がされたので、改めて自分で実装してみるのも面白そう。良い勉強になりそう。いい加減 ``可変長Bit表現`` とかも理解したいし。


# 余談
『 ``JPEGはジェイペグと読みます`` 』 って押し付けてくるの、とっても嫌いがあります。
MPEGも。





# 参考 (謝辞)
* New jpegtran features
  https://jpegclub.org/jpegtran/

* JPEGツール/同人野郎のためのWEBサイトづくり
  http://rinrin.saiin.net/~aor/hms/jpegtools3

* ◆JPEGのbaseline判定ツール（jpeg構造解析ソース付き）: 万象酔歩
  http://k-hiura.cocolog-nifty.com/blog/2018/10/jpegbaseline-3f.html

* Independent JPEG Group's JPEG software の使い方#JPEGTRAN (usage.doc)
  https://cetus.sakura.ne.jp/softlab/software2/jpeg6b_usage_j.html#JPEGTRAN

* Mozilla 製 JPEG エンコーダー「mozjpeg」 - Qiita
  https://qiita.com/bezeklik/items/05cc23c0b053706d4fea

* Lossless jpegtran applications
  https://jpegclub.org/losslessapps.html
* MozJPEGとコマンドラインツール – Aoyumi Notes
https://aynote.wordpress.com/2017/08/12/mozjpeg%E3%81%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB/