In addition to RickZeeland's comment, another important thing to remember when it comes to network/streaming is that there's no guarantee how many bytes you'll receive at any given time.
byte[] bytes = new byte[1000000];
streamScreenShare.Read(bytes, 0, bytes.Length);
This is saying "fetch me up to 1,000,00 bytes". However, if there was any sort of network latency or connectivity problem you wouldn't be guaranteed to receive all of the bytes from the client. Network packets and be dropped and re-issued which might mean you could get a buffer containing 100 bytes, followed by another containing 32,100 bytes.
Some people work around this by creating a packet structure within their application. For example, the first 4 bytes of the stream might get decoded into an
Int32
which has the length of the next image (in bytes). Then you could stream the image bytes and make sure to count how many you've received to ensure that you're getting the full picture. After you've successfully processed the image's bytes, you know the next 4 bytes would again be the next image length.