0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows Terminal 内で画像を表示してみたい without WSL

0
Last updated at Posted at 2026-03-18

TL;DR

ImageMagick が利用できる環境なら、以下のコマンドを叩くだけです。

magick image.png sixel:-

PowerShell Gallery から Sixel モジュールを導入して、ConvertTo-Sixel コマンドレットを利用する方法もあります。

ConvertTo-Sixel -Path image.png

Sixel 画像とは

Windows Terminal は v1.22 以降 Sixel 画像 をサポートしています。Sixel はターミナル画面内で画像を表示する際に利用されるフォーマットで、Windows Terminal は受信した Sixel をターミナル画面内にグラフィックとして描画してくれます。

Sixel の歴史は古く、DEC 社のドットプリンタ用エスケープシーケンスが源流とされています:

  1. [ESC]Pq でグラフィックモードに入る
  2. グラフィックモード中は受信した文字の各ビットをドットパターンの ON / OFF に反映して印刷
  3. [ESC]\ でグラフィックモードを抜ける

現在の Sixel も上記の基本構造を踏襲しつつ、カラー表示に対応するなどの改良が施されて今に至ります。例えば、この画像 18x18.jpg を Sixel で表現すると以下のようになります。

[ESC]P0;0;0q"1;1;18;18#0;2;91;4;4#1;2;95;2;1#2;2;95;2;2#3;2;99;0;0#4;2;100;0;0#5;2;100;23;22#6;2;100;23;22#7;2;100;23;23#8;2;100;24;24#9;2;100;24;24#10;2;100;25;24#11;2;100;24;25#12;2;96;26;25#13;2;100;40;40#14;2;100;40;40#15;2;100;42;41#16;2;100;42;41#17;2;100;43;42#18;2;100;43;43#19;2;100;43;43#10___OG!8FGO___$#12OOO?F!8?F?OOO$#15GGGF#0O!8?O#15FGGG$#18CCF#5_?!8G?_#18FFF$#17BB#13?G#2_?O?O?O?O#13?G$#1!5?O?O?O?O?_$#4!5?!8_-#10~~~#5~#2~#4!8~#1~#5~#10~~~-@@@AC!8wCA@@@$#12AAA?w!8?w?AAA$#15CCCw#0A!8?A#15wCCC$#18www#5@?!8C?@#18www$#13???C#2@?A?A?A?A#13?C$#1!5?A?A?A?A?@$#4!5?!8@-[ESC]\

