Функции, обратные RGB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Функции, обратные RGB

Сообщение SHURUP » 20.09.2004 (Пн) 15:55

Здраствуйте, в своих начинаниях столкнулся с проблемой:
в vb Есть функция RGB, которая дает код цвета по составляющим, а есть как из этого числа получить отдельно Red,Green,Blue?
Да и хорошо было бы Контрасность, Яркость, Цветность узнать.
Обрадуюсь любому методу: АПИ, формулы, соды, ссылки, алгоритмы.
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

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

Сообщение alibek » 20.09.2004 (Пн) 16:05

А как ты уже пытался это сделать?
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.09.2004 (Пн) 16:05

Вот вариант, который корректно обрабатывает "специальные" цвета:
Код: Выделить всё
Private Type RGB
    Red As Byte
    Green As Byte
    Blue As Byte
    Reserved As Byte
End Type
Private Declare Function OleTranslateColor Lib "oleaut32" (ByVal lOleColor As Long, ByVal lHPalette As Long, lColorRef As RGB) As Long

'использование
    Dim C As RGB
    OleTranslateColor Color, 0, C
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2004 (Пн) 16:06

Допустим, в Clr as Long у тебя цвет. Тогда:
Red = Clr and &HFF
Green = Clr and &HFF00
Blue = Clr and &HFF0000
Старший байт, насколько я помню, используется под альфа-канал, но как с ним работать - спрашивай у Темыча, это он все знает :) .

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

Сообщение alibek » 20.09.2004 (Пн) 16:09

Ennor, ты забыл сдвиг битов или деление :)
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2004 (Пн) 16:14

:) Да, действительно, забыл...
Green = (Clr and &HFF00) / &H100
Blue = (Clr and &HFF0000) / &H10000
Остальное правильно.

На самом деле, у меня в такой задаче используется LSet, но для него пример дюже длинный писать пришлось бы...
Последний раз редактировалось Ennor 20.09.2004 (Пн) 16:15, всего редактировалось 1 раз.

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 20.09.2004 (Пн) 16:14

Альфа мне не нужна, а за это СПАСИБО!

Ой, а как же с Контрасность, Яркость, Цветность. Я так понимаю что-то типа OleTranslateColor должно быть!
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2004 (Пн) 16:21

Если у тебя винда не очень старая (или IE, по крайней мере), то подойдет вот это:
Код: Выделить всё
VOID ColorRGBToHLS(
    COLORREF clrRGB,
    WORD *pwHue,
    WORD *pwLuminance,
    WORD *pwSaturation
);

Если же очень (типа NT 3.5 / Win95), то ищи в Knowledge Base - Q29240

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 20.09.2004 (Пн) 16:31

Ennor, винда у меня довольно новая, но по-моему это обьявление на "С", а можно как-то через Declare, чтобы с lib ? Я к нему более привык.
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.09.2004 (Пн) 16:36

SHURUP, лови:
Код: Выделить всё
Option Explicit
Private Declare Sub ColorRGBToHLS Lib "shlwapi" (ByVal clrRGB As Long, pwHue As Integer, pwLuminance As Integer, pwSaturation As Integer)

Private Sub Main()
Dim h As Integer, l As Integer, s As Integer
ColorRGBToHLS vbBlue, h, l, s
Debug.Print h, l, s
End Sub
Изображение

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 20.09.2004 (Пн) 16:42

ЗАДАЧА РЕШАЕМА! УРА! ВСЕМ СПАСИБО!

alibek писал(а):Ennor, ты забыл сдвиг битов или деление :)


А вообще в VB есть оператор сдвига битов? Или опять надо делить/умножать на (2^n) и хвостиками мучаться?
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2004 (Пн) 16:43

Надо, надо... :(

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

Сообщение alibek » 20.09.2004 (Пн) 16:44

Умножать/делить. Сдвига, как такового, нет.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2004 (Пн) 16:50

Кстати, сорри за оффтоп - а в VB.NET сдвиг появился? И если да, то наскольно он, так сказать, нативен?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.09.2004 (Пн) 17:11

Афаик в .net ничего нативного нет - один только фреймворк.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.09.2004 (Пн) 17:24

Не знаю как насчёт нативности, но операторы << и >> в VB 2003 есть :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList