UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY18 python - Turtleモジュールを使ってダミアンハースト的なアート画像を作る

今回は今までと打って変わって新しいモジュールを使って

アートな画像を作る講座。

 

アートを知っている人くらいしか知らないマニアックだけど

アート界では巨匠な人 ダミアンハーストの画像を作ります。

 

こんな感じのドット並べてるだけの絵なんだけど、これがすごいらしい笑

 

www.gettyimages.co.jp

 

Turtleモジュールはインポートして使う。

プログラミング入門用に使えるモジュールで亀を動かすこととか絵を描くこともできるし、アイデアによってはゲームとかも作れる。

 

ドキュメントはこちら

docs.python.org

 

ざっくりと簡単な機能を言うと

  • from turtle import Turtle, Screen で機能を呼び出す
  • 前に進むはforward(i) でiには数字を入れるとその分前にすすむ。
  • 曲がりたいときはright(i)かleft(i)でiに数値を入れるとその角度分曲がる。
  • 基本的に動くとその跡は線となるのだけど、penup()で線は消せる。pendown()で再度線が描かれる。

これだけあれば四角形とか簡単な図形はかけたりタートルを動かせる。

 

 

今回はタートルはいらなくて色の着いたドットだけを書いていく。

 

流れとしてはこんな感じ

  • ダミアンハーストの色味をcolorgram.pyを使って色を取得する
  • その色をランダムに選んで左下から等間隔に右に塗っていく
  • 10点塗り終わったら左端に戻って、50ピクセル上に上がってから同じことを繰り返す
  • 10回繰り返したら完成

 

spotpainting

 

ではやっていきます。

 

colorgram.pyで使われている色を取得する

pypi.org

 

import colorgram

まずcolorgramをインポート。

多分システムにないと思うのでpycharmでインストールするか、

ターミナルでドキュメントに書いてある通り

pip install colorgram.py

 

でインストールしてからimportする。


colors = colorgram.extract('image.jpg', 30)

このコードで、image.jpgにある色を30色取得してくれる。

colorsはリストの中に30色分のcolors.rgbのオブジェクトで取得された色がある。

このままだと色が呼び出せないので、.rgbメソッドでrgbデータを取得する。

 

rgb_colors = []
for color in colors:
rgb_colors.append(color.rgb)

 

rgb_colorsのリストの中にcolor.rgbで吐き出されたrgbデータを追加していく。

 

Turtle, Screenのインポート

from turtle import Turtle, Screen

次にタートルモジュールとウィンドウの調整ができるScreenをインポートする。

 

tim = Turtle()
screen = Screen()
screen.colormode(255)

screenはタートルを動かすウィンドウの設定のことで、

colormode(255)にすることでrgbの設定が使えるようになる。

 

これだけだと絵を描き終わったらすぐウィンドウが閉じてしまうので、

一番最後に


screen.exitonclick()

を書いておく。これは自動的に閉じるんじゃなくて、

描画が終わった後にクリックをしたら閉じるメソッド。

 

スクリーン・タートルの初期値を設定する

tim.speed(0)
tim.ht()
tim.penup()

x = -250
y = -250
tim.setpos(x, y)

 

タートルはデフォルトだと矢印が出るので、消したい。

消すメソッドはht()、もしくはhideturtle()で消える。

最初に動くのを見たい場合は書かないで動かしてもいいかも。

penup()は文字通りペンが浮いている状態なので、タートルを動かしても線は出ない状態。

 

setpos(x,y)ではタートルをどの部分に置くかを設定できる。

キャンバスの真ん中が0,0としているので、左と下に-250ずつ移動している状態。

 

横に10回を上に10回繰り返して100個のドットを作る

 


for i in range(10):
tim.setpos(x, y)
for i in range(10):
tim.pendown()
tim.pencolor(random.choice(rgb_colors))
tim.pensize(25)
tim.forward(1)
tim.penup()
tim.forward(50)
y += 50

screen.exitonclick()

 

for分を横10個を繰り返す分と、

これを10回繰り返す分と入れ子にして描画するようにしています。

最初にポジションをセットして、pendown()で描画開始。

.pencolor()でドットの色を先ほどリストに入れた色からランダムで選んで指定。

.pensize()でドットの大きさを指定しています。

.forward(1)で1ピクセルだけ移動しているので実質点を描画。

終わったらpenup()で再び線をひかないようにしてから右に50進んでいます。

これを10回繰り返すと10個のランダムに色付けされた点ができます。

10回くらい返した後に、yを50プラスすることで11個目のドットが

左端で50上に行ったところからスタートするようになり、また10このドットを描画…という流れ。

 

 

これであっというまにアート作品のできあがり。

 

全体のコードはこちら。

 

from turtle import Turtle, Screen
import random
import colorgram

rgb_colors = []
colors = colorgram.extract('hirst-painting-start/image.jpg', 50)
for color in colors:
rgb_colors.append(color.rgb)

tim = Turtle()
screen = Screen()
screen.colormode(255)
tim.ht()
tim.penup()

x = -250
y = -250
tim.setpos(x, y)

for i in range(10):
tim.setpos(x, y)
for i in range(10):
tim.pendown()
tim.pencolor(random.choice(rgb_colors))
tim.pensize(25)
tim.forward(1)
tim.penup()
tim.forward(50)
y += 50

screen.exitonclick()