python使用UDP协议进行远程桌面共享

2021年9月20日 3点热度 0条评论 来源: Anansi_safe

之前在写远程桌面共享的时候一直没有思路,直到搜到了这篇文章:
(具体实现原理过程请看原文)
python实现基于UDP的视频直播程序

对我启发很大,但还有两个问题:
1.画质太低,导致连桌面上的文字都难辨认
2.存在色变,画面崩坏

解决办法

import threading
import time
import numpy
import cv2 as cv
from PIL import ImageGrab
from PIL import Image
from io import BytesIO

#因为开发需要,我将接收端的IP与端口写进配置文件
ip_inifile=open("ip.ini","r")
ipasport=ip_inifile.read()
ipAndport=ipasport.split(":")#拆分字符串
ip=ipAndport[0]	#接收端IP
port=ipAndport[1]	#接收端端口

def jiep_send():
 while True:
  ip_adder=(ip,int(port))
  #截取桌面
  img=ImageGrab.grab()
  #传输使用UDP协议,将图片分辨率变小方便传输,将ANTIALIAS作为第二个参数即可一定程度上提高画质
  out=img.resize((650,400),Image.ANTIALIAS)
  #申请一块内存块
  stram_0=BytesIO()
  #将图片以JPEG格式图片的方式保存至内存块
  out.save(stram_0,format='JPEG')
  #将内存块当作图片文件打开,并转为数组
  jp_array=numpy.array(Image.open(stram_0))
  stram_0.close()
  #再申请一个内存块
  stram_1=BytesIO()
  pic=Image.fromarray(jp_array)
  #将图片保存至新申请的内存块,以JPEG图片格式
  pic.save(stram_1,format='JPEG')
  #提取内存块中的值
  jpeg=stram_1.getvalue()
  stram_1.close()
  #设置UDP链接
  socket_0=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  #是否正常发送
  try:
   socket_0.sendto(jpeg,ip_adder)
  #断线重连机制,每三秒重拨一次
  except Exception as e:
   while True:
    try:
     socket_0.sendto(jpeg,ip_adder)
    except Exception as e:
     time.sleep(3)
    else:
     break
  else:
   pass
  finally:
   socket_0.close()

def _winmain()
 #因为开发需要我这里用了一个新线程来传输画面
 t1=threading.Thread(target=jiep_send)
 t1.start()
 
 if __name__=='__main__':
 _winmain()

这里基本上都是https://blog.csdn.net/qq_35488769/article/details/75500755
这位大佬的代码
我对这段代码的改动就是
out=img.resize((650,400),Image.ANTIALIAS)
out=img.resize((650,400),Image.ANTIALIAS)
将ANTIALIAS作为第二个参数,以此尽可能提高画质
(虽然画质还是不高,但是起码能够辨认出汉字字符惹。。。)

接收端代码

#_*_ coding:utf-8 _*_
import pyHook
import pythoncom
import socket
import os
import numpy 
import cv2 as cv
from PIL import ImageGrab
from PIL import Image
from PIL import ImageFilter
from io import BytesIO
import threading

def jiep_recv(ip_port):
 socket_0=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 socket_0.bind((socket.gethostname(),ip_port))
 while True:
  try:
   img_data,address=socket_0.recvfrom(1024*1024)
  except Exception as e:
   cv.destroyAllWindows()
  else:
   #申请内存块,并将收到的UDP数据放进内存块
   buf=BytesIO(img_data)
   #将收到的UDP数据转为数组
   img_data=numpy.array(Image.open(buf))
   #这一步作用重要,image类颜色格式为RGB,cv图片颜色格式为BGR故要将颜色格式进行转化,否则将色变
   img_data_1=cv.cvtColor(img_data,cv.COLOR_RGB2BGR)
   img_data_1=cv.resize(img_data_1,(850,500),)
   #显示图片
   cv.imshow("Service",img_data_1)
   buf.close()
   cv.waitKey(1)


def _winmains_():
 print 20*"*"+"xxxx"+20*"*"
 port=int(input("请输入接收端口:"))
 if port>65534:
  print "端口号过大!"
  return
 else:
  t1=threading.Thread(target=jiep_recv,args=(port,))
  t1.start()
#开发需要,用了一个新线程

if __name__=='__main__':
 _winmains_()

接收端主要利用img_data_1=cv.cvtColor(img_data,cv.COLOR_RGB2BGR)这句代码来将RGB转换为BGR,以此来解决色变的问题

    原文作者:Anansi_safe
    原文地址: https://blog.csdn.net/weixin_43815930/article/details/88413207
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。