Pythonでターミナルに画像表示
藤武将人@Swall0wTech
#stapy 2016/10/12
1
2自己紹介
名前: 藤武 将人
(Masato FUJITAKE)
Twitter : @Swall0wTech
専攻:ロボットの制御とかとか
言語:c言語、C++,アセンブリとか
Python歴:約6ヵ月
(画像処理、機械学習等)
最近Gnu Parallelに感動しました!
自然言語処理に興味あります。
SSHで作業してる時に画像を開こうと…
3
4
どんな画像なのかだけでいいから
知りたい
画像を開いて、
エスケープシーケンスコードに変換
ターミナルに出力
5Pythonでターミナルに画像表示
Python画像ライブラリPillow
6画像を開く
https://pillow.readthedocs.io/en/3.4.x/
Anacondaに入ってる!
7画像を開く→RGB値取得
from PIL import Image
img = Image.open(files)
imgW = img.size[0]
imgH = img.size[1]
for y in range(0, imgH):
for x in range(0, imgW):
offset = y * imgW + x
xy = (x, y)
rgb = img.getpixel(xy)
rgbR = rgb[0]
rgbG = rgb[1]
rgbB = rgb[2]
ファイル
読み込み
RGB
取得
「ls」とかの表示に変化をつける特殊文字
8エスケープシーケンスとは…?
実際はこんなの 033[36m
エスケープシーケンスコード 処理内容コード 終了コード
赤い文字→ Echo “033[31mred”
9とりあえずechoで試す
赤い文字→ Echo “033[38;2;R;G;Bmred”
RGB値で
画像:解像度いろいろ…640x480とか
端末:55x237とか
小さい方に合わせて変換
10解像度変更
img.thumbnail((xの大きさ, yの大きさ), Image.ANTIALIAS)
端末の大きさ取得
import os
terminal_size = os.popen('stty size').read().split()
11結果!
ぱっと見変だけど、何かはわかる。
他にも端末出力にはSixel Graphicsもあるらしい…
https://goo.gl/YR49AZ
12
#!/usr/bin python3
# -*- coding: utf-8 -*-
from PIL import Image
import sys
import os
import math
import argparse
def get_terminal_size():
terminal_size = os.popen('stty size').read().split()
# return the sizes in list
return terminal_size
def set_parameter_string(default, IsTrueValue):
'''
Initializing parameter with default value or True value.
If the IsTrueValue is None, initialize with default value.
Or not, initialize with IsTrueValue
'''
return IsTrueValue if IsTrueValue else default
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Show some image files')
parser.add_argument(dest='filenames', metavar='filename', nargs='*')
#parser.add_argument('-p', '--pat', metavar='pattern', dest='patterns',help=)
parser.add_argument('-s','--split', dest='splits', action='store', help='Value of display splitting by input images. Type an integer number.')
parser.add_argument('-p', '--pat', dest='pattern', action='store', help='A displayed mark. The default parameter is a white space.')
args = parser.parse_args()
ソースコード1
13
try:
print(args.filenames)
for files in args.filenames:
img = Image.open(files)
imgW = img.size[0]
imgH = img.size[1]
imgh = img.size[1]
TerminalSize = get_terminal_size()
terminaly = int(TerminalSize[0])
terminalx = int(TerminalSize[1])
img = img.resize(( imgW, round(imgH*2/3) ))
splitNum = set_parameter_string('1',args.splits)
terminalY = round((terminaly -1)/int(splitNum))
img.thumbnail((terminalx, terminalY), Image.ANTIALIAS)
convertedImgW = img.size[0]
convertedImgH = img.size[1]
ascii_markNum = '38' if args.pattern else '48'
ascii_markString = 'm'+args.pattern[0] if args.pattern else 'm '
if(img.mode == "RGB" or img.mode == "RGBA"):
for y in range(0, convertedImgH):
for x in range(0, convertedImgW):
offset = y * convertedImgW + x
xy = (x, y)
rgb = img.getpixel(xy)
rgbR = rgb[0]
rgbG = rgb[1]
rgbB = rgb[2]
outline = "033[" + ascii_markNum +";2;" + str(rgbR) + ";" + str(rgbG) + ";" + str(rgbB) + ascii_markString
sys.stdout.write(outline)
sys.stdout.write("033[0mn")
except:
print("Error")
ソースコード2
「ゲームで極める シェルスクリプト
スーパーテクニック」
山本 丈範
技術評論社
14参考書籍
ご清聴有難うございました
15
https://goo.gl/d5a47h

Pythonでターミナルに画像表示