【问题标题】:How to save active tkinter canvas as a png file?如何将活动的 tkinter 画布保存为 png 文件?
【发布时间】:2021-06-24 08:23:45
【问题描述】:

此代码生成随机彩色三角形或矩形并将它们显示在 tkinter 画布上。这部分代码运行良好。

但是,我想要将这个随机显示的图片保存为 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()

【问题讨论】:

  • " 我尝试了几件事,但似乎没有任何效果。" - 你尝试了什么?
  • 使用 cv=Canvas(root)
  • 然后是 cv.pack()
  • 好吧,我是初学者,所以如果这些事情不正确,请不要介意
  • 我也尝试将其保存为 .ps 文件,但也没有用

标签: python python-3.x tkinter png


【解决方案1】:

不要用 PIL 最后创建图像,而是尝试直接用 cv2 保存合成。

尝试使用此代码

composite=np.uint8(composite)
cv2.imwrite(filename, composite)

在使用之前请导入 numpy 和 cv2。 如有任何问题,请随时问我。

【讨论】:

  • 非常感谢 Tariq,这非常有效:)
  • 但我不能投票,因为我的声誉很低。很抱歉。
  • 没关系。很高兴知道它对您有所帮助。
猜你喜欢
  • 2021-11-18
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2023-02-06
  • 2012-07-30
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多