krita plugin

・server.py

import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
import cv2


app = FastAPI()


class Request(BaseModel):
input_img_path: str
output_img_path: str


@app.post("/blur")
async def f_blur(req: Request):
input_img = cv2.imread(req.input_img_path)
output_img = cv2.blur(input_img, (5, 5))
cv2.imwrite(req.output_img_path, output_img)


def start():
config = uvicorn.Config("server:app", host="127.0.0.1", port=8000, log_level="info")
server = uvicorn.Server(config=config)
server.run()


if __name__ == '__main__':
start()


blur_plugin.py

from krita import DockWidget
from PyQt5.QtWidgets import *
from .blur_action import BlurAction


DOCKER_TITLE = 'Blur Docker'


class BlurDock(DockWidget):

def __init__(self):
super().__init__()
self.setWindowTitle(DOCKER_TITLE)

self.action = BlurAction()

self.button = QPushButton('Blur')
self.button.clicked.connect(self.action.blur)

self.layout = QVBoxLayout()
self.layout.addWidget(self.button)
widget = QWidget(self)
widget.setLayout(self.layout)
self.setWidget(widget)

# notifies when views are added or removed
# 'pass' means do not do anything
def canvasChanged(self, canvas):
pass


blur_action.py

import os
import json
import urllib.request
import tempfile
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class BlurAction:
def __init__(self):
self.url = 'http://127.0.0.1:8000/blur'
self.input_img_name = 'input.png'
self.output_img_name = 'output.png'

def blur(self):
with tempfile.TemporaryDirectory() as tempfolder:
post_data = self.create_input_data(tempfolder)
req = urllib.request.Request(
self.url,
headers={'Content-Type': 'application/json'},
data=json.dumps(post_data).encode('utf-8')
)
with urllib.request.urlopen(req):
self.apply_result(tempfolder)

def create_input_data(self, tempfolder):

doc = Krita.instance().activeDocument()
pixel_bytes = doc.activeNode().pixelData(0, 0, doc.width(), doc.height())
img = QImage(pixel_bytes, doc.width(), doc.height(), QImage.Format_RGBA8888).rgbSwapped()
input_img_path = os.path.join(tempfolder, self.input_img_name)
output_img_path = os.path.join(tempfolder, self.output_img_name)
img.save(input_img_path, "PNG")

post_data = {
'input_img_path': input_img_path,
'output_img_path': output_img_path
}
return post_data

def apply_result(self, tempfolder):
img = QImage()
img.load(os.path.join(tempfolder, self.output_img_name))
ptr = img.bits()
ptr.setsize(img.byteCount())
byte_array = QByteArray(ptr.asstring())
doc = Krita.instance().activeDocument()
doc.activeNode().setPixelData(byte_array, 0, 0, img.width(), img.height())
doc.refreshProjection()