3

在我正在创建的简单游戏中,我目前有占位符矩形对象作为图形。我正在尝试用精灵替换它们,但据我了解,Tkinter 不支持 PNG 或 alpha 透明度。我正在使用 Python 3.3,它不适用于 PIL(并且由于它是一个学校项目,我只是尝试使用 Tkinter 作为唯一的外部库)。有没有办法将 alpha 通道与支持的文件格式一起使用,以便我可以拥有多层瓷砖?我只想过滤掉白色像素。

4

3 回答 3

1

我能够使用具有透明度的图像。我理解您希望避免使用 PIL,但以下代码可以工作并证明 Tkinter 将支持具有透明度的格式。

from Tkinter import Tk, Canvas
import PIL
root = Tk() 
tkimg = PIL.ImageTk.PhotoImage('cat1-a.gif')
canvas = Canvas(root, height=600, width=600)
canvas.grid()
def stamp(event):
    canvas.create_image(event.x, event.y, image=tkimg)
canvas.bind('<ButtonPress-1>', stamp)
root.mainloop()

三个 create_image() 调用展示了透明度

于 2013-04-18T03:29:58.800 回答
1

要使白色像素透明(我假设白色表示#ffffff),您可以使用下面的此功能或类似的功能。这不需要 PIL。它适用于 pngs,但也适用于 gif。

  • 首先,制作一个与您的图像大小相同的新空白图像。
  • 其次,逐像素复制到新图像(除非像素是白色的)。
  • 将原始图像设置为新图像。

这是正在使用的函数的示例:

from tkinter import *


def makeTransparent(img, colorToMakeTransparentInHexFormat):
    newPhotoImage = PhotoImage(width=img.width(), height=img.height())
    for x in range(img.width()):
        for y in range(img.height()):
            rgb = '#%02x%02x%02x' % img.get(x, y)
            if rgb != colorToMakeTransparentInHexFormat:
                newPhotoImage.put(rgb, (x, y))
    return newPhotoImage


root = Tk()
mycanvas = Canvas(root, width=200, height=200,bg="orange")
mycanvas.pack()

myphotoImage = PhotoImage(file="whitecar.gif")
#set your image to the image returned by the function
myphotoImage = makeTransparent(myphotoImage, "#ffffff")
canvasImage = mycanvas.create_image(100, 100, image=myphotoImage, anchor=CENTER)

root.mainloop()

这是一个白色背景的白色汽车的例子:

白色背景的汽车

这是使用示例程序在画布上显示该汽车的示例:

橙色背景画布上的汽车

所以我希望我已经回答了你的问题。

  • 我没有使用 PIL。只有 tkinter 模块。
  • 我只使用了gif,而不是你问的png。
  • 无论白色在哪里,现在都将是透明的。

笔记:

无论出于何种原因,使用上述函数多次处理透明度可能会导致 tkinter 中的查看错误。下面是一种使用颜色切换功能去除多种颜色的方法: 这是一辆汽车:

灰色背景的红色汽车

这是另一个切换颜色的功能,可以在使颜色透明之前实现。

def switchColors(img, currentColor,futureColor):
    newPhotoImage = PhotoImage(width=img.width(), height=img.height())
    for x in range(img.width()):
        for y in range(img.height()):
            rgb = '#%02x%02x%02x' % img.get(x, y)
            if rgb == currentColor:
                newPhotoImage.put(futureColor, (x, y))
            else:
                newPhotoImage.put(rgb, (x, y))
    return newPhotoImage

这里正在使用

root = Tk()
mycanvas = Canvas(root, width=200, height=200,bg="orange")
mycanvas.pack()

myphotoImage = PhotoImage(file="car.png")

myphotoImage = switchColors(myphotoImage,"#db0000","#ffffff") #switch red to white
myphotoImage = switchColors(myphotoImage,"#d9d9d9","#ffffff") #switch greybackground to white
myphotoImage = switchColors(myphotoImage,"#6d6d6d","#ffffff") #switch windshield grey to white
myphotoImage = makeTransparent(myphotoImage,"#ffffff") #make white transparent

canvasImage = mycanvas.create_image(100, 100, image=myphotoImage, anchor=CENTER)

root.mainloop()

这是该过程的结果:

去除了 2 个灰色和红色的汽车

这是对类似问题的参考: 如何在不使用 PIL 的情况下在画布上旋转图像?

于 2021-07-25T18:03:07.873 回答
0

有一种方法可以将 PIL 与 Python 3 一起使用,使用 PIL 的非官方版本去http://www.lfd.uci.edu/~gohlke/pythonlibs/下载它。

于 2013-08-29T16:29:09.503 回答