PythonのPILを使ってみて、躓いたことなど。
今回は、頭の弱い自分ではすぐに分からなくなってしまうので、PILライブラリの使い方について、私が勉強して行った足跡をメモしておきます。
PILとは何か?
読み方は恐らくピルですが、あのピルではありません。略称です。
PIL = Python Image Library
Pythonで画像の生成や、イラストの加工を行うためのオープンソースライブラリです。
これを使うことで、自分でPython作ったデータ等を、いちいちcsv形式等でexcelに渡して、グラフ表示なんて面倒くさい事をしないで済みそうです。
まずはインストール
インストールについては以下のサイトを参照して私もできたので、みなさんもできるはずです!(単にまとめるのが面倒)
Pythonのライブラリインストール
ではインストールできているか、確認してみましょう。
このように入力しても何事もエラーが起きなければ大丈夫です。エラーがでた人はごめんなさいです;;
では早速お絵描きしていきましょう。
PILの使い方について、私が経験しながら感じた事柄を混ぜながら書いていきます。間違いも多々あるかもしれませんが、それを踏まえて読んで下さい。
まずは紙(Window)を用意。
絵を描くには、紙が必要です。同じように画像を表示するにはウィンドウが必要という事で、それを作成する必要があります。
少し訳の分からないコードが続きますが、後から説明します。
以下に書くコードを全て実行してみて、真っ白なキャンパス(大袈裟)が表示されればオッケーです。
では一つずつコードを追って行きましょう。
- 1,from PIL import Image, ImageDraw
ここではインポートといって、ライブラリを使用するための手続きのようなものを行っています。
ただ単にPIL全体をインポートするのではなく、その中でも画像描画系のImageとImageDrawをインポートしています。
- 2,haba=500,takasa=250,haikei="#ffffff"
注意:画像ではhaikeiの定義が抜けています。takasaの定義の後に付け足して実行して下さい。
ここでは次に行うための下準備のような事を行っています。これらを行わずに、直接次のコマンドの中に数字などを入れても実行できます。
- 3,mado=Image.new("RGB",(haba,takasa),haikei)
ここでは遂に窓を作っています。madoという変数にImageのnewという関数を使って代入のような事をしています。(もっと的確な表し方があると思いますが分かりません;;)
new関数にはたくさんの引数があり、ここでは主要な三つを指定しています。
まず一つ目の引数は、色の表記方法を指定しています。この例ではRGBですが、他にも色々あると思いますが、これで良いでしょう。
次に二つ目の引数は、これから作る窓の大きさをタプル形式(まぁ配列のようなもの)指定しています。0番目が窓の幅、1番目が窓の高さを表しています。
最後に三つ目の引数は、窓の後ろに広がる背景の色を表しています。ちなみにここでは#ffffffと書いていますが、これは白を意味しています。白は(256,256,256)でも表す事が出来ます。
- 4,draw=ImageDraw.Draw(mado)
先ほどのmadoは私の感覚だと、まだお絵描きできる状態ではないのです笑(てきとう)。
なのでDraw関数を使って、お絵描き可能な状態に持って行かないといけません。これがそのためのコマンドという訳です。
draw変数にmadoを「お絵描き可能」にして入れている様な感覚です。
- 5,im.show()
最後に、まだ何もキャンバスにお絵描きをしていませんが、したと仮定して、そのキャンバスを表示するコマンドを実行しています。
さぁ、線を引こう。
ここで言うのもなんですが、実際問題、PILはイラストなどを書くのには適しているとは僕は今の所言えません。
しかし、それでも使う意味はあると思うのです。というのも、線を引いたりグラフを書いたりする分にはとてもプログラムを相性が合っているからです、(ライブラリなんだし、当たり前か)
ということで、キャンパスが出来た所で線を引いていきましょう!(ビシっ
また例によって、以下にコードを書いていきます。
- 1,starttogoal=(0,0,500,250)
- 2,iro=(255,0,0)
- 3,draw.line(startgoal,iro)
これをとりあえず、実行してみてください。
何事も無かったら、さきほどのmado.show()を実行してどのようになっているかを確認して見て下さい。
そこで、左上から右下に赤線が引けていれば問題無しです。
早速、カッコだらけでややこしくなってしまいましたね。
でも少し考えてみると、lineメソッドが引数を二つ持っているだけなのが分かると思います。その実行結果をdrawに記述していると私は認識しています。
ではその引数の意味を考えていきます。ここが何回やっても忘れてしまう所なので、説明します。
まずdrawという入れ物が持つlineというメソッドを使っていることがもう分かると思います。
そのlineメソッドは引数を大きく分けて二つ、持っていますね。
一つ目が線の先端と終端の座標です。なので、4つあることがわかりますね。
一つ目の引数には4つ数字があり、前から順番に(先端のx座標、先端のy座標、終端のx座標、終端のy座標)を意味しています。
ここまではそんなに難しいとは思わない方も多いと思います。
しかし、このx座標とy座標の定義が少し難しいのです。
図で示してみたので、それを見てもらった方が分かりやすいと思います。
見て分かると思いますが、まず座標と言ってもマイナスの概念がありません。そして、「原点」がキャンバスの左上になります。y座標が下方向にのびています。
ここで、いつも私は?となってターミナルで試しうちしてから、コードを書いてしまいます笑。
話を戻して、lineメソッドの第二引数の説明をします。これは先ほどのキャンバスを作る際に出てきた、newメソッドの引数でもあった「色の指定」です。
ここでは赤色に設定しています。
最後に文字を書いてみよう。
では簡単になりますが、文字もキャンバスに描いてみましょう。
先ほどのlineメソッドが理解できていれば、問題は無いはずです。
- 1,basho=(250,250)
- 2,moji="jarinosuke"
- 3,iro=(0,250,0)
- 4,draw.text(basho,moji,iro)
これを入力してみて下さい。そして先ほどと同じようにmado.show()を実行してみて、キャンバスの真ん中にjarinosukeが出ていればオッケーです!
先ほどと同様にdrawという入れ物にtextメソッドを用いて何かしていますね。
text関数では三つの引数を持ってきています。
一つ目が文字を書く座標。lineメソッドとは違い、先端終端という考えはありません。
二つ目の引数が、入力する文字。三つ目は先ほどと同様、文字の色になります。