Затемнение (GDI)
От: Croc Россия  
Дата: 05.11.03 11:48
Оценка:
Не подскажет ли кто-нибудь, как средствами windows (gdi) делать на изображение затемнение (накладывать маску?).
Мне нужно что-то подобное инструменту Crop фотошопа.
Идея в том, что есть на экране картинка, в ней выделен прямоугольничек.
Все что снаружи прямоугольничка — затемнено раза в два.
Судя по тому, как "легко и плавно" таскается граница этого прямоугольничка, мне думается, что это должно быть в GDI.
Спасибо.
Re: Затемнение (GDI)
От: AndreyFedotov Россия  
Дата: 05.11.03 12:17
Оценка:
Здравствуйте, Croc, Вы писали:

C>Не подскажет ли кто-нибудь, как средствами windows (gdi) делать на изображение затемнение (накладывать маску?).

C>Мне нужно что-то подобное инструменту Crop фотошопа.
C>Идея в том, что есть на экране картинка, в ней выделен прямоугольничек.
C>Все что снаружи прямоугольничка — затемнено раза в два.
C>Судя по тому, как "легко и плавно" таскается граница этого прямоугольничка, мне думается, что это должно быть в GDI.
C>Спасибо.

По-моему легче всего воспользоваться средствами библиоткеи GDI+.
Если это не подходит, то можно сделать так:
Готовишь три изображения с размерами как у исходного (как Bitmap в памяти, средствами любой библиотеки/API, включая GDI):
I — исходное
S — затемнённое (то есть у которого компоненты цвета R, G, B умножены на величину [0,1)), обычно просто делают логический сдвиг вправо на 1 с маской, что соответсвует делению на два
W — рабочее

1. копируем исходное в рабочее, с помошью BitBlt, I => W
2. копируем заданный прямоугольник из затенённого изображения в рабочее, тоже с помощью BitBlt, S => W
3. копируем рабочее изображение на экран


— Так получится затенённый прямоугольник на обычном изображении, если нужно что бы было наоборот (обычное изображение в прямоугольнике), то меняют местами в шагах 1 и 2 исходное и затенённое изображение:


1. копируем затенённое в рабочее, с помошью BitBlt, I => W
2. копируем заданный прямоугольник из исходного изображения в рабочее, тоже с помощью BitBlt, S => W
3. копируем рабочее изображение на экран


Алгоритм можно улучшить, избавившись от рабочего изображения, если копировать с помощью BitBlt прямо на экран, правда что бы не было мелькания, потредбуется разбить картинку, поверх которой происходит копирование на прямоугольники и копировать кусками (посредством BitBlt).
Самый шик — определить часть изображения, которая поменялась, при изменении границ прямоугольника на экране и копировать только изменившиеся части изображения. Но это уже слишком...

С Уважением, Андрей
Re: Затемнение (GDI)
От: priest.evol  
Дата: 05.11.03 12:19
Оценка:
Здравствуйте, Croc, Вы писали:

C>Не подскажет ли кто-нибудь, как средствами windows (gdi) делать на изображение затемнение (накладывать маску?).


На сколько я знаю — никак. Это возможно присутствует в GDI+, но и в этом сомневаюсь.

C>Судя по тому, как "легко и плавно" таскается граница этого прямоугольничка, мне думается, что это должно быть в GDI.


Абсолютно не факт... Совет не мучать себя поисками и рисовать ручками.
Re[2]: Затемнение (GDI)
От: AndreyFedotov Россия  
Дата: 05.11.03 12:59
Оценка:
Возможно проще будет воспользоваться
DrawState
Её описание есть в MSDN
С Уважением, Андрей
Re: Затемнение (GDI)
От: B_A_D Израиль  
Дата: 05.11.03 17:41
Оценка:
Здравствуйте, Croc, Вы писали:

C>Не подскажет ли кто-нибудь, как средствами windows (gdi) делать на изображение затемнение (накладывать маску?).

C>Мне нужно что-то подобное инструменту Crop фотошопа.
C>Идея в том, что есть на экране картинка, в ней выделен прямоугольничек.
C>Все что снаружи прямоугольничка — затемнено раза в два.
C>Судя по тому, как "легко и плавно" таскается граница этого прямоугольничка, мне думается, что это должно быть в GDI.
C>Спасибо.

Нет ничего проще...
1) Создаешь DIB секцию размером с твое изображение.
2) Копируешь на нее через BitBlt исходное изображение.
3) Так как у тебя DIB секция, у тебя есть указатель на биты изображения.
4) Применяешь к ним алгоритм изменения яркости изображения(найдешь тут на сайте),
за исключением той прямоугольной области, которую не хочешь затенять.
5) Копируешь из DIB секции обратно на исходное изображение.

Ну и все.

У меня в одной программе работает такой эффект — по изображению перемещается гладкая
замкнутая область (около 1000 точек) , все что снаружи — затеняется слегка.
Но там я один раз создаю с помощью регионов битовую маску, и через нее затеняю
исходную картинку. Получается довольно живо.
Так что прямоугольник — это просто
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.