C# 温故而知新:Stream篇(七)

C# 温故而知新:Stream篇(七)

NetworkStream

目录:

  • NetworkStream的作用
  • 简单介绍下TCP/IP 协议和相关层次
  • 简单说明下 TCP和UDP的区别
  • 简单介绍下套接字(Socket)的概念
  • 简单介绍下TcpClient,TcpListener,IPEndPoint类的作用
  • 使用NetworkStream的注意事项和局限性
  • NetworkStream的构造
  • NetworkStream的属性
  • NetworkStream的方法
  • NetwrokStream的简单示例
  •            创建一个客户端向服务端传输图片的小示例
  • 本章总结

 

 

 

1.NetworkStream的作用

先前的流有所不同,NetworkStream 的特殊性可以在它的命名空间中得以了解(System.Net.Sockets),聪明的你马上会反应过来:

既然是在网络中传输的流,那必然有某种协议或者规则约束它,不错,这种协议便是Tcp/IP协议,这个是什么东东?别急,我先让大家了

解下NetworkStream的作用:如果服务器和客户端之间基于TCP连接的,他们之间能够依靠一个稳定的字节流进行相互传输信息,这也是

NetworkStream的最关键的作用,有了这个神奇的协议,NetWorkStream便能向其他流一样在网络中(进行点对点的传输),这种传输的

效率和速度是非常高的(UDP也很快,稍后再介绍)

如果大家对这个概念还不是很清晰的话,别怕,后文中我会更详细的说明

这里有5点大家先理解就行

  1. NetworkStream只能用在具有Tcp/IP协议之中,如果用在UDP中编译不报错,会报异常
  2. NetworkStream 是面向连接的
  3. 在网络中利用流的形式传递信息
  4. 必须借助Socket (也称之为流式socket),或使用一些返回的返回值,例如TcpClient类的GetStream方法
  5. 用法和普通流方法几乎一模一样,但具有特殊性

 

 

 

 

 

 

 

 

2.简单介绍下TCP/IP 协议和相关层次

提到协议相信许多初学者或者没搞过这块的朋友会一头雾水,

不过别怕,协议也是人定的,肯定能搞懂:

其实协议可以这么理解,是人为定制的为某个活动定义的一些列规则和约束

就好比足球赛上的红黄牌,这是由世界足联定制的协议或者规范,一旦不按照这个协议

足球赛肯定会一片混乱

 

 

 

 

 

进入正题:

TCP/IP
全称:Transmission Control Protocol/Internet Protocol (传输控制协议/因特网互联协议,又名网络通讯协议)

这个便是互联网中的最基本的协议,Tcp/IP 定义了电子设备如何进入到互联网,以及数据如何在网络中传递。既然有了协议但是空头支票

还是不行地,就好比足联定制了这些规则,但是没有裁判在球场上来实施这些规则一样,Tcp/IP协议也有它自己的层次结构,关于它的层次

结构,大家看图就能明白

 

 发送数据:

大家不用刻板的去理解这个协议,我还是用我们最普通的浏览网页来让大家理解下,首先打开浏览器输入一个url,这时候应用层会判断这个要求是否是http的

,然后http会将请求信息交给传输层来执行,传输层主要负责信息流的格式化并且提供一个可靠地传输,这时候,TCP和UDP这两个协议在这里起作用了,

TCP协议规定:接收端必须发回确认,并且假如分组丢失,必须重新发送,接着网络层得到了这些需要发送的数据,(网络中的IP协议非常重要,不仅是IP协议,

还有ARP协议(查找远程主机MAC地址)),这时候网络层会命令网络接口层去发送这些信息(IP层主要负责的是在节点之间(End to End)的数据包传送,

这里的节点是一台网络设备,比如计算机,大家便可理解为网络接口层的设备),最终将请求数据发送至远程网站主机后等待远程主机发送来信息

  

接收数据:

 好了,远程网站主机会根据请求信息(Ip,数据报等等)发送一些列的网页数据通过网线或者无线路由,回到网络接口层,然后逐级上报,通过网络层的ip然后通过

传输层的一些列格式化,最终通过http返回至浏览器显示网页了

基于篇幅的关系,还有其他的协议大家可以自行去学习了解学习

