![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Всем здрасьте...
Вот тут бъюсь над такой проблемкой: Есть PainBox, на который выводится картинка. Надо поверх этой картинки еще нарисовать полупрозрачный цветной прямоугольник (один цвет). Координаты прямоугольника есть (TRect). Сложность в том, что надо нарисовать его быстро. Вариант создания большого битмапа с альфа-каналом и копирования его части на картинку держу как запасной, т.к. размер прямоугольника вычисляется динамически, а еще один огромный битмап в памяти держать не очень хочется. Есть у кого какие идеи? ЗЫ. Ограничение - не использовать сторонних доп. библиотек, типа Graphics32 и т.п. Можно использовать DevExpress, бо как он уже в проекте используется. Код отрисовки: Код:
Последний раз редактировалось lmikle, 02.12.2012 в 20:43. |
#2
|
||||
|
||||
![]() а если создать небольшой битмап, как раз под расчитанный прямоугольник, копировать из PaintBox картинку этого прямоугольника, наложить полупрозрачный прямоугольник и вывести отдельным PaintBox'ом в нужном месте над оригинальным PaintBox' ом (чтобы не затирать оригинальную картинку)
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard ![]() |
#3
|
||||
|
||||
![]() Точно не помню, но кажется делал так:
Код:
|
#4
|
||||
|
||||
![]() Изврат но: GetDiBits обеих картинок и смешивать байты в нужной пропорции.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||||
|
|||||
![]() Цитата:
Попробую. Цитата:
Как уже писал, данная операция должна производиться быстро, поэтому варант с прямой работой с пикселами скорее всего не подойдет. Слишком долго. Думал в сторону GDI/GDI+, но еще не смотрел... Цитата:
Дело в том, что координаты прямоугольника вычисляются налету. Если нужный битмап создавать заранее, то он может оказаться очень большим, чего не хотелось бы, и так в памяти висит оригинальная картинка. Если битмап создавать в процессе работы при вызове отрисовки, то чем это лучше работы с пикселами? Те же тормоза будут - пока создашь (переразмеришь битмап), пока на нем отрисуешься, а потом опять уже его отрисовывать с альфа каналом. Собственно, думал может кто знает как отрисовать просто прямоугольник с альфа каналом. Как видно из кода, пока просто рисуется фокусный прямоугольник, что не очень наглядно... |
#6
|
||||
|
||||
![]() попробовал на Gdiplus:
Код:
![]() Пишу программы за еду. __________________ |
#7
|
||||
|
||||
![]() отставить панику! двойная буферизация спасает ситуацию.
Пишу программы за еду. __________________ |
#8
|
||||
|
||||
![]() Я через GetDIBits (точнее его предшественника) отрисовываю тень, кусок кода естественно на ассемблере.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
![]() Цитата:
ОК, проблему решил через AlphaBlend. Надо теперь только немного оптимизировть... Вот эта функция, мож кому пригодится. Нарыл на ExpertsExchange. Код:
|
#10
|
||||
|
||||
![]() Знакомый код, уже и не помню чем он меня тогда не устроил, а больше с ним не экспериментировал.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
![]() Цитата:
Ну не знаю, чем он тебя не устроил. Отрисовка - то что хотелось. По скорости, даже на не самой быстрой машинке (сейчас AMD Athlon M320), устраивает даже в таком виде (собственно, у меня он в отрисовке маркеров, когда юзер выделяет квадрат на картинке). |