for (int x = 0; x < blockCountX; x++)
{
for (int y = 0; y < blockCountY; y++)
{
//get blocks from image to new image and send to threaded processor
imageBlocks[x, y] = image.Clone(clipRectangle, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ThreadedFromHeightMap));
t.Start(imageBlocks[x,y]);
clipRectangle.Offset(0, IMAGEBLOCKSIZE);
}
clipRectangle.Offset(IMAGEBLOCKSIZE, clipRectangle.Location.Y * -1);
}
break;
}
}
private void ThreadedFromHeightMap(object Image)
{
Bitmap image = (Bitmap)Image;
int width = image.Width;
int height = image.Height;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
map.Hexes.Add(new Point(x, y), new Hex(image.GetPixel(x, y).B));
//tempHexes.Enqueue(new Hex(image.GetPixel(x, y).B));
}
}
}
Я пытаюсь взять пиксельные данные из 2080 x 2048 8bpp градаций серого и построить шестнадцатеричную карту с соответствующими значениями высоты. Я храню гексы в коллекции словарей. Все сказали, что в коллекции около 4 миллионов гексов.C# Обработка резьбовых изображений
Чтобы сделать это эффективно, я разбиваю изображение на 256 х 256 кусков и передаю это изображение в другой поток, который проанализирует его и добавит гексы в коллекцию. Это было все, что нужно. Вместо одного изображения с (0,0) в качестве верхнего левого угла у меня теперь есть 64 фрагмента изображения, которые имеют (0,0) как их верхний левый угол. Однако я использую расположение пикселей в качестве индекса для словаря. Это сбой, когда второй поток пытается добавить другое значение с индексом (0,0).
Как уменьшить эту проблему? Я подумал о создании класса, в котором есть только элемент изображения и член числа фрагментов, и передать его в поток, чтобы я мог настроить местоположение пикселя в зависимости от того, какой поток работает, но это кажется менее оптимальным.
(Я понимаю, что словарь я использую не поточно. С тех пор я установил это.)
Похоже, что существует сильная отрицательная реакция на .GetPixel(). Я собираюсь изучить ваши предложения о том, чтобы отбросить это и работать непосредственно с данными растрового изображения. Спасибо за ваши ответы. – Wesley