微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ImageGrab.grab() 在给定坐标时无法正确裁剪屏幕截图

如何解决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 举报,一经查实,本站将立刻删除。