在Python中显示具有透明度且没有背景或窗口的图像



我正在尝试在屏幕上显示一个图像,而不弹出任何窗口/应用程序/包含它。我非常接近TKinter,但删除画布背景色的方法很粗糙,并且有一些不想要的效果。

import tkinter as tk
import ctypes
user32 = ctypes.windll.user32
screen_size = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
root = tk.Tk()
root.overrideredirect(True)
root.config(bg="blue", bd=0, highlightthickness=0)
root.attributes("-transparentcolor", "#FEFCFD")
root.attributes("-topmost", True)
tk_img = tk.PhotoImage(file="image.png")
canvas = tk.Canvas(root, bg="#FEFCFD", bd=0, highlightthickness=0, width=screen_size[0], height=screen_size[1])
canvas.pack()
img = canvas.create_image(0, 0, image=tk_img, anchor="nw")
root.mainloop()

-transparentcolor标志主要去除背景,但如果图像具有任何部分透明的像素,则会对其进行着色。此外,如果图像中存在该颜色,则该颜色将被删除;这种颜色的选择是为了尽量减少图像中的精确匹配,同时也主要是白色,希望对图像的影响最小。这是它目前的样子;非常接近我想要的,但你可以在骰子的白色区域看到一些缺失的像素,由于它们的边缘是部分透明的,它们周围似乎都有一个白色的边界。这就是图像的外观。

我也尝试过使用wxPython来实现这种效果,但我无法删除窗口的背景,导致透明图像总是有一些颜色作为背景。我用了这个答案;我稍微修改了一下,但我所做的一切都没有改善它

那么,有没有一种方法可以在屏幕上用Python在没有任何背景的情况下绘制图像?

多亏了Kartikeya的建议,我才解决了自己的问题。

使用PyQt5,此代码将显示一个透明的图像,并且在所有中都没有边界或背景

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel
app = QApplication(sys.argv)
window = QMainWindow()
window.setAttribute(Qt.WA_TranslucentBackground, True)
window.setAttribute(Qt.WA_NoSystemBackground, True)
window.setWindowFlags(Qt.FramelessWindowHint)
label = QLabel(window)
pixmap = QPixmap('image.png')
label.setPixmap(pixmap)
label.setGeometry(0, 0, pixmap.width(), pixmap.height())
window.label = label
window.resize(pixmap.width(),pixmap.height())
window.show()
sys.exit(app.exec_())

当我在寻找PyQt5时,我发现了这个问题,只需要稍微修改一下代码。这是现在的样子。

那么,有没有一种方法可以在屏幕上绘制一个没有任何Python的背景?

使用Tkinter,对于此图像,不,您无法获得所需的结果(您可以查找其他模块,如"PyQT5"、"Kivy"、"wxPython"或"turtle"。(


请参阅,transparentcolor指定顶层的透明颜色索引。

如果你想在Tkinter中做到最好,下面是对你的代码的一些更改:

root.attributes('-transparentcolor', '#d4d4e2')
root.attributes("-topmost", True)
tk_img = tk.PhotoImage(file="image.png")       
canvas = tk.Canvas(root, bg="#d4d4e2", bd=0, highlightthickness=0, width=screen_size[0], height=screen_size[1])

因此,这将显示一个窗口,其中包含一个具有透明背景的画布。非常接近你想要的,你可以在骰子的白色区域看到更少的像素缺失,但这仍然不是解决方案。


但如果图像具有任何部分透明的像素,则会将其着色为

是的,如果图像中存在该颜色,它将被删除,因为该颜色用于标记需要用作透明颜色的内容。


选择颜色是为了最大限度地减少图片也是白色的,希望最少对图像的显著影响。

对于此图像的边缘/边界,为了保留部分"白色"透明背景,颜色的选择需要是"白色"的阴影。因此,用于使其透明的颜色是#d4d4e2(对于这张图像,只有一个地方使用了这种颜色像素,所以它不引人注意。(不过,边缘会有尖锐的角落和切口。

最新更新