Пример #1
0
        private static byte[] writeImagePayload(Bitmap bitmap)
        {
            List<byte> bytes = new List<byte>(bitmap.Width * bitmap.Height);

            UnsafeBitmap bmp = new UnsafeBitmap(bitmap);
            bmp.LockBitmap();

            List<PixelData> consecutive = new List<PixelData>();
            var width = bitmap.Width;
            var height = bitmap.Height;
            writeLength(bytes, width);
            writeLength(bytes, height);

            for (int y = 0; y < height; y++)
            {
                Point start = new Point(-1, -1);
                Point startColor = new Point(-1, -1);
                PixelData pixLast = PixelData.Empty;
                int consecutiveColor = 0;
                for (int x = 0; x < width; x++)
                {
                    var pix = bmp.GetPixel(x, y);
                    if (!(pix.red == 255 && pix.green == 255 && pix.blue == 255))
                    {

                        if (pixLast.red == pix.red && pixLast.green == pix.green && pixLast.blue == pix.blue)
                        {
                            if (consecutive.Count > 0)
                            {
                                //                                consecutive.RemoveAt(consecutive.Count - 1);
                                writeOutConsecutive(consecutive, bytes, ref start);
                            }
                            if (startColor.X == -1)
                            {
                                startColor = new Point(x, y);
                            }
                            consecutiveColor++;
                        }
                        else
                        {

                            if (consecutiveColor > 0)
                            {
                                writeOutConsecutiveColor(ref consecutiveColor, pixLast, bytes, ref startColor);
                            }

                            consecutiveColor++;
                            if (startColor.X == -1)
                            {
                                startColor = new Point(x, y);
                            }
                            if (start.X == -1)
                            {
                                start = new Point(x, y);
                            }
                            consecutive.Add(pix);
                            pixLast = pix;
                        }
                    }
                    else
                    {
                        if (consecutiveColor > 1)
                        {
                            writeOutConsecutiveColor(ref consecutiveColor, pixLast, bytes, ref startColor);
                        }
                        else
                        {
                            writeOutConsecutive(consecutive, bytes, ref start);
                        }

                    }
                }
                if (consecutiveColor > 1)
                {
                    writeOutConsecutiveColor(ref consecutiveColor, pixLast, bytes, ref startColor);
                }
                else
                {
                    writeOutConsecutive(consecutive, bytes, ref start);
                }
            }
            writeStatus(bytes, 255);
            /*
                        writeLength(bytes, bitmap.Width);
                        writeLength(bytes, bitmap.Height);
                        writeXY(bytes, 484, 997);
                        writeColor(bytes, new PixelData(155, 255, 24));
                        writeColor(bytes, new PixelData(15, 55, 24));
                        writeColor(bytes, new PixelData(100, 100, 100));
                        writeLength(bytes, bitmap.Height);

                        var diffPayload = bytes.ToArray();

                        fixed (byte* ps = &diffPayload[0])
                        {
                            byte* bb = ps;

                            var m1 = readLength( ref bb);
                            var m2 = readLength(ref bb);
                            var m3x = readLength(ref bb);
                            var m3y = readLength(ref bb);
                            var col1 = readColor(ref bb);
                            var col2 = readColor(ref bb);
                            var col3 = readColor(ref bb);
                            var m3 = readLength(ref bb);
                        }

            */

            bmp.UnlockBitmap();
            return bytes.ToArray();
        }
Пример #2
0
        private static RectCollection buildBoxes(Bitmap bitmap)
        {
            List<CRectangle> rt = new List<CRectangle>();

            UnsafeBitmap bmp = new UnsafeBitmap(bitmap);
            bmp.LockBitmap();
            var gapHeight = 40;

            for (int y = 0; y < bitmap.Height; y++)
            {
                List<CRectangle> rtc = new List<CRectangle>();

                foreach (var r in rt)
                {
                    if (r.Y + r.Height + gapHeight + 1 >= y)
                    {
                        rtc.Add(r);
                    }
                }

                for (int x = 0; x < bitmap.Width; x++)
                {
                    var pix = bmp.GetPixel(x, y);
                    if (!(pix.red == 255 && pix.green == 255 && pix.blue == 255))
                    {

                        List<CRectangle> ins = new List<CRectangle>();
                        if (rtc.Count > 1)
                        {

                        }
                        foreach (var rectangle in rtc)
                        {
                            if (rectangle.ShouldContain(x, y))
                            {
                                if (rectangle.Contains(x, y))
                                {
                                    ins.Add(rectangle);
                                    //                                    Console.WriteLine($"rt: {rt.Count} rtc:{rtc.Count} contians");

                                }
                                else if (rectangle.Contains(x, y - 1))
                                {
                                    ins.Add(rectangle);
                                    rectangle.Height = rectangle.Height + 1;
                                    //                                    Console.WriteLine($"rt: {rt.Count} rtc:{rtc.Count} height");
                                }
                                else if (rectangle.Contains(x - 1, y))
                                {
                                    ins.Add(rectangle);
                                    rectangle.Width = rectangle.Width + 1;
                                    //                                    Console.WriteLine($"rt: {rt.Count} rtc:{rtc.Count} width");
                                }
                            }
                        }
                        if (ins.Count == 0)
                        {
                            var cRectangle = new CRectangle(x, y, gapHeight * 5, gapHeight);
                            rt.Add(cRectangle);
                            rtc.Add(cRectangle);
                            //                            Console.WriteLine($"rt: {rt.Count} rtc:{rtc.Count} new");
                        }
                        if (ins.Count > 1)
                        {
                            var ba = ins[0];

                            for (int index = ins.Count - 1; index >= 0; index--)
                            {
                                ba = CRectangle.Union(ba, ins[index]);
                                rt.Remove(ins[index]);
                                rtc.Remove(ins[index]);
                            }
                            rt.Add(ba);
                            rtc.Add(ba);
                            //                            Console.WriteLine($"rt: {rt.Count} rtc:{rtc.Count} union");

                        }

                    }
                }
            }
            Console.WriteLine($"{rt.Count} boxes");

            bmp.Dispose();

            byte[] bytes = new byte[10000000];
            bytes[0] = 0xff;
            RectCollection col = new RectCollection();

            for (int index = 0; index < rt.Count; index++)
            {
                var cRectangle = rt[index];
                var dc = CopyImage(bitmap, cRectangle);

                col.Rectangles.Add(new RectObject()
                {
                    X = cRectangle.X,
                    Y = cRectangle.Y,
                    Width = cRectangle.Width,
                    Height = cRectangle.Height,
                    Index = index,
                    Bitmap = dc
                });
            }

            return col;

            /*
                        Bitmap done = new Bitmap(bitmap.Width, bitmap.Height);
                        var random = new Random();
                        using (Graphics g = Graphics.FromImage(done))
                        {
                            foreach (var rectangle in rt)
                            {
                                g.FillRectangle(new SolidBrush(Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255))),

                                    rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
                            }

                        }
                        return done;
            */
        }