Windows Terminal Preview 1.22で画像表示できるSixel Gpraphicsが実装されたのでGo言語で試してみた。

# はじめに
　Sixelは、通常は文字しか表示できない「黒い画面」（＝ターミナル=端末）で画像を表示するAnsi エスケープシーケンスの一種です。1982年(DEC社のLA50に搭載)から存在します。Microsoftは長年無関心でしたが、今回実装となりました。
 　以下はニュースのネタ元です。

https://news.mynavi.jp/techplus/article/20240828-3013926/

https://forest.watch.impress.co.jp/docs/news/1619236.html


# Sixelの説明（他力本願）
　まずは以下リンクを御参考。Wikipediaは英語版なので要翻訳

https://en.wikipedia.org/wiki/Sixel

https://zenn.dev/sankantsu/articles/e629c978b02806

https://qiita.com/arakiken/items/4a216af6547d2574d283

https://qiita.com/arakiken/items/3e4bc9a6e43af0198e46

# 自分なりのSixelの理解
　「Sixel」の造語の由来は、６個のピクセル（six pixel）から来ています。
　ASCIIコード (http://www3.nit.ac.jp/~tamura/ex2/ascii.html) に基づいた以下の計64文字を使って、縦６ピクセル×横1ピクセルを表現します。
 - 大文字のアルファベット(26文字)
 - 小文字のアルファベット(26文字)
 - 記号(12文字) 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/e4efa217-d751-8f06-980d-b037f7b4bcea.png)


```
                     1                   2                   3                   4                   5                   6      
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
 ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
1  █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █   █
2    █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █     █ █
3        █ █ █ █         █ █ █ █         █ █ █ █         █ █ █ █         █ █ █ █         █ █ █ █         █ █ █ █         █ █ █ █
4                █ █ █ █ █ █ █ █                 █ █ █ █ █ █ █ █                 █ █ █ █ █ █ █ █                 █ █ █ █ █ █ █ █
5                                █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █                                 █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
6                                                                █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █

```
　数字や「#」「;」「$」「-」等の記号は、色や改行や位置の定義を示している。
　
　ちなみに、なぜ縦が8ピクセルではなく、6ピクセルかというと、2の6乗(=2⁶)が64だからです。
　縦が8ピクセルならば何かと扱い易いですが、2の8乗(=2⁸)は256となり、256文字を必要となりますが、ASCIIコードの128文字までしかないので、縦は6ピクセルになったのでしょう。


# 本題のGo言語のプログラム

```Go

package main

import (
	"fmt"
)

func main() {
	fmt.Println("テスト01_\033Pq#1;2;100;100;0#2;2;0;100;0#1~~@@vv@@~~@@~~$#2??}}GG}}??}}??-#1@@@@@@@@@@@@@@\033\\")
	fmt.Println("テスト02_\033Pq#1;2;100;0;0#2;2;0;100;0#1~~@@vv@@~~@@~~$#2??}}GG}}??}}??-#1@@@@@@@@@@@@@@\033\\")
	fmt.Println("テスト03_Pq#1;2;0;0;100#2;2;50;50;0#1~~@@vv@@~~@@~~$#2??}}GG}}??}}??-#1@@@@@@@@@@@@@@\\")
	fmt.Println("テスト04_\033Pq#1;2;100;100;100#2;2;100;100;0#1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\033\\")
}

```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/8f212fbe-ccc9-0c0c-2854-bcb433c2e5c8.png)


# もはや暗号だが、イメージは以下となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/2ad91fa7-0341-4ec8-654c-f434e7abe2cb.png)



```
始    第1色  R   G B第2色R   G B 1色目            2色目            1色目          終
\033Pq#1;2;100;100;0#2;2;0;100;0#1~~@@vv@@~~@@~~$#2??}}GG}}??}}??-#1@@@@@@@@@@@@@@\033\\
                                #1██████████████$#2              -#1██████████████
                                #1██  ██  ██  ██$#2  ██  ██  ██  -#1              
                                #1██  ██  ██  ██$#2  ██  ██  ██  -#1              
                                #1██      ██  ██$#2  ██████  ██  -#1              
                                #1██  ██  ██  ██$#2  ██  ██  ██  -#1              
                                #1██  ██  ██  ██$#2  ██  ██  ██  -#1              
```


# 気づいたこと
　今回Sixel作成してみて気づいたがSixel画像の右側には文字が書けない。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/d17412d8-55a5-5a81-6b88-583aa8564e3f.png)

# ドット絵おまけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/2f0afacc-6685-3276-433c-676600cacea6.png)

```Go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("ドット絵１_\033Pq#1;2;100;0;0#2;2;42;24;15#3;2;100;61;0#1??ABBBBBAAAA?$#2?wc[S??ko__?$#3??W_g{{OKWWWO-#1???omwwko???$#2GK]M?EEAK[KG$#3oo_@P@@P@`oo-#1??BBB@@BBB??$#2GKKK????KKKG$#3@@????????@@\033\\")
	fmt.Println("ドット絵２_\033Pq#1;2;0;100;0#2;2;42;24;15#3;2;100;61;0#1????EBRBBRBE???$#2????wKkKKkKw???$#3??{o?o?oo?o?o{?-#1???AA??gGW[MA??$#2wkCk{{GQq___CN[$#3?OwP@BvDDFBPxo_-#1???????AABBB@??$#2BBABJJK@@CCC???$#3?CDCCCB??????@\033\\")

}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/93f6e4c9-0acb-0f91-753a-068409faa0eb.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/f77a4a86-49bb-cc0f-7dcf-0a0896f6f38c.png)