public void Coder(ref PreparedData data, General.Point[] selectedPoints, General.Point[] NotSelectedPoints, int xSize, int ySize)
        {
            int colContainers = (data.img.Width / xSize); // получаю количество контейнеров по оси Х
            int rowContainers = (data.img.Height / ySize); // получаю количество контейнеров по оси Y
            int numberOfContainers = rowContainers * colContainers; // Получаю общее количество контейнеров

            if (numberOfContainers < data.msgBits.Length) // проверяю возможность внедрении информации относительно размеров контейнеров и длины сообщения
            {
                throw new Exception("Не достаточно места для хранения информации. Измените размер контейнера или длину сообщения");
            }

            Methods.Block_Different_Shape.Container[] containers = new Methods.Block_Different_Shape.Container[data.msgBits.Length]; // формирую массив контейнеров (по одномерному должно работать быстрее) Длинной в сообщение

            getContainers(ref data, ref containers, selectedPoints, NotSelectedPoints, xSize, ySize, rowContainers, colContainers, containers.Length);

            // начинаем заполнять блоки информацией
            int index = 0;
            while (index < containers.Length)
            {
                if (containers[index].points_NotChecked == null || containers[index].points_Checked == null)
                {
                    if (containers[index].points_NotChecked == null)
                    {
                        if (containers[index].sumBits_Checked != data.msgBits[index])
                        {
                            containers[index].updateValue(data.msgBits[index], false, ref data);
                        }
                    }
                    else
                    {
                        if (containers[index].sumBits_NotChecked != data.msgBits[index])
                        {
                            containers[index].updateValue(data.msgBits[index], true, ref data);
                        }
                    }
                }
                else
                {
                    if(index % 2 == 0 && containers[index].sumBits_Checked != data.msgBits[index])
                    {
                        containers[index].updateValue(data.msgBits[index], Convert.ToBoolean(index % 2), ref data);
                    }

                    else if(index % 2 == 1 && containers[index].sumBits_NotChecked != data.msgBits[index])
                    {
                        containers[index].updateValue(data.msgBits[index], Convert.ToBoolean(index % 2), ref data);
                    }
                }
                index++;
            }

            data.imgCoded = Utils.setColorChanel(ref data);
        }
        private void getContainers(ref PreparedData data, ref Methods.Block_Different_Shape.Container[] containers, General.Point[] selectedPoints, General.Point[] NotSelectedPoints, int xSize, int ySize, int rowContainers, int colContainers, int limit, int startFrom = 0)
        {
            int index = 0; // индекс контейнера

            int yStart = 0;
            int xStart = 0;

            if (startFrom > 0)
            {
                yStart = startFrom / colContainers;
                xStart = startFrom % colContainers;
            }

            for (int y = yStart * ySize; y < ySize * rowContainers && index < limit; y += ySize)
            {
                for (int x = xStart * xSize; x < xSize * colContainers && index < limit; x += xSize)
                {
                    containers[index] = new Methods.Block_Different_Shape.Container(ref data, selectedPoints, NotSelectedPoints, x, y, xSize, ySize);   // берем текущие кооридинаты и координаты, смещенные относительно
                    index++;
                }
                xStart = 0;
            }
        }