Windowsのターミナルエミュレータでwebp画像を表示したい話

# はじめに
CLIファイルマネージャーというものに先日出会い導入してみたが、Windows上で拡張子がwebpの画像を表示することができずにいる。しかし、何を試したか把握する為にここに備忘録として残しておく。
## 実行環境
・OS: Windows11 23H2
・ターミナルエミュレータ: Wezterm (20240203-110809-5046fc22)
・ファイルマネージャ: lf (r32)
## Wezterm
### 概要
・Rustで書かれた、クロスプラットフォームで新しいターミナルエミュレータ
・高いカスタマイズ性（と聞いている）

https://wezfurlong.org/wezterm/index.html

### 導入方法
1. [Weztermの公式ページのdl欄](https://wezfurlong.org/wezterm/installation.html)からWindowsを選択
1. setup.exeをdl&実行するか、zipをdl&zipファイル解凍してそのexeを実行で起動、あるいはwingetがあるなら
   ```
   winget install wez.wezterm
   ```
   でインストール
## lf
### 概要
・クロスプラットフォームで使える(Linux, macOS, Windows, BSDs)
・Vimと類似したキーバインド
・高いカスタマイズ性
・何も設定しなくてもファイルの欄から拡張子に対応したソフトで開けられる？

等あるが、公式サイトを見て実際に触った方が早いと考える。

https://github.com/gokcehan/lf/tree/master

コマンド・キーバインド・設定ファイルのOSごとの位置等は以下参照

https://github.com/gokcehan/lf/blob/master/doc.md

### 導入方法
インストール方法も書かれてあるが、念の為
1. [Goの公式サイトのdlページ](https://go.dev/dl/)よりMicrosoft Windowsの欄にある".msi"で終わるファイルをdl&実行（自分はこの方法でやったか忘れた）
2. 以下のどちらかを実行
2. ```cmd:cmd
   set CGO_ENABLED=0
   go install -ldflags="-s -w" github.com/gokcehan/lf@latest
   ```
   ```Powershell:Powershell
   $env:CGO_ENABLED = '0'
   go install -ldflags="-s -w" github.com/gokcehan/lf@latest
   ```
# 実際にやった流れ
ここまでツールの導入だったが、ここからは自分自身の足跡となる。
## lfの画像表示
lfで画像ファイルにフォーカス（？）した状態でlキーを押下すると、このように画像を表示できた。
![lfから画像を開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635226/e1f825c2-3825-ab45-e0af-32a2c3da09f7.png)
しかし、画像ファイルの様なバイナリーファイルはデフォルトのプレビュー機能ではこのように表示してくれない。
![lfのプレビュー機能(デフォルト)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635226/1ac044b8-8d56-eb6c-e2fe-d030fcd7afd7.png)
## ueberzug
どうにか表示させられないか探してみると、[この動画](https://www.youtube.com/watch?v=2oWqD3JCXuI)を発見するに至ったが、紹介されている[アドオン](https://github.com/slavistan/lf-gadgets/tree/master/lf-ueberzug)を見てみると、zshを実行できる環境(書く前はGit bashでは無理だと思っていたが、MSYS2のzshがあれば可能らしい)及びueberzugが必要と書かれていた。
 
そして、[公式ページ](https://github.com/seebye/ueberzug)には2年前にサポートを終了した旨が書かれたREADME.mdのみがあるだけだ。

たとえ入手できたとしても、セキュリティ的にいかがなものかと考え、これは断念。
## Imgcat
実は、これは２つ目に検討したものである。
Weztermも、[このサイト](https://io.cyberdefense.jp/entry/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E5%86%85%E3%81%A7%E7%94%BB%E5%83%8F%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%89%8B%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%8B%E3%82%93%E3%81%8C%E3%81%88%E3%82%8B/)を参考にして画像を表示できるとのことで導入した。imgcatは、[iTerm2内にあるimgcatのファイル](https://iterm2.com/utilities/imgcat)をdlし、cygwinのbashを使い
  ```
   bash imgcat.bash　(画像ファイルのパス)
  ```
  で行ってみた。
![Wezterm上でjpg表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635226/37eaed73-a29c-d6fb-eca8-3426daa73035.png)
このように、Wezterm上で表示はできたので、あとはlf上でも実行されるように設定するだけのはずだったが…
![Wezterm上でimgcatを使ってwebpが表示できない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635226/a38178bb-95bc-9376-db4c-c36915bd375f.png)
と、見事に表示されない。画像が破損しているわけではない。

imgcat.bashの中身を確認してみたが、画像をbase64という文字列の形式にしたうえで特定のエスケープシーケンス(ESC ]1337 ;)の後にその文字列が画像に変換され直す形で表示されるようである。

base64でその画像をエンコード&デコードしても表示されたので、もしかしたらiTerm Image Protocolの変換&表示の機能にwebpは対応されていないか、Weztermが対応していない可能性を考えた。（なお、Linux上ではあるが[Weztermで動画形式のwebpの一つだけが表示できない](https://github.com/wez/wezterm/issues/3250)という報告はあったが、動画が一部できるなら画像もいけるはずである。しかし、Windows上というところが違うのでWeztermかプロトコルが原因にあるかもしれない）
#### (2024/10/21追記)
Linux上でimgcatを試してみたが、同様にwebpは表示できなかった。
また、動くwebpをimgcatでWindows上で表示させようとしたら表示できた。(仕組みが理解できない)
## Kitty Graphics Protocol
現在最後に検討したもの。Linux上かmacOSか、BSDsでしか動かないようだが、ソースコードからなんとか組めないか試した。
### 導入
  ```Powershell:Powershell
    git clone https://github.com/kovidgoyal/kitty.git
    cd kitty
    bash
  ```   
```bash:bash(cygwin)
   bash dev.sh build
```
ここまで行うと、Windows上では
```
　dev.sh: line 8: $'\r': command not found
```
と表示される(Goのインストールが済んでいれば)。したがって、VSCodeなりで改行コードをCRLFになっているのをLFにするか、コメントアウトの行とコード欄の空白を消して再実行する。

すると、
```
 Error: Prebuilt dependencies are only available for Linux and macOS
 exit status 1
```
そう、やはりLinuxかmacOS上でしかビルドできないようなのである。
よってこれも除外。
# まとめ
Windowsで、Wezterm上で画像を表示できないか試してみたがueberzugはそもそもサポート終了、Kitty GraphicsはWindowsで走らず、Imgcatはjpg, pngは表示するがwebpは実行できない、といった結果となった。

実は最初に検討したlibsixel内のimg2sixelはビルドが難しい、あるいは途中で阻まれる結果となったがnodeから可能かもしれないのでやり直してみてもいいかもしれない。

あるいは、iTerm Image Protocolをサポートしている他のターミナルエミュレータを試すという手もある。
# 表示画像引用元
https://commons.wikimedia.org/wiki/File:Contact_Lens_Ayala.jpg by Etan J. Tal(ライセンス: CC BY)