EV5_Beeldherk_Bomen/src/helpers/canvas.py

103 lines
3.1 KiB
Python

import cv2
import tkinter
from PIL import ImageTk, Image
import datetime
import pathlib
import os
from helpers.logger import C_INFO, C_DONE, C_ERR
class CVSuiteCanvas:
def __init__(self, canvas):
self.canvas = canvas
self.name = "" # Name of current image
self.imgs = [] # OpenCV Image data
self.tk_imgs = [] # Tkinter Image data
self.tags = [] # Tag data
def add(self, data, name: str):
"""
Add CV2 image to canvas output
"""
self.imgs.append(data)
self.tags.append(name)
def clear(self):
"""
Clear canvas
"""
self.imgs = []
self.tags = []
def draw(self, size):
"""
Update canvas
"""
# Check if size of canvas has updated
drawW = self.canvas.winfo_width()
# Reset drawing position
drawX = 0
drawY = 0
# Clear previously printed images
self.tk_imgs = []
# self.meta.config(state=tkinter.NORMAL)
# self.meta.delete(1.0, tkinter.END)
# self.meta.insert(tkinter.END, f"{self.img_name}\n")
# Draw all output images
for idx, data in enumerate(self.imgs):
# Create ui image
tk_img = cv2.cvtColor(data, cv2.COLOR_BGR2RGB)
tk_img = ImageTk.PhotoImage(image=Image.fromarray(tk_img))
self.tk_imgs.append(tk_img)
## Check if next item will be out of range
if drawX + size >= drawW:
drawY += size
drawX = 0
self.canvas.configure(height=(drawY + size))
self.canvas.create_image(
drawX, drawY, anchor=tkinter.NW, image=self.tk_imgs[idx], tags="og"
)
# Add name to text box
tag = self.canvas.create_text(drawX+5, drawY+5, anchor=tkinter.NW, text=F"{idx} {self.tags[idx]}", fill="black", font=('Helvetica 12 bold'))
tag_bg = self.canvas.create_rectangle(self.canvas.bbox(tag), fill="white")
self.canvas.tag_lower(tag_bg,tag)
# self.meta.insert(tkinter.END, f"{idx}: {self.output[1][idx]}\n")
drawX += size
# Clear output
# self.meta.config(state=tkinter.DISABLED)
def export(self, id, name, path):
"""
Export id to file
"""
# Get export settings
img_arr = self.tk_imgs
print(C_INFO, f"Using path: {path}")
if id >= 0 and id < len(img_arr):
# Create file
now = datetime.datetime.now()
new_file_name = f"{name}-{self.tags[id]}-{now.strftime('%Y-%m-%dT%H.%M.%S')}.png"
# Put data
file_path = pathlib.Path(path, new_file_name)
# print(file_path)
img_pil = ImageTk.getimage(self.tk_imgs[id])
img_pil.save(file_path, "PNG")
img_pil.close()
print(C_DONE, f"Exported Image ID {id} ({self.tags[id]}) to {os.path.join(path, new_file_name)}")
else:
print(C_ERR, "Nothing to export!")