0

我正在用 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();
    }
4

2 回答 2

2

我不完全确定这是否是您要找的东西,但是...

这是一种将 a 转换为BitmapPNG 格式的“文件字节”的方法。

byte[] BitmapToBytes(Bitmap bitmap)
{
    using (var stream = new MemoryStream())
    {
        bitmap.Save(stream, ImageFormat.Png);
        return stream.ToArray();
    }
}
于 2013-04-09T22:39:40.357 回答
0

这是您提供的代码的基本操作顺序:

用户单击“开始”按钮
连接到服务器
启动计时器
将图像控件的内容发送到服务器
...
启用计时器时重复:
    定时器间隔到期
    计时器处理程序将屏幕图像捕获到图像控制

这有几个问题:

  1. 在您将图像控件的内容发送pictureBox1到服务器时,它还没有被捕获的屏幕图像填充。

  2. 您只向服务器发送一次数据,这似乎不是您的目标。

如果您的目标是只发送一次屏幕内容,那么您不需要计时器。将计时器处理程序中的代码timer1_Tick放入您的btnStart_Click方法中以代替timer1.Start()调用。

如果要多次发送,则需要将发送代码放入计时器处理程序中。在这种情况下,将发送代码btnStart_Clicktimer1_Tick.

此外,您需要某种方式让服务器识别特定图像的数据已完成,以便它可以处理该图像。换句话说,您需要某种方式来构图图像 - 保证不会出现在图像本身的数据中的数据序列,或者至少是一个标头,告诉您的服务器要读取多少数据作为要处理的有效图像.

我强烈建议您采纳 Timothy Shields 的建议,并在发送之前使用 PNG 压缩数据。只要服务器知道需要压缩数据,它就可以在接收到它时轻松地将其解压缩回位图。使用 PNG 将在不丢失任何信息的情况下为您节省大量网络时间,而压缩和解压缩阶段只会增加一点开销。

于 2013-04-09T23:30:41.913 回答