0
0

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

Last updated at Posted at 2024-08-31

はじめに

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

Sixelの説明(他力本願)

 まずは以下リンクを御参考。Wikipediaは英語版なので要翻訳

自分なりのSixelの理解

 「Sixel」の造語の由来は、6個のピクセル(six pixel)から来ています。
 ASCIIコード (http://www3.nit.ac.jp/~tamura/ex2/ascii.html) に基づいた以下の計64文字を使って、縦6ピクセル×横1ピクセルを表現します。

  • 大文字のアルファベット(26文字)
  • 小文字のアルファベット(26文字)
  • 記号(12文字)

image.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言語のプログラム


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

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

image.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

ドット絵おまけ

image.png

package main

import (
	"fmt"
)

func main() {
	fmt.Println("ドット絵1_\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("ドット絵2_\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

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0