[英]How to save a .png file through python in tkinter by pressing a button
[英]How to save active tkinter canvas as a png file?
此代码生成随机彩色三角形或矩形并将它们显示在 tkinter canvas 上。 这部分代码运行良好。
但是,我想要的是将这张随机图片保存为 png 文件。 我尝试了几件事,但似乎没有任何效果。
这是代码:
from tkinter import *
from datetime import datetime
from PIL import Image, ImageDraw, ImageTk
from random import randint, randrange
from PIL import ImageGrab as IG
# Create random composite image.
WIDTH, HEIGHT = 500, 500
COUNT = 40
# Use datetime (somehow), to generate random int.
def datetimeToInt():
y, m, d, hour, min, sec = datetime.now().timetuple()[0:6]
return y + m + d + hour + min + sec
def randRgb():
x=(randint(0, 255), randint(0, 255), randint(0, 255))
return x
def randTriangle():
x1, y1 = randrange(0, WIDTH), randrange(0, HEIGHT)
x2, y2 = randrange(0, WIDTH), randrange(0, HEIGHT)
x3, y3 = randrange(0, WIDTH), randrange(0, HEIGHT)
return [(x1,y1), (x2,y2), (x3,y3)]
def randRect():
x1, y1 = randrange(0, WIDTH), randrange(0, HEIGHT)
x2, y2 = randrange(0, WIDTH), randrange(0, HEIGHT)
return [(x1,y1), (x2,y2)]
return
for i in range(2):
randEllipse = randRect
# Map: random shape creation functions -> ImageDraw methods
shapeFactories = [
(randTriangle, ImageDraw.ImageDraw.polygon),
(randRect, ImageDraw.ImageDraw.rectangle) ]
shapeFactoriesCount = len(shapeFactories)
composite = Image.new('RGBA', (WIDTH, HEIGHT), '#00000000')
draw = ImageDraw.Draw(composite)
for x in range(COUNT):
# Get random index, within full range:
#randIdx = randrange(0, shapeFactoriesCount)
# Use random int, generated from datetime (somehow):
randIdx = datetimeToInt() % shapeFactoriesCount
shapeFactory, drawMethod = shapeFactories[randIdx]
drawMethod( # passing 'self'/'draw' explicitly to method:
draw, shapeFactory(), fill=randRgb()
)
# The rest is just for displaying the resulting images.
import tkinter as tk
root = tk.Tk()
compositeTk = ImageTk.PhotoImage(composite)
tk.Label(image=compositeTk).pack()
############
cv=Canvas(root)
cv.pack()
image1 = Image.new("RGB", (WIDTH, HEIGHT))
draw = ImageDraw.Draw(image1)
filename = "my_drawing.jpg"
image1.save(filename)
############
root.mainloop()
最后不要使用 PIL 创建图像,而是尝试使用 cv2 直接保存合成。
尝试使用此代码
composite=np.uint8(composite)
cv2.imwrite(filename, composite)
使用前请导入 numpy 和 cv2。 如有任何问题,请随时问我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.