喜欢足球的朋友的朋友也许会反应过来:这不是2-4-5阵型么?其实不然,很多协议我还没画上去,其实大致含义就是每个层次上的协议(足球队员有他各自的职责),

这些才能构成计算机与计算机之间的传输信息的桥梁。相信园子里很多大牛都写过http 协议,大家也可以去学习下

 

 3.简单说明下 TCP和UDP的区别

TCP:

1 TCP是面向连接的通信协议,通过三次握手建立连接

2 TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性

 

UDP:

1 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送

2 UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求在程序员编程验证

3 由于上述2点的关系,UDP传输速度更快,但是安全性比较差,很容易发生未知的错误,所以本章的NetworkStream无法使用在UDP的功能上

 

4.简单介绍下套接字(Socket)的概念

关于Socket的概念和功能可能可以写很长一篇博文来介绍,这里大家把Socket理解Tcp/IP协议的抽象,并且能够实现Tcp/IP协议栈的工具就行,换句话说,我们可以

利用Socket实现客户端和服务端双向通信,同样,对于Socket最关键的理解还没到位,很多新人或者不常用的朋友会问:Socket到底功能是什么?怎么工作的?

再次举个例子,女友打电话给我,我可以选择连接,或者拒绝,如果我接了她的电话,也就是说,我和她通过电话连接(Connect),那电话就是“Socket”,女友和我

都可以是客户端或服务端,只要点对点就行,我们的声音通过电话传递,但是具体传输内容不归Socket管辖范围,Socket的直接任务可以归纳为以下几点:

  1. 创建客户端或服务端
  2. 服务端或客户端监听是否有服务端或客户端传来的连接信息(Listening)
  3. 创建点对点的连接(Connect)
  4. 发送accept 信息给对方,表示两者已经建立连接,并且可以互相传递信息了(Send)
  5. 具体发送什么信息内容不是Socket管辖的范围,但是必须是Socket进行发送的动作
  6. 同理可以通过Socket去接受对方发来的信息,并加以处理

 

 

 

 

 

 

 

简单的Socket示例代码:

 点击这里

 

5.简单介绍下TcpClient,TcpListener,IPEndPoint类的作用

1: TcpClient

此类是微软基于Tcp封装类,用于简化Tcp客户端的开发,主要通过构造带入主机地址或者IPEndPonint对象,然后调用Connect进行和服务器点对点的连接,连接成功后通

过GetStream方法返回NetworkStream对象

2: TcpListener

此类也是微软基于Tcp封装类,用于监听服务端或客户端的连接请求,一旦有连接请求信息,立刻交给TcpClient的AcceptTcpClient方法捕获,Start方法用于开始监听

3: IPEndPonint

处理IP地址和端口的封装类

4:IPAddress

提供包含计算机在 IP 网络上的地址的工具类

 

 

6.使用NetworkStream的注意事项和局限性

抱歉到目前为止才开始介绍NetworkStream,我相信大家到这里在回过头去看第一节的作用时能够更多的领悟。前五节意在说明下NetworkStream背后那个必须掌握的知识点,

这样才能在实际编程过程中很快上手,毕竟NetworkStream的工作环境和其他流有着很大的差别,

再回到第一节关于NetworkStream的知识点,在使用时有几点必须注意

首先

1 再次强调NetworkStream是稳定的,面向连接的,所以它只适合TCP协议的环境下工作

所以一旦在UDP环境中,虽然编译不会报错,但是会跳出异常

2 我们可以通过NetworkStream简化Socket开发

3 如果要建立NetworkStream一个新的实例,则必须使用已经连接的Socket

4 NetworkStream 使用后不会自动关闭提供的socket,必须使用NetworkStream构造函数时指定Socket所有权(NetworkStream 的构造函数中设置)。

6 NetworkStream支持异步读写操作

NetworkStream的局限性

  1. 可惜的是NetworkStream基于安全上的考虑不支持 Posion属性或Seek方法,寻找或改变流的位置,如果试图强行使用会报出NotSupport的异常
  2. 支持传递数据的种类没有直接使用Socket来的多

 

 

7.NetworkStream的构造

1.NetworkStream (Socket)  为指定的 Socket 创建 NetworkStream 类的新实例

2.NetworkStream (Socket, Boolean ownsSocket)  用指定的 Socket 所属权为指定的 Socket

