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 Pixels { get; private set; } public VectorDifferenceImage(int width, int height) { Width = width; Height = height; Pixels = new List(); } 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; } } } } }