Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.03;
Скачать: CL | DM;

Вниз

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

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

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

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


 
brother ©   (2011-03-24 12:32) [1]

любопытно


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


> Есть какие нибудь известные грабли 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


 
MonoLife ©   (2011-03-24 15:31) [3]


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

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


 
Дмитрий С ©   (2011-03-24 20:01) [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 копий разной яркости.

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


 
Eraser ©   (2011-03-24 20:09) [5]

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

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


 
antonn ©   (2011-03-24 22:55) [6]

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


 
Loginov Dmitry ©   (2011-03-25 17:36) [7]


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


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



Страницы: 1 вся ветка

Текущий архив: 2011.07.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1301060385
fynjy93
2011-03-25 16:39
2011.07.03
sql запрос - проблема разделения на части


2-1301080427
DenKa
2011-03-25 22:13
2011.07.03
Вписать картинку в рамку с закругленными краями


8-1212752371
zuzick
2008-06-06 15:39
2011.07.03
Отключить звук в TMediaPlayer


15-1291142271
xayam
2010-11-30 21:37
2011.07.03
Как ускорить индексирование сайта поисковиками?


1-1257942878
Yurikon
2009-11-11 15:34
2011.07.03
Использование RxTrayIcon