代码之家  ›  专栏  ›  技术社区  ›  David González Blazman

从PIL调用Tkinter中的图像而不保存它

  •  0
  • David González Blazman  · 技术社区  · 6 年前

    我制作了一个函数,可以将PNG中图像的黑色(透明背景的黑色图标)更改为Windows中的强调主题的颜色。 我使用此函数使所有图标与窗口的颜色界面相匹配,但使用此函数,我需要手动调用图像的函数,然后选择图像并将其定义为 PhotoImage 把它当作一个 Label 在特金特。 这样做的目的,是制定一种方法,将主PNG(黑色图标)定义为一个动态彩色图像,该图像可以用作 光图像 但即使有 Image.TkPhotoImage PIL库的方法,我还没做。

    我的函数代码是:

     def changeImageColorToAccentColor(imagename):
         imagename = str(imagename)
         accent = str(getAccentColor().lstrip('#'))
    
    
         rcolor = int(str(accent[0:2]),16)
         gcolor = int(str(accent[2:4]),16)
         bcolor = int(str(accent[4:6]),16)
    
         im = Image.open(str(imagename))
         im = im.convert('RGBA')
    
         data = np.array(im)   # "data" is a height x width x 4 numpy array
         red, green, blue, alpha = data.T # Temporarily unpack the bands for readability
    
         # Replace white with red... (leaves alpha values alone...)
         white_areas = (red == 0) & (blue == 0) & (green == 0) & (alpha == 255)
         data[..., :-1][white_areas.T] = (rcolor, gcolor, bcolor) # Transpose back needed
    
         im2 = Image.fromarray(data)
         image1 = ImageTk.PhotoImage(im2)
         return(image1)
    

    然后,我在Tkinter中定义了我的标签,给出了 image 选项返回photoimage对象的函数。

    icon = Label(image=changeImageColorToAccentColor('file.png'))
    

    但它对我不起作用,所以,如果这个证据不起作用,我就无法制造出这个物体。

    1 回复  |  直到 6 年前
        1
  •  1
  •   fhdrsdg    6 年前

    您需要TA保存对 PhotoImage 对象。如果它被垃圾收集,图像将不会显示。把它传递给 Label 作为 image 参数不会自动保存引用。如果你这样做了

    im = changeImageColorToAccentColor('image2.png')
    icon = Label(root, image=im)
    

    这个 照片图像 对象另存为 im 图像就会显示出来。