/// <summary> /// Encodes the specified <see cref="SkeletonImage"/> into a byte array. /// </summary> /// <remarks> /// This codification uses two bytes to store <see cref="SkeletonImage.Width"/>; two more bytes to store <see cref="SkeletonImage.Height"/>; and one bit for each pixel of the <see cref="SkeletonImage"/>. Therefore, this method is ineffective for values of <see cref="SkeletonImage.Width"/> and <see cref="SkeletonImage.Height"/> greater than 65535. /// </remarks> /// <param name="skImg">The <see cref="SkeletonImage"/> object which is going to be encoded to a byte array.</param> /// <returns>The byte array containing the encoded <see cref="SkeletonImage"/> object.</returns> public static byte[] ToByteArray(SkeletonImage skImg) { int length = (int)Math.Ceiling(skImg.Width * skImg.Height / 8.0); byte[] raw = new byte[length + 4]; raw[0] = (byte)(255 & skImg.Width); raw[1] = (byte)(255 & (skImg.Width >> 8)); raw[2] = (byte)(255 & skImg.Height); raw[3] = (byte)(255 & (skImg.Height >> 8)); int counter = 0; int cursor = 4; int currValue = 0; for (int i = 0; i < skImg.Height; i++) { for (int j = 0; j < skImg.Width; j++) { currValue |= (skImg[i, j] == 255 ? 1 : 0) << counter; if (counter == 7) { raw[cursor++] = (byte)currValue; currValue = 0; counter = 0; } else { counter++; } } } return(raw); }
/// <summary> /// Save the specified <see cref="SkeletonImage"/> to the specified file name. /// </summary> /// <remarks> /// Before saving, the <see cref="SkeletonImage"/> is encoded using the method <see cref="ToByteArray"/>. /// </remarks> /// <param name="fileName">The file name where the specified <see cref="SkeletonImage"/> will be saved.</param> /// <param name="skImg">The <see cref="SkeletonImage"/> to be saved.</param> public static void Serialize(string fileName, SkeletonImage skImg) { var byteArr = ToByteArray(skImg); File.WriteAllBytes(fileName, byteArr); }