Методики построения палитры цветов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Методики построения палитры цветов

Сообщение Cryonyx » 23.09.2005 (Пт) 8:33

Привет всем. Собственно, несколько вопросов кроме сабжа:
1. Как строить цвета не на основе функции RGB, а, скажем, по Hue./Sat./Lum. (эта фишка реализована во всех графических редакторах, даже в Пайнте)
2. Можно ли устроить при помощи DirectX или других способов быструю перерисовку рабочей области, где собственно и сторится палитра (допустим, это некий пикчербокс)? Перерисовка средствами VB меня не устраивает, так как она слишком медленная
3. Как сделать палитру в 3D? (Ну, к примеру, есть у нас некая объёмная сфера,и нужно на её поверхности разместить все возможные цвета)

Пока это всё, что пришло на ум. По мере поступления буду ещё дописывать вопросы :wink:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение alibek » 23.09.2005 (Пт) 9:33

А вопросы в чем?

Цветовые пространства описаны тут: http://www.easyrgb.com/math.html
Lasciate ogni speranza, voi ch'entrate.

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 23.09.2005 (Пт) 19:27

Кхм. Это немного не то. За ссылку, конечно, спасибо. Пригодится.
Но меня больше интересует то, как можно мостроить палитру всех цветов на небольшом (относительно) пикчербоксе (хотя бы как в стандартном окошке выбора цвета).. :?
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение tyomitch » 23.09.2005 (Пт) 22:02

А никак.
В стандартном окошке выбора цвета далеко не все цвета нарисованы. Это невозможно: их 16 миллионов.
Именно поэтому оно состоит из поля и слайдера, а не одного поля.
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 24.09.2005 (Сб) 19:43

Оке. А как реализовать хотя бы такое окошко?
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение GSerg » 24.09.2005 (Сб) 21:14

Поюзать прямо его же?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 24.09.2005 (Сб) 21:52

Не, это-то мне и не интересно. Я хочу реализовать подобное сам, а для этого мне нужно понять, каким образом строится данна палитра.
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение GSerg » 24.09.2005 (Сб) 21:58

GradientFill?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 24.09.2005 (Сб) 22:02

Можно поподробней?
Хотя я думаю, что это вряд ли будет то, что надо, ведь на той же палитре в пайнт не градиентная заливка, а фиг знает что (либо градиент в 3D :wink: )
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение GSerg » 24.09.2005 (Сб) 22:07

Дык задавай сколько надо точек градиента, и вперёд...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 24.09.2005 (Сб) 22:11

Ламоботский вопорс: как?
Я пока умею только обычный град делать :oops:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение tyomitch » 25.09.2005 (Вс) 0:08

Держи прототип пикера.
Код: Выделить всё
Option Explicit
Private Declare Function ColorHLSToRGB Lib "shlwapi" (ByVal wHue As Integer, ByVal wLuminance As Integer, ByVal wSaturation As Integer) As Long
Private Hue As Integer, Saturation As Integer

Private Sub Form_Load()
Width = 256 * Screen.TwipsPerPixelX + (Width - ScaleWidth)
Height = 256 * Screen.TwipsPerPixelY + (Height - ScaleHeight)
AutoRedraw = True: ScaleMode = vbPixels
For Hue = 0 To 239
    For Saturation = 0 To 239
        PSet (Hue, 239 - Saturation), ColorHLSToRGB(Hue, 120, Saturation)
    Next
Next
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Y < 240 Then
    If X < 240 Then
        Hue = X
        Saturation = 239 - Y
        Dim Luminance As Integer
        For Luminance = 0 To 239
            Line (240, 239 - Luminance)-(255, 239 - Luminance), ColorHLSToRGB(Hue, Luminance, Saturation)
        Next
    ElseIf Y < 256 Then
        Line (0, 240)-(255, 255), ColorHLSToRGB(Hue, Y, Saturation), BF
    End If
End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button Then Form_MouseDown Button, Shift, X, Y
End Sub

"Падибагал, спасибо." (c)
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 25.09.2005 (Вс) 0:37

2 tyomitch

Цвет можно брать и с GetPixel.

Да... Ещё у тебя нужно 256 - Y считать, а не Y.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение tyomitch » 25.09.2005 (Вс) 0:55

BV писал(а):Цвет можно брать и с GetPixel.

Угу. И что с ним дальше делать? Переводить в HSL, а потом обратно?
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 25.09.2005 (Вс) 1:17

Зачем? Я говорил про эту строчку:

Код: Выделить всё
Line (0, 240)-(255, 255), ColorHLSToRGB(Hue, Y, Saturation), BF
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение tyomitch » 25.09.2005 (Вс) 2:18

