c#位图记录到字节
本文关键字:到字节 记录 位图 | 更新日期: 2023-09-27 18:08:15
我正在用c#创建一个程序,记录屏幕并通过套接字连接发送到服务器。我的问题是,我需要将其转换为字节发送它。下面是我的客户端代码,所以正在记录屏幕的计算机:
public Form1()
{
InitializeComponent();
}
static int port = 443;
static IPAddress IP;
static Socket server;
private Bitmap bm;
private string PCname = SystemInformation.ComputerName;
private string UserName = SystemInformation.UserName;
private void btnStart_Click(object sender, EventArgs e)
{
// Connect to server
IP = IPAddress.Parse("127.0.0.1");
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Connect(new IPEndPoint(IP, port));
// Record the screen
timer1.Start();
// Send screen to server
byte[] sdata = Encoding.Default.GetBytes(pictureBox1);
server.Send(sdata, 0, sdata.Length, 0);
}
private void timer1_Tick(object sender, EventArgs e)
{
// Take screenshot
bm = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(bm as Image);
graphics.CopyFromScreen(0, 0, 0, 0, bm.Size);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
// Show it in picturebox
pictureBox1.Image = bm;
}
private void btnStop_Click(object sender, EventArgs e)
{
timer1.Stop();
server.Close();
}
我不完全确定这是否是你要找的,但是…
这是一个将Bitmap
转换为PNG格式的"文件字节"的方法。
byte[] BitmapToBytes(Bitmap bitmap)
{
using (var stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
return stream.ToArray();
}
}
这是您提供的代码的基本操作顺序:
<>之前用户点击"开始"按钮连接到服务器启动定时器发送图像控制的内容到服务器...定时器启用时重复:定时器间隔过期定时器处理程序捕获屏幕图像到图像控制之前有几个问题:
当您将图像控制
pictureBox1
的内容发送到服务器时,它还没有被捕获的屏幕图像填充。你只向服务器发送一次数据,这似乎不是你的目标。
如果你的目标是只发送一次屏幕内容,那么你不需要计时器。将定时器处理程序timer1_Tick
中的代码放入btnStart_Click
方法中,以代替timer1.Start()
调用。
如果你想多次发送,那么你需要把发送代码放在计时器处理程序中。在本例中,将发送代码从btnStart_Click
移到timer1_Tick
的末尾。
另外,您需要某种方法让服务器识别特定图像的数据已经完成,以便它可以处理该图像。换句话说,您需要某种方式来框架图像-保证而不是出现在图像本身的数据中的数据序列,或者至少有一个头告诉您的服务器作为有效图像读取多少数据来处理。
我强烈建议你采纳Timothy Shields的建议,在发送之前使用PNG压缩数据。只要服务器知道需要压缩的数据,它就可以在接收到数据时轻松地将其解压缩回位图。使用PNG将为您节省大量的网络时间,而不会丢失任何信息,只是在压缩和解压缩阶段增加了一点开销。