// Return picture segments for a complete picture public static PicturePackage[] GetPicturePackages(string name, int id, Image picture, int segmentSize) { // save the picture in a byte array MemoryStream stream = new MemoryStream(); picture.Save(stream, ImageFormat.Jpeg); // Calculate the number of segments to split the picture int numberSegments = (int)stream.Position / segmentSize + 1; PicturePackage[] packages = new PicturePackage[numberSegments]; // Create the picture segments int sourceIndex = 0; for (int i = 0; i < numberSegments; i++) { // Calculate the size of the segment buffer int bytesToCopy = (int)stream.Position - sourceIndex; if (bytesToCopy > segmentSize) { bytesToCopy = segmentSize; } byte[] segmentBuffer = new byte[bytesToCopy]; Array.Copy(stream.GetBuffer(), sourceIndex, segmentBuffer, 0, bytesToCopy); packages[i] = new PicturePackage(name, id, i + 1, numberSegments, segmentBuffer); sourceIndex += bytesToCopy; } return(packages); }
private void Listener() { while (!done) { IPEndPoint ep = null; byte[] data = udpClient.Receive(ref ep); PicturePackage package = new PicturePackage(encoding.GetString(data)); PicturePackage[] packages; if (pictureArray.ContainsKey(package.Id)) { packages = (PicturePackage[])pictureArray[package.Id]; packages[package.SegmentNumber - 1] = package; } else { packages = new PicturePackage[package.NumberOfSegments]; packages[package.SegmentNumber - 1] = package; pictureArray.Add(package.Id, packages); } string message = "Received picture " + package.Id + " Segment " + package.SegmentNumber; Invoke(new MethodInvokerString(SetStatusBar), new object[] { message }); // Check if all segments of a picture are received int segmentCount = 0; for (int i = 0; i < package.NumberOfSegments; i++) { if (packages[i] != null) { segmentCount++; } } // All segments are received, so draw the picture if (segmentCount == package.NumberOfSegments) { this.Invoke(new MethodInvokerInt(DisplayPicture), new object[] { package.Id }); } } }