「Krita」と「Python」でオリジナルの幾何学模様を作ろう

2025年2月27日(木)
大西 武 (オオニシ タケシ)
第13回の今回は「Krita」の「Python」でダイアログUIにUIパーツを貼り付けて操作できるようにして、オリジナルの幾何学模様を作成できるプログラムを解説します。さらにアニメーションも作ります。

はじめに

第14回ではプラグインの作り方とショートカットの設定を、第15回ではドッキングパネルとUIパーツについて解説するので、今回がプログラミングの総仕上げになります。今回は、ダイアログUIに貼り付けたスピンボックスUIとプッシュボタンUIを使ってちょっとしたアプリ風のスクリプティングをします。このプログラムで自由にベジェ曲線を操作して変形して、オリジナルの幾何学模様が描けます(図1)。おまけで幾何学模様が変化するアニメーションも作ります。

図1:例えばこういうオリジナルの幾何学模様が作れる

ダイアログUIと直線を表示する

まず、ダイアログUIを表示するだけします。それから直線を1本だけ描きます。ダイアログUIにはベジェ曲線のコントロールポイントを移動するスピンボックスUIと、幾何学模様を描画するプッシュボタンUIを配置します。ちょっとだけUIパーツを駆使した作りになります。

ダイアログUIを作成する

何もないダイアログUIを表示だけします(図2)。説明が遅れましたが、ダイアログUIはダイアログUIの終了ボタンを押さないと元のKrita本体の操作ができません。Krita本体の操作に戻る際は必ず、プログラムから表示したダイアログUIを閉じてください。

図2:ダイアログUIを作成する

・サンプルスクリプト「dlg_bezier1.py」
01# モジュール
02from PyQt5.Qt import *
03from PyQt5.QtWidgets import QDialog
04from krita import *
05# ダイアログクラス
06class Dialog(QDialog):
07  # ドキュメント作成
08  def create_doc(self,width,height):
09    self.doc = Krita.instance().createDocument(width, height, "Line", "RGBA", "U8", "", 300.0)
10    Krita.instance().activeWindow().addView(self.doc)
11  # メイン処理
12  def create(self):
13    self.create_doc(800,800)
14# ダイアログ作成
15dlg = Dialog()
16dlg.create()
17dlg.setWindowTitle("Line Art Dialog")
18dlg.exec_()

【サンプルスクリプトの解説】
PyQt5とkritaのモジュールを読み込みます。
「Dialog」クラスの「create_doc」メソッドはいつも通りドキュメントの作成です。
「create」メソッドで最初のメインの処理をします。
Dialogクラスのインスタンスを生成してダイアログUIを構築し、「dlg」変数に代入します。

直線を描画する

サンプルスクリプト「dlg_bezier1.py」に追加して、次のスクリプトを追記します。ベジェ曲線自体は画像の左上端に描画しますが、「translate」メソッドで画面中央に平行移動して表示します。「rotate」メソッドも実行していますが、ここではまだ0度なので全く回転していません(図3)。

図3:1本の直線を描く

・サンプルスクリプト「dlg_bezier2.py」
01# モジュール
02from PyQt5.Qt import *
03from PyQt5.QtWidgets import QDialog, QHBoxLayout
04from krita import *
05# ダイアログクラス
06class Dialog(QDialog):
07(中略)
08  # 幾何学模様の描画
09  def draw_bezier(self,num):
10    pixmap = QPixmap(self.doc.bounds().size())
11    pixmap.fill(QColor(255,255,255))
12    painter = QPainter()
13    pen = QPen(QColor(0,0,0,255))
14    painter.setPen(pen)
15    painter.begin(pixmap)
16    painter.setRenderHint(QPainter.Antialiasing,True)
17    cx = int(self.doc.width()/2)
18    cy = int(self.doc.height()/2)
19    for i in range(0,num,5):
20      painter.save()
21      painter.translate(cx,cy)
22      painter.rotate(i)
23      self.bezier(painter)
24      painter.restore()
25    painter.end()
26    return pixmap.toImage()
27  # ベジェ曲線の描画
28  def bezier(self,painter):
29    path = QPainterPath()
30    path.cubicTo(0,0,200,0,200,0)
31    painter.drawPath(path)
32  # スピンボックスが押されたら1本のベジェ曲線の描画
33  def click_sb(self):
34    self.img = self.draw_bezier(1)
35    self.set_layer()
36    self.doc.refreshProjection()
37  # レイヤーのセット
38  def set_layer(self):
39    root = self.doc.rootNode()
40    layer = root.childNodes()[0]
41    if self.img.sizeInBytes() == 4 * layer.channels()[0].channelSize() * self.doc.width() * self.doc.height():
42      ptr = self.img.bits()
43      ptr.setsize(self.img.byteCount())
44      layer.setPixelData(QByteArray(ptr.asstring()), 0, 0, self.doc.width(), self.doc.height())
45    else:
46      print('Error')
47  # メイン処理
48  def create(self):
49    self.create_doc(800,800)
50    # 最初の直線の描画
51    self.click_sb()
52(後略)

【サンプルスクリプトの解説】
PyQt5モジュールのレイアウトウィジェットを読み込みます。
「draw_bezier」メソッドでベジェ曲線を配置します。真っ白に背景を塗り潰し、線を黒色にセットしてアンチエイリアスをかけ、painter画像を中央に移動してnum引数の数だけ回転しながら描画します。
「bezier」メソッドでベジェ曲線を描きますが、コントロールポイントが頂点と同じ座標なので、まだ直線です。0度からまだ回転せず1個だけ描画します。
「click_sb」メソッドで1本だけベジェ曲線を描かせて表示します。
「set_layer」メソッドはいつも通り画像の表示です。

著者
大西 武 (オオニシ タケシ)
1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書など30冊以上を商業出版する作家。Microsoftで大賞やNTTドコモでグランプリなど20回以上全国区のコンテストに入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」が全国放送のTVで約10回出題。
https://profile.vixar.jp

連載バックナンバー

開発言語技術解説
第14回

「Krita」と「Python」でプラグインを作ろう

2025/3/21
第14回の今回は「Krita」で「Python」スクリプトを「プラグイン」にしたり、「ショートカットキー」をセットする解説をします。
開発言語技術解説
第13回

「Krita」と「Python」でオリジナルの幾何学模様を作ろう

2025/2/27
第13回の今回は「Krita」の「Python」でダイアログUIにUIパーツを貼り付けて操作できるようにして、オリジナルの幾何学模様を作成できるプログラムを解説します。さらにアニメーションも作ります。
開発言語技術解説
第12回

「Krita」と「Python」のクラスでダイアログを使ってみよう

2025/1/30
第12回の今回は「Krita」の「Python」でクラスを使ってダイアログ(QDialog)を継承し、UIを構築する解説をします。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています