Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2011, 02:22   #1
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
Восклицание C# оптимизация цикла

Здравствуйте уважаемые программисты!
Возникла следующая проблема!
У меня есть цикл, который работает с пикселями изображения. Он очень долго работает. При просмотре мастером производительности, было обнаружено, что полностью проц грузит вот эта строка:
Код:
 imagePixels = temp.GetPixel(i, j);
Не могли бы вы мне помочь, сделать код более быстрым!?
Заранее спасибочки....
Код:
  Color imagePixels;
  for (int i = 0; i < width; i++)//width
  {
      for (int j = 0; j < height; j++)
      {
           imagePixels = temp.GetPixel(i, j);
           ...............................
      }
  }
tanek вне форума Ответить с цитированием
Старый 21.08.2011, 02:38   #2
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

не знаю можно ли ето оптимизировать... но есть вариант начинать роботу цыкла в потоке
Pein95 вне форума Ответить с цитированием
Старый 21.08.2011, 02:43   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

что есть temp и что нужно в конечном итоге?
нажми меня!

Последний раз редактировалось Carbon; 21.08.2011 в 03:05.
Carbon вне форума Ответить с цитированием
Старый 21.08.2011, 03:59   #4
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

Pein95 Поток не подходит... Я так пробовала))))
Carbon! temp является изображением, а в итоге я хочу найти определенный цвет в изображении.
Я посмотрела пример, который приводится в ссылке и мне кон-что не понятно!
Код:
 
for (int counter = 2; counter < rgbValues.Length; counter += 3)
     rgbValues[counter] = 255;
Почему они говорят, что они присваивают красный цвет? Ведь красный цвет такой: 255.0.0?
А можно в таком примере присвоить значение и G и B?
tanek вне форума Ответить с цитированием
Старый 21.08.2011, 04:05   #5
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

а почему поток не подходит?
Pein95 вне форума Ответить с цитированием
Старый 21.08.2011, 04:10   #6
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

Он загружает всю систему до отказа, а уменьшение времени работы происходит на несколько десятков милесекунд. так что особо не помогает, даже если ставишь приоритет высокий
tanek вне форума Ответить с цитированием
Старый 21.08.2011, 19:39   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от tanek Посмотреть сообщение
Почему они говорят, что они присваивают красный цвет? Ведь красный цвет такой: 255.0.0?
А можно в таком примере присвоить значение и G и B?
Зависит от формата пиксела: бывает rgba, argb, xrgb, rgb, bgr и т.д.
Нужно поиграться с индексами:
Код:
for (int counter = 0; counter < rgbValues.Length; counter += 3)
{
    rgbValues[counter] = 255; // красный
    rgbValues[counter + 1] = 255; // зелёный
    rgbValues[counter + 2] = 255; // синий
}
Если не ошибаюсь, можно и свой формат взять.
Carbon вне форума Ответить с цитированием
Старый 21.08.2011, 20:08   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Pein95 Посмотреть сообщение
а почему поток не подходит?
Потому что не надо костыли изобретать. Брать пикселы из самого объекта битмапа вместо того, чтобы брать из его данных - это всё равно что для чтения текстового файла запускать ворд и копировать оттуда текст вместо того, чтобы просто открыть файл через винапи.
Carbon вне форума Ответить с цитированием
Старый 22.08.2011, 05:44   #9
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

Carbon! А как брать пиксель из даных, пример можешь дать?
tanek вне форума Ответить с цитированием
Старый 22.08.2011, 13:28   #10
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Меня восклицательным знаком выделили.
Код:
 System.Drawing.Imaging.BitmapData bmpData =
                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                bmp.PixelFormat);

            // Get the address of the first line.
            IntPtr ptr = bmpData.Scan0;

            // Declare an array to hold the bytes of the bitmap.
            int bytes  = Math.Abs(bmpData.Stride) * bmp.Height;
���         byte[] rgbValues = new byte[bytes];

            // Copy the RGB values into the array.
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

            const int bytesPerPixel = 3;
            int row = 20;
            int col = 2;
            uint rValue = rgbValues[bmp.Width * row * bytesPerPixel + col * bytesPerPixel];
            uint gValue = rgbValues[bmp.Width * row * bytesPerPixel + col * bytesPerPixel + 1];
            uint bValue = rgbValues[bmp.Width * row * bytesPerPixel + col * bytesPerPixel + 2];

            // Copy the RGB values back to the bitmap
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);

            // Unlock the bits.
            bmp.UnlockBits(bmpData);
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация... MikeMNN Общие вопросы C/C++ 0 15.12.2010 17:40
оптимизация Terrance! Помощь студентам 8 24.09.2010 10:58
Оптимизация Alex Cones Общие вопросы Delphi 9 07.07.2010 08:47
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10