from tkinter import * from PIL import ImageTk,Image import time import os targetImageWidth = 850 targetImageHeight = 400 inputImageWidth = 0 inputImageHeight = 0 currentScale = 1.0 inputDirectory = "images/" outputDirectory = "images/output/" root = Tk() root.title("hyper crops") canvas = Canvas(root, width = 1920, height = 1080) canvas.pack() rect = canvas.create_rectangle(1920/2, 1080/2, 150, 75, fill="", width=5) imagePaths = [] fNumber = 0 currentOpenImagePath = "" currentImage = 0 numCapturesOfCurrentImage = 0 statusLabelText = StringVar() statusLabel = Label( root, textvariable=statusLabelText, relief=RAISED ) if not os.path.exists(outputDirectory): os.makedirs(outputDirectory) def log(s): global statusLabelText global statusLabel statusLabelText.set(s) def openImage(): global fNumber global currentOpenImagePath global currentImage global inputImageWidth global inputImageHeight global currentScale currentScale = 1.0 currentOpenImagePath = inputDirectory + imagePaths[fNumber] image = Image.open(currentOpenImagePath) img = ImageTk.PhotoImage(image) imageObject = canvas.create_image(0, 0, anchor=NW, image=img) if fNumber > 0: canvas.delete(currentImage) inputImageWidth = img.width() inputImageHeight = img.height() currentScale = float(inputImageWidth) / float(targetImageWidth) if currentScale*targetImageHeight > inputImageHeight: currentScale = float(inputImageHeight) / float(targetImageHeight) currentImage = imageObject root.mainloop() def motion(event): global currentScale global statusLabel x = max(currentScale*targetImageWidth/2, min(event.x, inputImageWidth - currentScale*targetImageWidth/2) ) y = max(currentScale*targetImageHeight/2, min(event.y, inputImageHeight - currentScale*targetImageHeight/2) ) #print('{}, {}'.format(x, y)) canvas.coords(rect,(x - currentScale*targetImageWidth/2,y - currentScale*targetImageHeight/2,x + currentScale*targetImageWidth/2, y + currentScale*targetImageHeight/2)) canvas.tag_raise(rect) def keyPress(event): global numCapturesOfCurrentImage global fNumber print(event.char) if event.char == ' ': fNumber=fNumber+1 numCapturesOfCurrentImage = 0 openImage() def click(event): global canvas canvas.itemconfig(rect, outline='white') def onClicked(event): global fNumber global currentOpenImagePath global currentScale global numCapturesOfCurrentImage global canvas canvas.itemconfig(rect, outline='black') outputFileName = outputDirectory + str(fNumber) + "_" + str(numCapturesOfCurrentImage) + ".jpg" x = max(currentScale*targetImageWidth/2, min(event.x, inputImageWidth - currentScale*targetImageWidth/2) ) y = max(currentScale*targetImageHeight/2, min(event.y, inputImageHeight - currentScale*targetImageHeight/2) ) command = "convert \"" + currentOpenImagePath + "\" -crop " + str(targetImageWidth*currentScale) + "x" + str(targetImageHeight*currentScale) + "+"+str(x-targetImageWidth*currentScale/2)+"+"+str(y-targetImageHeight*currentScale/2)+" -resize " + str(targetImageWidth) + "x" + str(targetImageHeight)+ " " +outputFileName numCapturesOfCurrentImage+=1 log("saved " + outputFileName) os.system(command) def mouse_wheel(event): global currentScale global canvas if event.delta > 0: currentScale -= 0.01 else: currentScale += 0.01 x = max(currentScale*targetImageWidth/2, min(event.x, inputImageWidth - currentScale*targetImageWidth/2) ) y = max(currentScale*targetImageHeight/2, min(event.y, inputImageHeight - currentScale*targetImageHeight/2) ) canvas.coords(rect,(x - currentScale*targetImageWidth/2,y - currentScale*targetImageHeight/2,x + currentScale*targetImageWidth/2, y + currentScale*targetImageHeight/2)) canvas.tag_raise(rect) def deleteImage(event): global fNumber global currentOpenImagePath global numCapturesOfCurrentImage command = "rm \"" + currentOpenImagePath + "\"" fNumber=fNumber+1 numCapturesOfCurrentImage = 0 os.system(command) log("deleted " + currentOpenImagePath) openImage() root.bind('<Motion>', motion) root.bind("<Button 1>", click) root.bind("<ButtonRelease-1>", onClicked) root.bind("<MouseWheel>", mouse_wheel) root.bind('<KeyPress>', keyPress) root.bind("<BackSpace>", deleteImage) root.lift() statusLabel.place(relx=0.0, rely=0.0, anchor=NW) imagePaths = os.listdir(inputDirectory) openImage()