ownsSocket表示指示NetworkStream是否拥有该Socket

3.NetworkStream (Socket, FileAccess)  用指定的访问权限为指定的 Socket 创建

FileAccess 值的按位组合,这些值指定授予所提供的 Socket 上的 NetworkStream 的访问类型

4.NetworkStream (Socket, FileAccess, Boolean ownsSocket) 。

对于NetworkStream构造函数的理解相信大家经过前文的解释也能够掌握了,但是有几点

必须强调下

1如果用构造产生NetworkStream的实例,则必须使用连接的Socket

2 如果该NetworkStream拥有对Socket的所有权,则在使用NetworkStream的Close方法时会同时关闭Socket,

否则关闭NetworkStream时不会关闭Socket

3, 能够创建对指定Socket带有读写权限的NetworkStream

 

 

 

 

 

 

 

 

 

 

8.NetworkStream的属性

1. CanSeek :用于指示流是否支持查找,它的值始终为 false

2. DataAvailable 指示在要读取的 NetworkStream 上是否有可用的数据。一般来说通过判断这个属性来判断NetworkStream中是否有数据

3. Length:NetworkStream不支持使用Length属性,强行使用会发生NotSupportedException异常

4.Position: NetworkStream不支持使用Position属性,强行使用会发生NotSupportedException异常

 

9.NetworkStream的方法

同样,NetworkStream的方法大致重写或继承了Stream的方法

但是以下方法必须注意:

1 int Read(byte[] buffer,int offset,int size)

该方法将数据读入 buffer 参数并返回成功读取的字节数。如果没有可以读取的数据,则 Read 方法返回 0。Read 操作将读取尽可能多的可用数据,

直至达到由 size 参数指定的字节数为止。如果远程主机关闭了连接并且已接收到所有可用数据,Read 方法将立即完成并返回零字节。

2 long Seek(long offset, SeekOrigin origin)

将流的当前位置设置为给定值。此方法当前不受支持,总是引发 NotSupportedException。

3  void Write(byte[] buffer, int offset,int size)

Write方法在指定的 offset 处启动并将 buffer 内容中的 size 字节发送到网络Write 方法将一直处于阻止状态(可以用异步解决),直到发送了请求

的字节数或引发 SocketException 为止。如果收到 SocketException,可以使用 SocketException.ErrorCode 属性获取特定的错误代码。

 

10.NetworkStream的简单示例

创建一个客户端向服务端传输图片的小示例