PowerShell 7(pwsh)では [ESC]`e と表現できます。Write-Host コマンドレットで出力してみましょう。1

write-host-sixel7.png

おおよそ 40 年選手のフォーマットが現役で活躍している姿にはロマンがありますね。

Windows Terminal で *nix 環境の Sixel を表示してみる

たとえば、WSL2 上の Debian を Windows Terminal で開いて w3m-sixel オプション付きで実行するとこんな感じになります。

w3m-sixel.png

このように Sixel をうまく活用すれば、X11 転送 や Waypipe が使用できないサーバでもちょっとしたグラフィックス機能を利用できて便利です。例えば lsix は指定したディレクトリ内の画像をサムネイル付きでリストできます。

他にも Linux / BSD 向けには Sixel をサポートしたツールが多数ありますが、Windows 向けには多くはありません。たとえば gnuplot のようにクロスプラットフォームなツールでは Windows 版でも Sixel がサポートされていたりします。

gnuplot-sixel

そもそも Windows はローカル利用・リモートアクセス問わず GUI が基本ですし、Sixel をサポートするツールが少ないのも当然といえば当然ですね。しかし、そこをあえてやってみるのがロマンというものです。

Windows 用スクリプトでも Sixel を使ってみたい

といっても、大げさな準備は必要ありません。冒頭に記載した通り ImageMagick が Sixel をサポートしているため、Windows Terminal で PowerShell や Cmd を開き以下を実行すれば画像が表示されます。

# winget で ImageMagick を導入
winget install ImageMagick.ImageMagick

magick .\parrots.jpg sixel:-

parrots.png

単純に magick コマンドを実行するだけということで、既存スクリプトへの組み込みも簡単です。夢が広がりますね。

ImageMagick はアニメーション GIF も取り扱えますが、標準出力に流すと各フレームが連結されたような形で見えてしまいます。

magick .\parrot.gif -coalesce sixel:-

parrot.png

しかし、ちょっとしたスクリプトを用意すればアニメーション再生も難しくはありません。23

$filename = ".\parrot.gif"

# アニメーション GIF の遅延時間を取得
$delay = [Int](magick identify -format "%T" "$filename[0]")

# アニメーション GIF を連結された SIXEL 形式の文字列に変換する
$output = magick $filename -coalesce sixel:-

# 正規表現で [ESC]P で始まり [ESC]\ で終わるブロック(SIXEL化された各フレーム)を抽出
$sixels = [regex]::Matches($output, '(?s)\x1bP.*?\x1b\\')

# 初期のカーソル位置を保持する
$cursorTop = [Console]::CursorTop

# 全フレームを順番に描画
foreach ($sixel in $sixels) {
    # 描画前にカーソル位置を初期に戻す
    [Console]::SetCursorPosition(0, $cursorTop)
    # Sixel を出力
    Write-Output $sixel.Value
    Start-Sleep -Milliseconds ($delay * 10)
}

parrot.gif

また、ConvertTo-Sixel コマンドレットを導入すれば PowerShell ライクに呼び出すことも可能です。

# PowerShell Gallery から Sixel モジュールを導入
Install-Module -Name Sixel -RequiredVersion 0.7.0

ConvertTo-Sixel -Path image.png

ConvertTo-Sixel.png

ただし、ConvertTo-Sixel にアニメーション GIF を渡しても 1 フレーム目のみが表示されます。アニメーション再生したい場合は、ConvertTo-SixelGif を使用します。

ConvertTo-SixelGif -Path image.gif

ConvertTo-SixelGif.png

なお、Sixel パッケージは ImageMagick や libsixel に依存せず、独力で変換している ようです。

Node.js でも Sixel を使ってみたい

「Windows 用にちょっとしたスクリプトを書くにも PowerShell より Node.js 派なんだよな」というあなたにおすすめなのが node-sixel です。こちらも、非常にシンプルなコードで画像データを Sixel 化できます。

npm i sixel canvas
img2sixel.mjs
import { loadImage, createCanvas } from 'canvas';
import { image2sixel } from 'sixel/lib/index.js';

const main = async () => {
    const filename = process.argv[2];
    try {
        // Canvas 経由でファイルを読み込み
        const img = await loadImage(filename);
        const canvas = createCanvas(img.width, img.height);
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0);
        const data = ctx.getImageData(0, 0, img.width, img.height).data;

        // 画像データを Sixel に変換
        const sixel = image2sixel(data, img.width, img.height, 256, 0);

        // Sixel を出力
        console.log(sixel);
    } catch (err) {
        console.error(err);
    }
};

main();

node-sixel.png

こちらも外部ライブラリに頼らず独自で変換しています。

ちなみに、同じく「ちょっとしたスクリプト」に利用されがちな Python にも PySixel がありますが、termios モジュールに依存するため Windows では利用できません。

まとめ

というわけで、Windows の CLI から Sixel を取り扱う方法のご紹介でした。*nix でも Windows でも、ターミナル内で画像を表示して友達や家族を怖がらせましょう!

…と書きましたが、Windows Terminal が OS 既定のターミナルになっていることを踏まえると、Windows 向けツールに Sixel 出力を取り込むことの実用性もあながちありそうです。本記事がそのような挑戦をされる方の参考になれば幸いです。


(2026-04-12追伸) コンソールホストでも Sixel がサポートされるようになるそうです。

参考リンク

  1. 従来の PowerShell でも [char]27 と表現できます。write-host-sixel.png

  2. ここでは最初のフレームの遅延時間を全フレームに適用していますが、仕様上はフレームごとに遅延時間を設定できます。

  3. 正規表現による一致でなく magick .\parrot.gif[0] sixel:- のように 1 枚ずつ取得するアプローチも可能です。その場合は magick identify -format "%n" .\parrot.gif[0] でフレーム数を取得してループを回す形になるでしょう。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?