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

之前在写远程桌面共享的时候一直没有思路,直到搜到了这篇文章:
(具体实现原理过程请看原文)
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.youkuaiyun.com/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,以此来解决色变的问题

本系列课程为Python实战系列课程:使用微信控制电脑,使用Python的Web框架Flask搭建网页, 并使用网页控制电脑;使用wxPython编写图形化的程序,并进一步将这个程序发展为远程控制程序。 课程目录: |--|----|----1 微信远控:Python 控制电脑的两种方法 |--|----|----|----1 课程介绍.mp4 |--|----|----|----2 命令提示符 CMD 入门.mp4 |--|----|----|----3 Python 执行 CMD 命令.mp4 |--|----|----|----4 Python 调用 Win API.mp4 |--|----|----2 微信远控:让微信控制电脑 |--|----|----|----1 微信控制电脑原理.mp4 |--|----|----|----2 新浪邮箱的设定.mp4 |--|----|----|----3 Python 收发邮件.mp4 |--|----|----|----4 微信控制电脑的实现.mp4 |--|----|----|----5 沙盘化的微信远控.mp4 |--|----|----3 Flask 快速搭建网站 |--|----|----|----1 课程介绍.mp4 |--|----|----|----2 Flask 与 BootStrap 搭建网页.mp4 |--|----|----|----3 Flask 操作数据库.mp4 |--|----|----4 网页控制电脑 |--|----|----|----1 课程介绍.mp4 |--|----|----|----2 建立通信.mp4 |--|----|----|----3 轮询与推送.mp4 |--|----|----|----4 网页控制电脑.mp4 |--|----|----5 Python 图形程序入门 |--|----|----|----1 wxPython 介绍与安装.mp4 |--|----|----|----2 基本控件介绍与绝对布局.mp4 |--|----|----|----3 控件相对布局.mp4 |--|----|----|----4 多线程与事件.mp4 |--|----|----6 编写图形界面的远程控制程序 |--|----|----|----1 远程控制程序的需求分析.mp4 |--|----|----|----2 Socket 通信.mp4 |--|----|----|----3 受控端功能强化.mp4 |--|----|----|----4 远程控制软件的实现与测试.mp4 |--|----|----7 开发远程控制程序高级功能 |--|----|----|----1 高级功能概述.mp4 |--|----|----|----2 读写剪贴板.mp4 |--|----|----|----3 使用 Python 截图.mp4 |--|----|----|----4 Python 上传文件.mp4 |--|----|----|----5 结课总结.mp4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值