![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка изображения. Метод. [D7, WinXP]
Andy BitOff © (2006-03-02 17:54:00)Посоветуйте, какой лучше использовать метод обраотки.
Алгоритм накидал, но вот способ... Вообщем, предстоит ОЧЕНЬ большая обработка двух битмапов с выводом результатов в третий. Придется скакать по пикселям исходных двух во всех направлениях. Я обдумывал несколько вариантов.
Можно перегнать битмапы в массивы. Достоинство: можно получать доступ к пикселям как Массив[x,y]- удобно.
Можно создать массивы указателей на горизонтальные линии (ScanLine). Менее удобный доступ.
Ну и использовать непосредственно ScanLine и прыгать туда сюда. Это мне вообще не нравится.
Может еще какие варианты есть?
Максимально важна скорость.
Andy BitOff (2006-03-04 16:24:00) [1]GrayFace © (04.03.06 14:46) [12]
Получил, спасибо.
GrayFace (2006-03-04 14:46:00) [2]Отправил. Есть одно несовместимое изменение: я ввел свойство QPixels - работа с пикселями "напрямую". В случае палитры это номер цвета, в случае 24,32 bit - перевернутый цвет. Поэтому, флаг работы с палитрой я убрал.
Andy BitOff (2006-03-03 13:03:00) [3]StriderMan © (03.03.06 12:10) [9]
посмотрел исходники TCanvas
GetPixel := Windows.GetPixel(FHandle, X, Y);
чутье подсказывает что API не очень быстро это дело отработает...
Цитата из статьи по ссылке выше:
Причины низкой скорости доступа к Pixels вкратце таковы: при каждом таком обращении вызываются функции API SetPixel или GetPixel, которые должны заблокировать передаваемый контекст устройства (далее DC - Device Context), определить текущее преобразование координат, с его учетом проверить, попадает ли пиксел в доступный регион DC, установить или прочитать значение цвета пиксела с преобразованием к нужному цветовому формату, что осуществляется c помощью "блиттинга" - копирования прямоугольного участка DC, после чего разблокировать DC. Все это требует существенных затрат процессорного времени (в том числе и на переход в режим ядра и назад).
Andy BitOff (2006-03-03 12:55:00) [4]
StriderMan © (03.03.06 12:10) [9]
но копирование всех точек в массив тоже не быстрая операция, да еще и памяти порядочно займет
ScanLine сделает это за 00:00.000, а TBitMap.Canvas.Pixels[x,y] за 02:23.385.
У меня на все функции счетчик вренени написан и на моих изображениях получаются такие результаты. А памяти не так уж и много, если учесть то, что все изображения 8-битные.
GrayFace © (03.03.06 10:21) [5]
ЖДУ.
StriderMan (2006-03-03 12:10:00) [5]
> Если важна скорость или хотя бы обрабатывается большое кол-
> во пикселей, то ни в коем случае не использовать св-во Pixsels,
> иначе хорошие тормоза будут обеспечены.
посмотрел исходники TCanvas
GetPixel := Windows.GetPixel(FHandle, X, Y);
чутье подсказывает что API не очень быстро это дело отработает, так что признаю Вашу правоту
но копирование всех точек в массив тоже не быстрая операция, да еще и памяти порядочно займет
Amoeba (2006-03-03 11:49:00) [6]Если важна скорость или хотя бы обрабатывается большое кол-во пикселей, то ни в коем случае не использовать св-во Pixsels, иначе хорошие тормоза будут обеспечены.
Andy BitOff (2006-03-03 11:31:00) [7]GrayFace © (03.03.06 10:21) [5]
Конечно надо, т.к. я уже начал с ней работать. Если принципиальных изменений не вненесно, то ладно, а иначе переписывать придется ;)
Жду ссылочку.
Andy BitOff (2006-03-03 11:28:00) [8]StriderMan © (02.03.06 21:13) [4]
Смешно =)
GrayFace (2006-03-03 10:21:00) [9]Могу дать измененную версию http://www.delphimaster.ru/articles/pixels/index.html- исправлено несколько багов, скорость чуть побольше и еще некоторые усовершенствования.
> StriderMan © (02.03.06 21:13) [4]
> не надо никуда копировать!
>
> TBitMap.Canvas.Pixels[x,y]
Перечитай в сабже почледнее предложение.
StriderMan (2006-03-02 21:13:00) [10]не надо никуда копировать!
TBitMap.Canvas.Pixels[x,y]
MBo (2006-03-02 18:24:00) [11]http://www.delphimaster.ru/articles/pixels/index.html
Crash Coredump (2006-03-02 18:22:00) [12]GetDIBits ?
TUser (2006-03-02 18:19:00) [13]Я за массив сканлайнов.