c#位图记录到字节

时间:2013-04-09 22:32:21

标签: c# bitmap

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

2 个答案:

答案 0 :(得分:2)

我不完全确定这是否是您正在寻找的,但是......

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

byte[] BitmapToBytes(Bitmap bitmap)
{
    using (var stream = new MemoryStream())
    {
        bitmap.Save(stream, ImageFormat.Png);
        return stream.ToArray();
    }
}

答案 1 :(得分:0)

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

User clicks the 'Start' button
Connect to server
Start timer
Send content of image control to server
...
Repeat while timer enabled:
    Timer interval expires
    Timer handler captures screen image to image control

有几个问题:

  1. 在您将图像控件pictureBox1的内容发送到服务器时,尚未使用捕获的屏幕图像填充它。

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

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

    如果要多次发送,则需要将发送代码放入计时器处理程序中。在这种情况下,请将发送代码从btnStart_Click转移到timer1_Tick的末尾。

    此外,您需要某种方式让服务器识别特定图像的数据已完成,以便它可以处理图像。换句话说,您需要一些方法来构建图像 - 一系列数据保证出现在图像本身的数据中,或至少一个标题告诉您的服务器有多少数据到读作有效图像进行处理。

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