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; } }