Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка изображения. Метод. [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]

Я за массив сканлайнов.


Наверх

Титульная страница Поиск, карта сайта Написать письмо