python双端监控屏幕传输显示

import io
import time
import socket
import pyautogui


def capture_and_send_image():
    while True:
        try:
            # 截图
            screenshot = pyautogui.screenshot()
            # 缩小图片
            new_size = (screenshot.width // 10, screenshot.height // 10)
            resized_screenshot = screenshot.resize(new_size)
            # 将图片转换为字节流
            img_byte_arr = io.BytesIO()
            resized_screenshot.save(img_byte_arr, format='PNG')
            img_byte_arr = img_byte_arr.getvalue()
            # 发送数据
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('localhost', 10000))
            s.sendall(img_byte_arr)
            s.close()
        except Exception as e:
            print(f"发送端发生错误: {e}")
        # 暂停一段时间,避免过于频繁发送
        time.sleep(0.2)


if __name__ == "__main__":
    while True:
        try:
            capture_and_send_image()
        except Exception as e:
            print(e)
            time.sleep(1)
            print("重新连接")

import time
import socket
import threading
import tkinter as tk
from tkinter import PhotoImage


start_time = None
network_flux = 0
one_second_data = 0
fps_times = 0
fps = 0


def network(KB):
    global start_time, network_flux, one_second_data, fps_times, fps
    network_flux += KB
    if start_time is None:
        start_time = time.time()
        return
    if time.time() - start_time > 2:  # 两秒更新一次
        one_second_data = f"{network_flux / 1024 / (time.time() - start_time):.1f} kb/s"
        fps = f"{fps_times / (time.time() - start_time):.1f} fps/s"
        print(one_second_data)
        network_flux = KB
        start_time = None
        fps_times = 0


class DraggableImage:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Image")
        self.bg_color = '#F0F0F0'  # 透明
        self.root.config(bg=self.bg_color)  # 背景色
        self.root.wm_attributes('-transparentcolor', self.bg_color)  # 透明
        self.root.wm_attributes("-topmost", True)  # 无边框
        self.root.overrideredirect(True)  # 置顶
        self.drag_data = {"x": 0, "y": 0, "is_dragging": False}
        self.tk_image = None
        self.canvas = tk.Canvas(self.root)
        self.canvas.pack()

        self.time_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
        self.time_label.pack(side=tk.TOP)
        self.fps_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
        self.fps_label.pack(side=tk.TOP)

        self.start_receive_image()

    def start_receive_image(self):
        thread = threading.Thread(target=self.receive_image)
        thread.start()

    def receive_image(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('localhost', 10000))
        s.listen(1)
        while True:
            try:
                conn, addr = s.accept()
                img_data = b""
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    img_data += data
                conn.close()
                network(len(img_data))

                # 加锁确保 UI 更新线程安全
                self.root.after(0, self.update_image, img_data)

            except Exception as e:
                print(f"接收端发生错误: {e}")

    def update_image(self, img_data):
        global fps_times
        fps_times += 1
        # 释放之前的图像资源
        if self.tk_image:
            del self.tk_image
        # 获取尺寸
        original_width, original_height = 160, 90
        # 控制图片数据用于反复使用覆盖,而不是新增
        self.tk_image = PhotoImage(data=img_data)

        # 仅更新图像,而不是销毁并重建 canvas
        self.canvas.config(width=original_width, height=original_height)
        self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)
        self.canvas.bind("", self.on_press)
        self.canvas.bind("", self.on_drag)
        self.canvas.bind("", self.on_release)
        self.canvas.bind("", self.on_right_click)

        # 更新时间和 fps 信息
        self.update_time_and_fps()

    def update_time_and_fps(self):
        global one_second_data, fps
        self.time_label.config(text=one_second_data)
        self.fps_label.config(text=fps)
        self.root.after(2000, self.update_time_and_fps)

    # 右键点击销毁
    def on_right_click(self, event):
        self.canvas.destroy()
        self.root.destroy()
        raise 0

    def on_press(self, event):
        # 记录鼠标按下时的位置
        self.drag_data["x"] = event.x_root
        self.drag_data["y"] = event.y_root
        self.drag_data["is_dragging"] = True

    def on_drag(self, event):
        if self.drag_data["is_dragging"]:
            # 计算鼠标移动的偏移量
            dx = event.x_root - self.drag_data["x"]
            dy = event.y_root - self.drag_data["y"]
            # 移动窗口
            self.root.geometry(f"+{self.root.winfo_x() + dx}+{self.root.winfo_y() + dy}")
            # 更新鼠标位置
            self.drag_data["x"] = event.x_root
            self.drag_data["y"] = event.y_root

    def on_release(self, event):
        # 释放时清除拖动状态
        self.drag_data["is_dragging"] = False


if __name__ == "__main__":
    app = DraggableImage()
    app.root.mainloop()
import io
import time
import socket
import pyautogui


