gpt4 book ai didi

c# - 如何比较两个不同的图像,通过 tcp 发送差异,然后在客户端将差异与图像合并?

转载 作者:可可西里 更新时间:2023-11-01 02:49:11 24 4
gpt4 key购买 nike

我有通过 TCP 发送和接收图像的有效代码。但是,因为每次带宽使用量很大时我都会发送整个图像,这会使我的程序在较慢的互联网连接上完全无法使用。

为了减少带宽,很明显我只想发送当前图像和前一个图像之间的差异。我希望您能提供一些有关如何执行此操作或使用哪些库(如果有)的信息。我在下面有我的发送和接收线程,我目前正在使用它来发送和接收图像。我的程序用作屏幕共享应用程序。

发送图片:

public void SendSS()
{
try
{


while (!mainFrm.ssStop)
{
ssTcpClient = new TcpClient();
ssTcpClient.Connect(mainFrm.contactIP, 1500);

//Set up TCP connection.
if (ssTcpClient.Connected)
{
//Connected. Capture screen image.
labelText("Connected. Now sending desktop to technician.");
Image screenShotBMP = GrabScreen();
MemoryStream ssmemStream = new MemoryStream();
screenShotBMP.Save(ssmemStream, ImageFormat.Jpeg);
NetworkStream ns = ssTcpClient.GetStream();

//Convert image to data.
byte[] bytesToSend = ssmemStream.GetBuffer();

//Store data in stream and send via port.
ns.Write(bytesToSend, 0, bytesToSend.Length);
ns.Flush();

//Dispose of image to avoid memory leakage.
screenShotBMP.Dispose();
ssTcpClient.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "SendSS()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

接收图像:

public void ReceiveSS()
{
try
{

ssTcpListener = new TcpListener(IPAddress.Any, 1500);
tcpReceiver = new TcpClient();
while (!mainFrm.ssStop)
{
//Start listening for connection.
//Accept any incoming connection requests on port 1500.
ssTcpListener.Start();
tcpReceiver = ssTcpListener.AcceptTcpClient();
if (tcpReceiver.Connected)
{
//TCP connected. Receive images from contact.
labelText("Connected. Now receiving desktop from client.");
NetworkStream receivedNs = new NetworkStream(tcpReceiver.Client);

//Put image into picturebox.
Bitmap image = new Bitmap(receivedNs);
pboScrnShr.BackgroundImage = image;

receivedNs.Flush();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "ReceiveSS()", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

提前感谢您的帮助。

最佳答案

在互联网上做了更多的搜索后,我发现了这个:

Finding difference between images - By Bryan Cook使用该代码查找我发送的图像之间的差异(使用 screenshotBMP.Save(ssMemStream, ImageFormat.Gif),而不是 .JPEG),这当然会将内存流中的透明度保存为黑色,因此在接收时最后你必须确保(对于发送的图像差异)你确实 receiveImage.MakeTransparency(Color.Black) 否则如果你试图将差异覆盖到之前的图像上你只会得到一个黑屏。

我设法将接收到的图像从 12Mbps 降低到 2Mbps,但我知道对于较慢的连接还有更多的改进空间。

所有功劳都归功于 Bryan Cook 我刚刚在不同上下文中使用的代码。

关于c# - 如何比较两个不同的图像,通过 tcp 发送差异,然后在客户端将差异与图像合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com