当前位置 博文首页 > 文章内容

    Python tkinter canvas实现图片裁剪

    作者: 栏目:未分类 时间:2020-10-29 18:00:36

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    实现:tkinter 画布上显示图片,按下鼠标左键并且移动,实现截图

    # -*- encoding=utf-8 -*-
    import os
    import tkinter as tk
    
    from PIL import Image
    from PIL import ImageTk
    
    left_mouse_down_x = 0
    left_mouse_down_y = 0
    left_mouse_up_x = 0
    left_mouse_up_y = 0
    sole_rectangle = None
    
    
    def left_mouse_down(event):
        # print('鼠标左键按下')
        global left_mouse_down_x, left_mouse_down_y
        left_mouse_down_x = event.x
        left_mouse_down_y = event.y
    
    
    def left_mouse_up(event):
        # print('鼠标左键释放')
        global left_mouse_up_x, left_mouse_up_y
        left_mouse_up_x = event.x
        left_mouse_up_y = event.y
        corp_img(img_path, 'img/one_corp.png', left_mouse_down_x, left_mouse_down_y,
                 left_mouse_up_x, left_mouse_up_y)
    
    
    def moving_mouse(event):
        # print('鼠标左键按下并移动')
        global sole_rectangle
        global left_mouse_down_x, left_mouse_down_y
        moving_mouse_x = event.x
        moving_mouse_y = event.y
        if sole_rectangle is not None:
            canvas.delete(sole_rectangle)  # 删除前一个矩形
        sole_rectangle = canvas.create_rectangle(left_mouse_down_x, left_mouse_down_y, moving_mouse_x,
                                                 moving_mouse_y, outline='red')
    
    
    def right_mouse_down(event):
        # print('鼠标右键按下')
        pass
    
    
    def right_mouse_up(event):
        # print('鼠标右键释放')
        pass
    
    
    def corp_img(source_path, save_path, x_begin, y_begin, x_end, y_end):
        if x_begin < x_end:
            min_x = x_begin
            max_x = x_end
        else:
            min_x = x_end
            max_x = x_begin
        if y_begin < y_end:
            min_y = y_begin
            max_y = y_end
        else:
            min_y = y_end
            max_y = y_begin
        save_path = os.path.abspath(save_path)
        if os.path.isfile(source_path):
            corp_image = Image.open(source_path)
            region = corp_image.crop((min_x, min_y, max_x, max_y))
            region.save(save_path)
            print('裁剪完成,保存于:{}'.format(save_path))
        else:
            print('未找到文件:{}'.format(source_path))
    
    
    if __name__ == '__main__':
        pass
        win = tk.Tk()
        frame = tk.Frame()
        frame.pack()
        screenwidth = win.winfo_screenwidth()
        screenheight = win.winfo_screenheight()
        img_path = 'img/one.png'
        # img_path = 'img/bg.jpg'
        # img_path = 'img/test.jpg'
        # img_path = 'img/pic.gif'
        image = Image.open(img_path)
        image_x, image_y = image.size
        if image_x > screenwidth or image_y > screenheight:
            print('The picture size is too big,max should in:{}x{}, your:{}x{}'.format(screenwidth,
                                                                                       screenheight,
                                                                                       image_x,
                                                                                       image_y))
        img = ImageTk.PhotoImage(image)
        canvas = tk.Canvas(frame, width=image_x, height=image_y, bg='pink')
        i = canvas.create_image(0, 0, anchor='nw', image=img)
        canvas.pack()
        canvas.bind('<Button-1>', left_mouse_down)  # 鼠标左键按下
        canvas.bind('<ButtonRelease-1>', left_mouse_up)  # 鼠标左键释放
        canvas.bind('<Button-3>', right_mouse_down)  # 鼠标右键按下
        canvas.bind('<ButtonRelease-3>', right_mouse_up)  # 鼠标右键释放
        canvas.bind('<B1-Motion>', moving_mouse)  # 鼠标左键按下并移动
        win.mainloop()

    原图one.png

     运行

     

    one_corp.png