def capture_and_send_image():
    while True:
        try:
            # 截图
            screenshot = pyautogui.screenshot()
            # 缩小图片
            new_size = (screenshot.width // 10, screenshot.height // 10)
            resized_screenshot = screenshot.resize(new_size)
            # 将图片转换为字节流
            img_byte_arr = io.BytesIO()
            resized_screenshot.save(img_byte_arr, format='PNG')
            img_byte_arr = img_byte_arr.getvalue()
            # 发送数据
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('localhost', 10000))
            s.sendall(img_byte_arr)
            s.close()
        except Exception as e:
            print(f"发送端发生错误: {e}")
        # 暂停一段时间,避免过于频繁发送
        time.sleep(0.2)


if __name__ == "__main__":
    while True:
        try:
            capture_and_send_image()
        except Exception as e:
            print(e)
            time.sleep(1)
            print("重新连接")
import time
import socket
import threading
import tkinter as tk
from tkinter import PhotoImage


start_time = None
network_flux = 0
one_second_data = 0
fps_times = 0
fps = 0


def network(KB):
    global start_time, network_flux, one_second_data, fps_times, fps
    network_flux += KB
    if start_time is None:
        start_time = time.time()
        return
    if time.time() - start_time > 2:  # 两秒更新一次
        one_second_data = f"{network_flux / 1024 / (time.time() - start_time):.1f} kb/s"
        fps = f"{fps_times / (time.time() - start_time):.1f} fps/s"
        print(one_second_data)
        network_flux = KB
        start_time = None
        fps_times = 0


class DraggableImage:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Image")
        self.bg_color = '#F0F0F0'  # 透明
        self.root.config(bg=self.bg_color)  # 背景色
        self.root.wm_attributes('-transparentcolor', self.bg_color)  # 透明
        self.root.wm_attributes("-topmost", True)  # 无边框
        self.root.overrideredirect(True)  # 置顶
        self.drag_data = {"x": 0, "y": 0, "is_dragging": False}
        self.tk_image = None
        self.canvas = tk.Canvas(self.root)
        self.canvas.pack()

        self.time_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
        self.time_label.pack(side=tk.TOP)
        self.fps_label = tk.Label(self.root, bg=self.bg_color, fg='white', font=('Arial', 12))
        self.fps_label.pack(side=tk.TOP)

        self.start_receive_image()

    def start_receive_image(self):
        thread = threading.Thread(target=self.receive_image)
        thread.start()

    def receive_image(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('localhost', 10000))
        s.listen(1)
        while True:
            try:
                conn, addr = s.accept()
                img_data = b""
                while True:
                    data = conn.recv(1024)
                    if not data:
                        break
                    img_data += data
                conn.close()
                network(len(img_data))

                # 加锁确保 UI 更新线程安全
                self.root.after(0, self.update_image, img_data)

            except Exception as e:
                print(f"接收端发生错误: {e}")

    def update_image(self, img_data):
        global fps_times
        fps_times += 1
        # 释放之前的图像资源
        if self.tk_image:
            del self.tk_image
        # 获取尺寸
        original_width, original_height = 160, 90
        # 控制图片数据用于反复使用覆盖,而不是新增
        self.tk_image = PhotoImage(data=img_data)

        # 仅更新图像,而不是销毁并重建 canvas
        self.canvas.config(width=original_width, height=original_height)
        self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)
        self.canvas.bind("", self.on_press)
        self.canvas.bind("", self.on_drag)
        self.canvas.bind("", self.on_release)
        self.canvas.bind("", self.on_right_click)

        # 更新时间和 fps 信息
        self.update_time_and_fps()

    def update_time_and_fps(self):
        global one_second_data, fps
        self.time_label.config(text=one_second_data)
        self.fps_label.config(text=fps)
        self.root.after(2000, self.update_time_and_fps)

    # 右键点击销毁
    def on_right_click(self, event):
        self.canvas.destroy()
        self.root.destroy()
        raise 0

    def on_press(self, event):
        # 记录鼠标按下时的位置
        self.drag_data["x"] = event.x_root
        self.drag_data["y"] = event.y_root
        self.drag_data["is_dragging"] = True

    def on_drag(self, event):
        if self.drag_data["is_dragging"]:
            # 计算鼠标移动的偏移量
            dx = event.x_root - self.drag_data["x"]
            dy = event.y_root - self.drag_data["y"]
            # 移动窗口
            self.root.geometry(f"+{self.root.winfo_x() + dx}+{self.root.winfo_y() + dy}")
            # 更新鼠标位置
            self.drag_data["x"] = event.x_root
            self.drag_data["y"] = event.y_root

    def on_release(self, event):
        # 释放时清除拖动状态
        self.drag_data["is_dragging"] = False


if __name__ == "__main__":
    app = DraggableImage()
    app.root.mainloop()

你可能感兴趣的:(python,服务器,图像处理,网络,学习,前端)