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

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

Есть какие нибудь известные грабли Graphics и много-поточности.


Дмитрий С ©   (2011-03-24 12:25:00) 

Обрабатываю изображение в несколько потоков. В основном это работа с TBitmap.ScanLine, TBitmap.Canvas.Draw и StretchBlt. У каждого потока свои ресурсы. К общей картинке, которая обрабатывается, доступ синхронизирован.
И почему-то в потоке иногда теряется изображение. Просто нет его и все.
Может есть грабли известные?

Программа для составления мозайки из мелких изображений.
Могу выложить исходник, если нужно.


Loginov Dmitry   (2011-03-25 17:36:00) [1]


> И почему-то в потоке иногда теряется изображение. Просто
> нет его и все.
> Может есть грабли известные?


Все обращения из дополнительного потока к методам канвы объекта TBitmap должны быть заключены между
Bitmap.Canvas.Lock
и
Bitmap.Canvas.Unlock


antonn   (2011-03-24 22:55:00) [2]

А я думал что я один такой криворукий =)
Сделал свой битмап, с блэкдэеком и шлю...со своим сканлайном, тупо массив :)


Eraser   (2011-03-24 20:09:00) [3]

> [0] Дмитрий С ©   (24.03.11 12:25)

Есть там несколько серьезных граблей. Помню долго искал баги, которые из-за них. Например, при смене разрешения экрана или цветовой палитры - какие-то GDI объекты пересоздаются.. больше граблей так на вскидку не помню, но они есть.


Дмитрий С   (2011-03-24 20:01:00) [4]


> Игорь Шевченко ©   (24.03.11 12:55) [2]

проблема видимо в самом дельфи, при определенных условиях XXX.canvas.handle становится невалидным. Вспомнить почему не получилось.


> MonoLife ©   (24.03.11 15:31) [3]

Суть такая:
Берется много маленьких фоток (я взял уменьшенные аватарки друзей вкотнакте). Все они 100х100. Уменьшаются до размеров ячейки мозайки. (обычно это 16 на 16 точек у меня).
Берем большую фотку, которую хотим получить. Далее я ее буду называть оригиналом.
Затем по порядку слева направо сверху вниз с берутся кусочки оригинала 16 на 16. Каждый кусочек сравнивается с каждой маленькой фоткой определенным способом и наиболее соответствующая подставляется на место оригинала.

Алгоритм сравнения такой: Берется кусочек с оригинала и одна из маленьких фоток. Обе уменьшаются до размеров 4х4 точки. Для каждой точки находится SQRT(SQR(R_orig  - R_test) + SQR(G_orig  - G_test) + SQR(B_orig  - B_test)), суммируются. Получается значение соответствия изображений.
Ну и для какой маленький картинки значение соответствия больше - так и выбирается.
Есть еще дополнительные правила: две одинаковых картинки не могут стоять рядом; для каждой маленькой картинки создаются еще штук 7 копий разной яркости.

Вобщем алгоритм сравнения я хотел распараллелить, но похоже время потерял. В итоге оптимизировал однопоточный алгоритм, работает очень быстро.


MonoLife   (2011-03-24 15:31:00) [5]


> Дмитрий С ©   (24.03.11 12:25)  

любопытно, на сколько долго происходит обработка картинки, кусочков.. что там еще "сканлайнится", если не использовать доп. потоки?


Игорь Шевченко   (2011-03-24 12:55:00) [6]


> Есть какие нибудь известные грабли Graphics и много-поточности


http://www.transl-gunsmoker.ru/2011/02/thread-affinity-of-user-interface_06.html
http://www.transl-gunsmoker.ru/2011/02/thread-affinity-of-user-interface_08.html


brother   (2011-03-24 12:32:00) [7]

любопытно


Наверх

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