Текущий архив: 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.46 MB
Время: 0.003 c