Автор
|
Тема: Осветлить картинку
|
kl |
опубликован 25-01-2002 13:09 MSK
Подскажите как бы поэффективнее осветлить картинку средствами CDC? Не хочется перебирать каждый пиксел...
|
Rechkin
|
опубликован 27-01-2002 12:49 MSK
Вопрос конечно глупый - А что есть CDC? |
Glite
|
опубликован 27-01-2002 03:19 MSK
Попробуй FloodFill или ExtFloodFill |
DmitryRyvkin
|
опубликован 27-01-2002 04:22 MSK
Вопрос совсем неглупый. Только у CDC есть выбранный в его контекст битмэп. Вот к нему то и нужно получить доступ. MFC не дает попиксельного доступа, но можно получить адресс буфера байтиков. Вот отсюда и пляши. |
michl_m
|
опубликован 27-01-2002 12:03 MSK
Если я правильно понял, ты хочешь сделать, как в FotoShop. Т.е цветокоррекция. Вроде панельки "яркость, контрастность, гамма". Посему ответ - кроме как попиксельно, другого пути нет. Это математика. Не очень сложная, но нестандартная. Каждая точка - цвет. Предположим, RGB. Простейшее - для каждой точки изменить цвет на R+n1, G+n2, B+n3. Можно n1=n2=n3. Только с контролем диапазона: 255 >= R >= 0, например. Только для больших n1,n2,n3 вся картинка может стать черной или белой. Поэтому применяют нелинейные функции. |
kl
|
опубликован 28-01-2002 09:26 MSK
Я сначала и сделал как предлагал michl_m. Но сильно заметны искажения. Почитав MSDN я увидел функции UpdateColors, SetColorAdjustment. Может с их помощью можно? К сведению DmitryRyvkin попиксельный доступ MFC позволяет..:) |
michl_m
|
опубликован 28-01-2002 13:32 MSK
2kl. Я же предупреждал, и не зря написал n1, n2, n3. Поясняю. Например, открываем на Desktop окно Properties->Appearance. В общем окошко, позволяющее менять цвета элементов Windows (Desktop, Window title, ...). Открываем Color->Other. В общем, я к тому, чтобы открыть стандартный диалог Сolor change. Теперь посмотрим, что происходит. Выберем любой цвет. Например, левый верхний. У меня он розовый, RGB = 255,128,128. Теперь справа ползунком начинаем его осветлять. Заметь тенденцию изменения значений RGB! Компонента Red не меняется долгое время, изменяются только Green и Blue. Так что осветление без искажения гаммы - дело непростое. Еще пример - выбери зеленый. Там есть цвет RGB = 0,128,0. Двигаем стрелку - меняется только Green. Цвет остается зеленым разной степени яркости. В общем, лобового решения этой проблемы нет.
|
DmitryRyvkin
|
опубликован 28-01-2002 13:58 MSK
2kl Да я знаю что позволяет , вызывает API GetPixel. Но вы посмотрите на скорость работы таким макаром и все поймете. К сведению kl работа с пикселями в VCL организована напрямую через память битмэпа, скорость куда лучше. |
kl
|
опубликован 28-01-2002 14:53 MSK
Всем спасибо! |