RGB & контрастность & яркость

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DiSe
Обычный пользователь
Обычный пользователь
 
Сообщения: 97
Зарегистрирован: 30.06.2003 (Пн) 19:11

RGB & контрастность & яркость

Сообщение DiSe » 21.07.2003 (Пн) 15:06

Есть ли какие формулы зависимости контрастности и яркости от RGB (Red, Green, Blue)? Мне надо это, чтобы работать с цветами по яркости и контрастности.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 21.07.2003 (Пн) 17:32

Type tRGB
r as byte
g as byte
b as byte
end type

function Brite (c as tRGB, Param as integer) as tRGB
dim d as integer
d=c.r + Param:IF d>255 then d=255:Brite.r=d
d=c.g + Param:IF d>255 then d=255:Brite.g=d
d=c.b + Param:IF d>255 then d=255:Brite.b=d
end function

function Contrast (c as tRGB, Param as single) as tRGB
dim d as integer
d=128+(c.r -128) * Param
IF d>255 then d=255
IF d<0 then d=0
Brite.r=d
d=128+(c.g -128) * Param
IF d>255 then d=255
IF d<0 then d=0
Brite.g=d
d=128+(c.b -128) * Param
IF d>255 then d=255
IF d<0 then d=0
Brite.b=d
end function

В первой функции параметр - целое число от -255 до 255 - повышение\понижение яркости. Во второй Single значение от 0 до ....много. Меньше единицы - понижение, больше - повышение.
Это я написал не проверяя - могут быть ошибки.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.07.2003 (Вт) 10:05

Корявенько, корявенько.
Лучше почитай описание формата JPEG, там есть и формулы и коэффициенты.
Lasciate ogni speranza, voi ch'entrate.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 24.07.2003 (Чт) 9:25

Конечно корявенько. Я пытался наглядно показать логику действий яркости и контраста, а не демонстрировать высокий стиль программирования.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.07.2003 (Чт) 15:12

Я вовсе не о стиле.
Формулы совершенно неправильные, каждая составляющая RGB имеет разный вес и на яркость влияет по разному. А контрастность, кроме того, определяется общей яркостью картинки.
Lasciate ogni speranza, voi ch'entrate.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 24.07.2003 (Чт) 16:02

На счет контраста - согласен. Как вариант вместо 128 можно было бы подставить среднюю яркость картинки. А на счет того, что
"RGB имеет разный вес и на яркость влияет по разному"
я это знаю, но в данном случае это не имеет значения. RGB (64,64,64) - темно серый, из них 64G>64R>64B (по восприятию). RGB(192,192,192) также останется серым. Где мои формулы будут искажать - это за краями диапазона (0,255). Фотошоп тоже дает эти искажения При желании можно при выходе яркости за границу диапазона автоматически понижать контрастность, но это уже не назовешь обычным регулятором яркости.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.07.2003 (Пт) 9:35

Нарисуй три полосы из R255G0B0 R0G255B0 R0G0B255 и преобразуй их в серый в Photoshop и своим алгоритмом. С твоим алгоритмом все три цвета сольются в один серый цвет с R85G85B85, в Photoshop самой яркой будет зеленая полоса, потом синяя и красная. Вот в чем разница.

EDIT: Первый раз прочитал бегло, поэтому неправильно понял.
Объясняю. Допустим, есть цвет R10G40B120. Ты увеличиваешь его яркость на 40, получается R50G80B160. Но это неправильно, т.к. R увеличивается в пять раз, G в два раза, а B на 33%. А они должны увеличиваться пропорционально. Причем, пропорционально не их численным значениям, а их "видимой" для человеческого глаза яркости.
Lasciate ogni speranza, voi ch'entrate.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 25.07.2003 (Пт) 10:04

Код: Выделить всё

'преобразует RGB в HSV
sngRed = mintRed / 255
sngGreen = mintGreen / 255
sngBlue = mintBlue / 255
sngMx = sngRed

If sngGreen > sngMx Then sngMx = sngGreen
If sngBlue > sngMx Then sngMx = sngBlue

sngmn = sngRed

If sngGreen < sngMn Then sngMx=n = sngGreen
If sngBlue < sngMn Then sngMn = sngBlue

sngDelta = sngMx - sngMn
sngVa = sngMx

If sngMx Then
     sngSa = sngDelta / sngMx
Else
     sngSa = 0
End If

If sngSa = 0 Then
     msngHue = 0
Else
     sngRc = (sngMx - sngRed) / sngDelta
     sngGc = (sngMx - sngGreen) / sngDelta
     sngBc = (sngMx - sngBlue) / sngDelta

     Select Case sngMx
          Case sngRed
               msngHue = sngBc - sngGc
          Case sngRed
               msngHue = 2 + sngRc - sngBc
          Case sngRed
               msngHue = 4 + sngGc - sngRc
     End Select

     msngHue = msngHue * 60
     msngHue = (msngHue + 360) mod 360
End if

msngSaturation = sngSa * 100
msngValue = sngVa * 100
mintCalc = 0


Соответственно mintRed, mintGreen, mintBlue - это дано Красный Зелёный Синий

А msngHue, msngSaturation, msngValue - это то, что получается
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 25.07.2003 (Пт) 17:53

alibek
теперь согласен. Повышение яркости у меня несколько понижает контрасность. Но то же делает ручка "яркость" у TV. На счет фотошопа не знаю.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 2

    TopList  
cron