Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.005 c
1-1258536836
Separator
2009-11-18 12:33
2011.07.03
id текущего thread?


2-1301350488
Германн
2011-03-29 02:14
2011.07.03
Непонятный глюк.


15-1300084811
smart
2011-03-14 09:40
2011.07.03
xml не отображает кириллицу


1-1257430353
igor666
2009-11-05 17:12
2011.07.03
Не модальная форма из DLL, не обрабатываются некоторые события.


15-1300133801
tesseract
2011-03-14 23:16
2011.07.03
аквариум




   Наверх