Example #1
0
        // 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);
        }
Example #2
0
        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 });
                }
            }
        }