@vad1mi

Как быстро перебрать все пиксели большого количества изображений?

Есть 150-200 изображений с расширением 10 000х10 000 пикселей.
Из них надо построить что-то наподобие фотоплана. Я решил сложить этот фотоплан из пикселей, поэтому надо из всех изображений достать все пиксели не черного цвета. Пробовал много поточно реализовывать через класс Parallel, большого ускорения в времени обработки нету, что можно сделать?

Вызов:
var progress = new Progress<string>(s => richTextBox1.AppendText(s + Environment.NewLine));
                string way = string.Format(@fbD.SelectedPath);
                string searchPattern = string.Format(@"*.tif");
                string[] Names = System.IO.Directory.GetFiles(way, searchPattern);
                //int count = 0;
                DateTime start = DateTime.Now;
                textBox2.Text += "FilesCount = " + Names.Length + Environment.NewLine;
                await Task.Factory.StartNew(
                                            () => Worker.Read(progress,Names),
                                            TaskCreationOptions.None);
                DateTime end = DateTime.Now;
                MessageBox.Show(string.Format(" Time work[ {0}:{1} ]", (end - start).Minutes, (end - start).Seconds));


Реализация:
{
           //Parallel.For(0, Names.Length, i =>
           for(int i =0;i<Names.Length;i=i+10)
                {
                    if (i + 10 < Names.Length)
                    {
                        Parallel.ForEach(Enumerable.Range(i, 10), j =>
                        {
                            byte[, ,] Im = Form1.BitmapToByteRgb(new Bitmap(Names[j]));
                            progress.Report(j.ToString());
                        });
                    }
                    else
                    {
                        Parallel.ForEach(Enumerable.Range(i, Names.Length), j =>
                        {
                            byte[, ,] Im = Form1.BitmapToByteRgb(new Bitmap(Names[j]));
                            progress.Report(j.ToString());
                        });
                    }
                }
        }
static unsafe public byte[, ,] BitmapToByteRgb(Bitmap bmp)
        {
            int width = bmp.Width,
                height = bmp.Height;
            byte[, ,] res = new byte[3, height, width];
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly,
                PixelFormat.Format24bppRgb);
            try
            {
                byte* curpos;
                for (int h = 0; h < height; h++)
                {
                    curpos = ((byte*)bd.Scan0) + h * bd.Stride;
                    for (int w = 0; w < width; w++)
                    {
                        res[2, h, w] = *(curpos++);
                        res[1, h, w] = *(curpos++);
                        res[0, h, w] = *(curpos++);
                    }
                }
            }
            finally
            {
                bmp.UnlockBits(bd);
            }
            return res;
        }
  • Вопрос задан
  • 535 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы