| 
| 
 | Вопрос # 2 672/ вопрос открыт / | 
 |  Здравствуйте, эксперты! Помогите пожалуйста.В форму выведено изображение *.bmp, палитра которого содержит Kc - цветов. Сформирован массив C:array of TColor, в котором содержатся параметры цветов палитры изображения.
 Вопрос. Как сформировать массив XY:array of TPoint, содержащий координаты первого встреченного в изображении пикселя с цветом из массива C?
 Приведенная в приложении процедура спасает при малом количестве цветов. При большом количестве цветов существенно увеличивается время ожидания результата, которое зависит также от размеров и разрешения изображения.
 Может быть есть алгоритм сокращающий время решения этой задачи?
 Заранее благодарю.
 Приложение:Переключить в обычный режим For i:=0 to Kc-1 dobegin  For x:=0 to Width-1 do  begin    For y:=0 to Height-1 do    begin      if bitmap.canvas.pixel[x,y]=C[i]         then goto 1;    end;  end;1:      XY[i].x:=x;      XY[i].y:=y;end;
|  |   Вопрос задал: МиГрАф (статус: 1-ый класс)Вопрос отправлен: 22 апреля 2009, 19:32
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, МиГрАф!Основная проблема кода в том, что функция доступа к пискелю - очень медленная функция. Очень. И это не вина делфи.
 Итак, первое, что можно сделать, внести внешний цикл внутрь, а обращение к пикселю вынести.  Но в данном случае это приведёт к переделыванию алгоритма.
 Поэтому рекомендую изучить, что такое ScanLine и использовать его. Это даст хороший прирост производительности.
 Что бы сделать ещё быстрее - вначале переносим всё изображение в массив, и работает исключительно с двумя массивами.
 Хорошее описание есть здесь http://www.efg2.com/Lab/ImageProcessing/Scanline.htm
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 22 апреля 2009, 19:49
 
 |  
 Мини-форум вопросаВсего сообщений: 1; последнее сообщение — 22 апреля 2009, 19:41; участников в обсуждении: 1. 
|   | Dron (статус: Студент), 22 апреля 2009, 19:41 [#1]:Я думаю, скорость работы увеличится, если поменять циклы местами: не цикл по картинке внутри цикла по цветам, а цикл по цветам внутри цикла по картинке. Конечно, проверку там придётся сделать как-то по-другому, но работа с массивом выполняется гораздо быстрее, чем с точками канвы изображения. С уважением. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |