如何解决ImageGrab.grab() 在给定坐标时无法正确裁剪屏幕截图
我需要创建一个小部件,它的作用类似于 Window 的截图工具,并在按钮释放时保存裁剪后的图像。
它工作得很好,除了图像被裁剪和保存,好像它被赋予了错误的坐标。我检查了全屏截图,坐标是 (0,1279,719),这是我的屏幕分辨率,所以我不明白为什么 ImageGrab.grab(bBox=) 无法正确裁剪。
这是代码。
from PIL import *
from tkinter import *
from PIL import ImageGrab
class Widget(Frame):
def __init__(self,master):
Frame.__init__(self,master=None)
self.root = master
self.root.attributes("-alpha",0.2)
self.root.attributes("-fullscreen",True)
self.root.title("")
self.canvas = Canvas(self,cursor="cross",background="blue",width= master.winfo_screenwidth(),height=master.winfo_screenheight() )
self.canvas.pack()
self.canvas.bind("<ButtonPress-1>",self.on_button_press)
self.canvas.bind("<B1-Motion>",self.on_move_press)
self.canvas.bind("<ButtonRelease-1>",self.on_button_release)
self.rect = None
self.start_x = None
self.start_y = None
def on_button_press(self,event):
# save mouse drag start position
self.start_x = self.canvas.canvasx(event.x)
self.start_y = self.canvas.canvasy(event.y)
self.rect = self.canvas.create_rectangle(0,1,outline='red')
def on_move_press(self,event):
curX = self.canvas.canvasx(event.x)
curY = self.canvas.canvasy(event.y)
# expand rectangle as you drag the mouse
self.canvas.coords(self.rect,self.start_x,self.start_y,curX,curY)
def on_button_release(self,event):
self.endx = self.canvas.canvasx(event.x)
self.endy = self.canvas.canvasy(event.y)
x1 = min(self.start_x,self.endx)
y1 = min(self.start_y,self.endy)
x2 = max(self.start_x,self.endx)
y2 = max(self.start_y,self.endy)
self.root.destroy()
img = ImageGrab.grab(bBox=(x1,y1,x2,y2))
img.save('capture.png')
if __name__ == "__main__":
snip_window = Tk()
width = snip_window.winfo_screenwidth()
height = snip_window.winfo_screenheight()
snip_window.geometry(f'{width}x{height}')
snip_widget = Widget(snip_window)
snip_widget.pack()
snip_window.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。