Ладно, ладно, я ступил.
Падибаганый вариант:
Код: Выделить всё
Option Explicit
Private Declare Function ColorHLSToRGB Lib "shlwapi" (ByVal wHue As Integer, ByVal wLuminance As Integer, ByVal wSaturation As Integer) As Long

Private Sub Form_Load()
Width = 256 * Screen.TwipsPerPixelX + (Width - ScaleWidth)
Height = 256 * Screen.TwipsPerPixelY + (Height - ScaleHeight)
AutoRedraw = True: ScaleMode = vbPixels
Dim Hue As Integer, Saturation As Integer
For Hue = 0 To 239
    For Saturation = 1 To 239
        PSet (Hue, 239 - Saturation), ColorHLSToRGB(Hue, 120, Saturation)
    Next
Next
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Y < 240 Then
    If X < 240 Then
        Dim Luminance As Integer
        For Luminance = 1 To 239
            Line (240, 239 - Luminance)-(255, 239 - Luminance), ColorHLSToRGB(X, Luminance, 239 - Y)
        Next
    ElseIf Y < 256 Then
        Line (0, 240)-(255, 255), Point(X, Y), BF
    End If
End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button Then Form_MouseDown Button, Shift, X, Y
End Sub
Изображение

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

Сообщение SHURUP » 27.09.2005 (Вт) 0:53

Конечно знать как делать такую картинку полезно, но ИМХО в программе его лучше не строить а просто загрузить из файла или ресурса (быстрее будет)
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

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

Сообщение tyomitch » 27.09.2005 (Вт) 2:49

Стандартный пикер строит (один раз при загрузке).
Наверное, его авторы лучше знают, как лучше.
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 27.09.2005 (Вт) 19:23

Слушайте, а почему все значения HLS колеблются в диапазоне [0;239], а не [0;255] :?:
Я, конечно понимаю, что если подставить значания вне этого диапазона, получаются весьма занятные результаты с интересными побочными эффектами ;), но всё же почему :?: :?:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.09.2005 (Вт) 19:39

Формула для пересчета цвета из HLS в RGB какая там? :)

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 27.09.2005 (Вт) 20:54

Ты меня спрашиваешь? :lol:
Я б тоже хотел это знать
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

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

Сообщение tyomitch » 27.09.2005 (Вт) 21:10

Cryonyx писал(а):Слушайте, а почему все значения HLS колеблются в диапазоне [0;239], а не [0;255] :?:

По прихоти MS, имхо. Больше непочему.

Почему в часе 60 минут, а не 80? Потому же: кому-то так захотелось.
Изображение

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

Сообщение alibek » 28.09.2005 (Ср) 9:07

tyomitch писал(а):Почему в часе 60 минут, а не 80? Потому же: кому-то так захотелось.

Вовсе нет :)
Это наследие одной древней 60-ричной системы исчисления.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 28.09.2005 (Ср) 9:08

Cryonyx писал(а):Слушайте, а почему все значения HLS колеблются в диапазоне [0;239], а не [0;255] :?:

Потому что 240 делится нацело на шесть, а 256 нет.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 28.09.2005 (Ср) 9:23

alibek, а почему не 252 тогда? Тем более, частное получается символичное...
Изображение

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

Сообщение alibek » 28.09.2005 (Ср) 9:58

Потому что 240 допускает больше целых степеней деления :) Т.е. "правильные" цвета выражаются целыми числами.
240 можно разделить нацело на 2, на 3, на 4, на 5, на 6, на 8, на 10, на 12, на 16, на 20, на 24, на 30, на 40, на 60, на 80, на 120. Ни у какого другого числа нету стольки делителей.
Lasciate ogni speranza, voi ch'entrate.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 28.09.2005 (Ср) 16:21

2 alibek

Сам догадался? Или есть ссылка на тему?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение alibek » 29.09.2005 (Чт) 8:13

Сам, все сам.
Lasciate ogni speranza, voi ch'entrate.

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 29.09.2005 (Чт) 10:51

Я когда то занимался этим вопросом - самое простое - действительно брать готовую палитру и с нее стягивать цвета, формулы перевода РГБ в HSB, HLS, HSV и другие проще искать на сайтах фотошопщиков... но есть один момент который я нарыл - человеческий глаз воспринимает цвета по разному поэтому для построения хорошей палитры недостаточно одной формулы преобразования.

Ем вилкой...

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 29.09.2005 (Чт) 19:42

Ну хорошо, с виндовой палитрой мы разобрались. Может тогда есть у кого идеи, как сделать палитру а-ля фотошоп (стандартная) :?: :D
просто реально интересно узнать, как всё это делается "у больших дядечек" (с) :wink:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

След.

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

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

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

    TopList