diff options
Diffstat (limited to 'Software/Experiments/Tango.RemoteDesktop/Tango.ScreenCapture/VectorDifferenceImage.cs')
| -rw-r--r-- | Software/Experiments/Tango.RemoteDesktop/Tango.ScreenCapture/VectorDifferenceImage.cs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.ScreenCapture/VectorDifferenceImage.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.ScreenCapture/VectorDifferenceImage.cs new file mode 100644 index 000000000..7fa2c82df --- /dev/null +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.ScreenCapture/VectorDifferenceImage.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.ScreenCapture +{ + public class VectorDifferenceImage + { + public int Width { get; private set; } + public int Height { get; private set; } + + public List<VectorImagePixel> Pixels { get; private set; } + + public VectorDifferenceImage(int width, int height) + { + Width = width; + Height = height; + Pixels = new List<VectorImagePixel>(); + } + + public Bitmap CreateBitmap() + { + DirectBitmap directBitmap = new DirectBitmap(Width, Height); + foreach (var pixel in Pixels) + { + directBitmap.SetPixel((int)pixel.X, (int)pixel.Y, Color.FromArgb(pixel.R, pixel.G, pixel.B)); + } + + directBitmap.Dispose(); + return directBitmap.Bitmap; + } + + public void ApplyOnBitmap(Bitmap bitmap) + { + using (FastBitmap fast = bitmap.FastLock()) + { + foreach (var pixel in Pixels) + { + fast.SetPixel((int)pixel.X, (int)pixel.Y, Color.FromArgb(pixel.R, pixel.G, pixel.B)); + } + } + } + + public byte[] Serialize() + { + using (MemoryStream ms = new MemoryStream()) + { + using (BinaryWriter writer = new BinaryWriter(ms)) + { + writer.Write(Width); + writer.Write(Height); + writer.Write(Pixels.Count); + + foreach (var pixel in Pixels) + { + writer.Write(pixel.X); + writer.Write(pixel.Y); + + writer.Write(pixel.R); + writer.Write(pixel.G); + writer.Write(pixel.B); + } + + ms.Position = 0; + return ms.ToArray(); + } + } + } + + public int CalculateSize() + { + int size = 0; + + size += sizeof(int) * 3; //Width, Height, Count + size += sizeof(ushort) * 2 * Pixels.Count; //X, Y + size += sizeof(byte) * 3 * Pixels.Count; //RGB + + return size; + } + + public static VectorDifferenceImage Deserialize(byte[] data) + { + using (MemoryStream ms = new MemoryStream(data)) + { + using (BinaryReader reader = new BinaryReader(ms)) + { + ms.Position = 0; + var vector = new VectorDifferenceImage(reader.ReadInt32(), reader.ReadInt32()); + + int count = reader.ReadInt32(); + + for (int i = 0; i < count; i++) + { + VectorImagePixel pixel = new VectorImagePixel(); + pixel.X = reader.ReadUInt16(); + pixel.Y = reader.ReadUInt16(); + + pixel.R = reader.ReadByte(); + pixel.G = reader.ReadByte(); + pixel.B = reader.ReadByte(); + + vector.Pixels.Add(pixel); + } + + return vector; + } + } + } + } +} |
