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).
Самый шик — определить часть изображения, которая поменялась, при изменении границ прямоугольника на экране и копировать только изменившиеся части изображения. Но это уже слишком...

С Уважением, Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.