服务端一直监听客户端传来的图片信息

   /// <summary>/// 服务端监听客户端信息,一旦有发送过来的信息,便立即处理/// </summary>class Program{//全局TcpClientstatic TcpClient client;//文件流建立到磁盘上的读写流static FileStream fs = new FileStream("E:\\abc.jpg", FileMode.Create);//bufferstatic int bufferlength = 200;static byte[] buffer = new byte[bufferlength];//网络流static NetworkStream ns;static void Main(string[] args){ConnectAndListen();}static void ConnectAndListen() {//服务端监听任何IP 但是端口号是80的连接TcpListener listener = new TcpListener(IPAddress.Any,80);//监听对象开始监听
            listener.Start();while(true){Console.WriteLine("等待连接");//线程会挂在这里,直到客户端发来连接请求client = listener.AcceptTcpClient();Console.WriteLine("已经连接");//得到从客户端传来的网络流ns = client.GetStream();//如果网络流中有数据if (ns.DataAvailable){//同步读取网络流中的byte信息// do//  {//  ns.Read(buffer, 0, bufferlength);//} while (readLength > 0);//异步读取网络流中的byte信息ns.BeginRead(buffer, 0, bufferlength, ReadAsyncCallBack, null);}}}/// <summary>/// 异步读取/// </summary>/// <param name="result"></param>static void ReadAsyncCallBack(IAsyncResult result) {int readCount;//获得每次异步读取数量readCount = client.GetStream().EndRead(result);//如果全部读完退出,垃圾回收if (readCount < 1) {client.Close();ns.Dispose();fs.Dispose();return; }//将网络流中的图片数据片段顺序写入本地fs.Write(buffer, 0, 200);//再次异步读取ns.BeginRead(buffer, 0, 200, ReadAsyncCallBack, null);}}

 客户端先连接上服务端后在发送图片,注意如果是双向通信的话最好将客户端和服务端的项目设置为多个启动项便于调试

    class Program{/// <summary>/// 客户端/// </summary>/// <param name="args"></param>static void Main(string[] args){SendImageToServer("xxx.jpg");}   static void SendImageToServer(string imgURl){if (!File.Exists(imgURl)) return;//创建一个文件流打开图片FileStream fs = File.Open(imgURl, FileMode.Open);//声明一个byte数组接受图片byte信息byte[] fileBytes = new byte[fs.Length];using (fs){//将图片byte信息读入byte数组中fs.Read(fileBytes, 0, fileBytes.Length);fs.Close();}//找到服务器的IP地址IPAddress address = IPAddress.Parse("127.0.0.1");//创建TcpClient对象实现与服务器的连接TcpClient client = new TcpClient();//连接服务器client.Connect(address, 80);using (client){//连接完服务器后便在客户端和服务端之间产生一个流的通道NetworkStream ns = client.GetStream();using (ns){//通过此通道将图片数据写入网络流,传向服务器端接收ns.Write(fileBytes, 0, fileBytes.Length);}}}}


附件: 关于Socket的一个简单示例

服务器端建立服务并且循环监听 

View Code
        const int PORT = 80;static Socket clientSocket;static Socket client;static void Main(string[] args){Thread thread=new Thread(new ThreadStart(SetUpBlockServer));thread.Start();}/// <summary>/// 服务器端建立服务并且循环监听/// </summary>static void SetUpBlockServer() {//同样建立TcpListener 监听对象监听客户端传来的信息TcpListener lis = new TcpListener(IPAddress.Any, PORT);Console.WriteLine("正在监听任何端口号为80的任意IP的连接");//启动监听
            lis.Start();while (true) {//进程会挂起,知道客户端的socket发送连接请求clientSocket = lis.AcceptSocket();Console.WriteLine("{0}时刻接收到客户端的连接请求",DateTime.Now.ToString("G"));//连接成功后发送给客户端信息string testMessage = "连接成功";clientSocket.Send(Encoding.Default.GetBytes(testMessage));}}

 客户端连接服务端的请求,和循环监听服务端传来的信息

View Code
 class Program{//端口const int PORT = 80;static void Main(string[] args){Connect("127.0.0.1");}/// <summary>/// 建立与服务器端的异步连接/// </summary>/// <param name="server"></param>static void Connect(string server) {//建立一个socket用来和服务的Socket进行通信Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//获得服务器IP地址IPAddress ipAddress = IPAddress.Parse(server);//获得服务器端口IPEndPoint point = new IPEndPoint(ipAddress, PORT);//开始异步连接,注意将socket放入异步方法的参数中,提供给回调方法使用socket.BeginConnect(point, new AsyncCallback(ConnectCallBack), socket);Thread.Sleep(10000000);}/// <summary>///异步连接后的callback事件/// </summary>/// <param name="result"></param>static void ConnectCallBack(IAsyncResult result) {try{//建立一个接受信息的byte数组byte[] receiveBuffer = new byte[4098];//从回调参数中获取上面Conntect方法中的socket对象Socket socket = result.AsyncState as Socket;//判断是否和服务端的socket建立连接if (socket.Connected){//开始 异步接收服务端传来的信息,同样将socket传入回调方法的参数中socket.BeginReceive(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket);}else { ConnectCallBack(result); }}catch {Console.WriteLine("连接出错");}}/// <summary>///  一旦服务器发送信息,则会触发回调方法/// </summary>/// <param name="result"></param>static void ReceiveCallBack(IAsyncResult result) {byte[] receiveBuffer = new byte[4098];Socket socket = result.AsyncState as Socket;//读取从服务器端传来的数据,EndReceive是关闭异步接收方法,同时读取数据int count = socket.EndReceive(result);if (count > 0) {try{//接受完服务端的数据后的逻辑
                }catch {}}// 递归监听服务器端是否发来信息,一旦服务器再次发送信息,客户端仍然可以接收到socket.BeginReceive(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ReceiveCallBack,socket);}}

 

本章总结

 本章简单介绍了关于NetworkStream以及其周边的一些衍生知识,这些知识的重要性不言而喻,从Tcp/IP协议到期分层结构,

  Socket和NetworkStream 的关系和注意事项,以及Socket在Tcp/IP协议中的角色等等,不知不觉Stream篇快接近于尾声了

  期间感谢大家的关注,今后我会写新的系列,请大家多多鼓励

 

 

 

 

转载于:https://www.cnblogs.com/JimmyZheng/archive/2012/05/17/2502727.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波7 - 直方图处理 - 直方图、归一化直方图

目录直方图处理直方图处理 令rk,k0,1,2,…,L−1r_k, k0, 1, 2, \dots, L-1rk​,k0,1,2,…,L−1表于一幅LLL级灰度数字图像f(x,y)f(x,y)f(x,y)的灰度。fff的非归一化直方图定义为&#xff1a; h(rk)nk,k0,1,2,…,L−1(3.6)h(r_{k}) n_{k}, \quad k 0, 1, 2, \dots, L-1 \tag{…

Xamarin Android提示找不到资源属性定义

为什么80%的码农都做不了架构师&#xff1f;>>> Xamarin Android提示找不到资源属性定义 错误信息&#xff1a;”Resource.Attribute”未包含”actonBarSize”的定义 Xamarin Android经常会出现找不到资源属性的错误。遇到这种问题&#xff0c;建议先清理解决方法和…

MAC OS X 1.1 El Capitan安装方法与步骤

2019独角兽企业重金招聘Python工程师标准>>> 苹果公司发布了最新的Mac系统El Capitan,我也跟风安装了, 昨天试了一天终于算是安装成功了. ###电脑配置: CPU: E3-1230 v2 主板: 技嘉B75M D3V 显卡: 微星6850 声卡: Realtek ALC887 键盘: Noppoo 84键机械键盘 ###下载…

vp与vs联合开发-网口通信(socket)

Socket通信是一种在网络中进行进程间通信的机制。它使用了一种称为套接字&#xff08;Socket&#xff09;的编程接口&#xff0c;通过该接口可以创建、连接、发送和接收数据等操作。 Socket通信中&#xff0c;有两个主要的角色&#xff1a;服务器和客户端。服务器负责监听指定…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)

直方图均衡化 灰度映射函数&#xff1a; sT(r),0≤r≤L−1(3.8)s T(r), \quad 0\leq r \leq L -1 \tag{3.8}sT(r),0≤r≤L−1(3.8) 假设&#xff1a; (1) T(r)T(r)T(r)在区间0≤r≤L−10 \leq{r} \leq{L-1}0≤r≤L−1 上是一个单调递增函数。 (2) 对于0≤r≤L−10 \leq{r} …

python 元组和列表区别_Python干货整理:一分钟了解元组与列表使用与区别

元组是 Python 对象的集合&#xff0c;跟列表十分相似。下面进行简单的对比。列表与元组1、python中的列表list是变量&#xff0c;而元组tuple是常量。列表&#xff1a;是使用方括号[]&#xff0c;元组&#xff1a;则是使用圆括号()2、两者都可以使用索引读取值列表1.列表中的a…

Maven for Eclipse 第二章 ——安装 m2eclipse插件

m2eclipse 是一个提供了 Maven 与 Eclipse 整合的插件。它的意图是桥接上 Maven 和 Eclipse 之间的缺口。通过 Maven 原型提供的简单直白的接口创建项目&#xff0c;它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 创建和导入 Maven 项目在 Eclipse 运行…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波9 - 直方图处理 - 直方图匹配(规定化)灰度图像,彩色图像都适用

直方图匹配&#xff08;规定化&#xff09; 连续灰度 sT(r)(L−1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L−1)∫0r​pr​(w)dw(3.17) 定义关于变量zzz的一个函数GGG&#xff0c;它具有如下性质&#xff1a; G(z)(L−1)∫0zpz(v)d…

C#委托之就是跟委托过不去…

在上一篇博文当中,我们例举了一个机房自动化系统的逻辑控制程序,其中用到了Lambda表达式,因此方便了我们程序功能的实现.然而,我们不能仅仅为实现功能,完成任务而奋斗,应该知其然,知其所以然,也就是说,知道了Lambda表达式能够带来这样的方便,也应该知道为什么能够带来这样的方便…

closewait一直不释放_机床为什么要释放应力?怎么释放应力才好?

在机床行业内一直有种说法&#xff0c;就是机床需要释放应力&#xff0c;而且越是高精密的机床就越要注意应力的释放&#xff0c;最近就有机床粉向小编询问应力是什么&#xff1f;为什么要释放应力&#xff1f;如果释放要释放多久&#xff1f;怎么释放应力才好等一系列关于机床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

点我看题目 题意 &#xff1a;两条平行线上分别有两种城市的生存&#xff0c;一条线上是贫穷城市&#xff0c;他们每一座城市都刚好只缺乏一种物资&#xff0c;而另一条线上是富有城市&#xff0c;他们每一座城市刚好只富有一种物资&#xff0c;所以要从富有城市出口到贫穷城市…

表单元素选择器

无论是提交还是传递数据&#xff0c;表单元素在动态交互页面的作用是非常重要的。jQuery中专门加入了表单选择器&#xff0c;从而能够极其方便地获取到某个类型的表单元素 表单选择器的具体方法描述&#xff1a; 注意事项&#xff1a; 除了input筛选选择器&#xff0c;几乎每个…

怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...

来源 | 迅捷PDF转换器 (ID:xjpdf6)作者丨小小迅「一日一技」是每天的知识分享专栏&#xff0c;一是分享一些PDF、Office、办公小技巧&#xff1b;二是抽取小可爱们在留言中的疑问并解决。希望对大家有所帮助&#xff01;表头的标题是Excel中的第一道大门&#xff0c;精致好看的…

Retina时代的前端视觉优化

随着New iPad的发布&#xff0c;平板也将逐渐进入Retina时代&#xff0c;在高分辨率设备里图片的显示效果通常不尽人意&#xff0c;为了达到最佳的显示效果就需要对图片进行优化&#xff0c;这里介绍一些优化方法&#xff1a; 一、用CSS替代图片 这一点在任何时候都适用&#x…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波10 - 直方图处理 - 局部直方图处理

这里写目录标题局部直方图处理局部直方图处理 因为像素是由基于整个图像的灰度的变换函数修改的。这种全局性方法适合于整体增强&#xff0c;但当目的是增强图像中几个小区域的细节时&#xff0c;通常就会失败。这是因为在这些小区域中&#xff0c;像素的数量对计算全局变换的…

C++和Rust_后端程序员一定要看的语言大比拼:Java vs. Go vs. Rust

这是Java&#xff0c;Go和Rust之间的比较。这不是基准测试&#xff0c;更多是对可执行文件大小、内存使用率、CPU使用率、运行时要求等的比较&#xff0c;当然还有一个小的基准测试&#xff0c;可以看到每秒处理的请求数量&#xff0c;我将尝试对这些数字进行有意义的解读。为了…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波11 - 直方图处理 - 使用直方图统计量增强图像

使用直方图统计量增强图像 全局均值和方差 μn∑i0L−1(ri−m)np(ri)(3.24)\mu_{n} \sum_{i0}^{L-1} (r_{i} - m)^{n} p(r_{i}) \tag{3.24}μn​i0∑L−1​(ri​−m)np(ri​)(3.24) m∑i0L−1rip(ri)(3.25)m \sum_{i0}^{L-1} r_{i} p(r_{i}) \tag{3.25}mi0∑L−1​ri​p(ri​…

HDU - 1723 - Distribute Message

先上题目&#xff1a; Distribute Message Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1186 Accepted Submission(s): 547 Problem DescriptionThe contest’s message distribution is a big thing in pre…

nodejs 图片处理模块 rotate_学会Pillow再也不用PS啦——Python图像处理库Pillow入门!...

你在用什么软件进行图像处理呢&#xff1f;厌倦了鼠标和手指的拖拖点点&#xff0c;想不想用程序和代码进行图像的高效处理&#xff0c;Python作为简单高效又很强大的一门编程语言&#xff0c;对于图像的处理自然也是轻松拿下&#xff0c;听起来是不是很酷很极客&#xff0c;那…

创建一个追踪摄像机(2)

为了生成曲线&#xff0c;函数需要通过4个在沿着重量值在0和1之间的路径上连贯的位置。由于重量在这些2个值之间增加&#xff0c;曲线返回在更远的路径上的坐标。 当所提供的重量值为0&#xff0c;曲线将返回正确的坐标在第二个输入坐标。当所提供的重量值为1&#xff0c;曲线将…