繁体   English   中英

如何将活动的 tkinter canvas 保存为 png 文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM