Изменение цвета рисунка-шаблона

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

Изменение цвета рисунка-шаблона

Сообщение Георгий2 » 26.08.2007 (Вс) 21:38

Здравствуйте, уважаемые.

Имеется картинка, пользователь должен иметь возможность изменять её цвет двигая слайдеры R,G и B. Как это реализовать?

Заранее спасибо
Георгий

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 26.08.2007 (Вс) 22:03

Ответ на вопрос "Как это реализовать" зависит от того, как изменения слайдеров влияет на картинку.

В общем случае, рекоммендую посмотреть "Коллекцию филтров" от BV.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 30.08.2007 (Чт) 8:40

самое грустное, что никто не знает, что такое "Коллекция фильтров" от BV )
изменения цвета картинки производится ее разложением в HSV, изменением Hue и сложением обратно в RGB.
Код: Выделить всё
' ïðåîáðàçóåò RGB â HSV
Private Sub CalcHSV()
    Dim sngRed As Single
    Dim sngGreen As Single
    Dim sngBlue As Single
    Dim sngMx As Single
    Dim sngMn As Single
    Dim sngDelta As Single
    Dim sngVa As Single
    Dim sngSa As Single
    Dim sngRc As Single
    Dim sngGc As Single
    Dim sngBc As Single
    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 sngMn = 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 sngGreen
                msngHue = 2 + sngRc - sngBc
            Case sngBlue
                msngHue = 4 + sngGc - sngRc
        End Select
       
        msngHue = msngHue * 60
        If msngHue < 0 Then msngHue = msngHue + 360
    End If
    msngSaturation = sngSa * 100
    msngValue = sngVa * 100
End Sub

' ïðåîáðàçóåò HSV â RGB
Private Sub CalcRGB()
    Dim sngSaturation As Single
    Dim sngValue As Single
    Dim sngHue As Single
    Dim intl As Integer
    Dim sngF As Single
    Dim sngP As Single
    Dim sngQ As Single
    Dim sngT As Single
    Dim sngRed As Single
    Dim sngGreen As Single
    Dim sngBlue As Single
    sngSaturation = msngSaturation / 100
    sngValue = msngValue / 100
    If msngSaturation = 0 Then
        sngRed = sngValue
        sngGreen = sngValue
        sngBlue = sngValue
    Else
        sngHue = msngHue / 60
        If sngHue = 6 Then sngHue = 0
        intl = Int(sngHue)
        sngF = sngHue - intl
        sngP = sngValue * (1! - sngSaturation)
        sngQ = sngValue * (1! - (sngSaturation * sngF))
        sngT = sngValue * (1! - (sngSaturation * (1! - sngF)))
        Select Case intl
            Case 0
                sngRed = sngValue
                sngGreen = sngT
                sngBlue = sngP
            Case 1
                sngRed = sngQ
                sngGreen = sngValue
                sngBlue = sngP
            Case 2
                sngRed = sngP
                sngGreen = sngValue
                sngBlue = sngT
            Case 3
                sngRed = sngP
                sngGreen = sngQ
                sngBlue = sngValue
            Case 4
                sngRed = sngT
                sngGreen = sngP
                sngBlue = sngValue
            Case 5
                sngRed = sngValue
                sngGreen = sngP
                sngBlue = sngQ
        End Select
    End If
    mintRed = Int(255.9999 * sngRed)
    mintGreen = Int(255.9999 * sngGreen)
    mintBlue = Int(255.9999 * sngBlue)
End Sub

код взят из книги
Крейг Дж. К. И Уэбб Дж.
Microsoft Visual Basic 6.0. Мастерская разработчика/Пер. с англ. - М.: Издательский отдел "Русская редакция" ТОО "Channel Trading Ltd.", 1998. - 648 c.: ил. ISBN 5-7502-0127-9
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

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

Сообщение tyomitch » 30.08.2007 (Чт) 11:08

Могу посоветовать поставить эту книгу обратно на полку, и заюзать стандартные АПИ ColorRGBToHLS и ColorHLSToRGB
Изображение

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 30.08.2007 (Чт) 12:39

udpn
BV - это один из посетителей этого форума (старожил и модер) Коллекцию фильтров глянь в кирпичах или в его блоге, хотя в блоге врядли ИМХО... В любом случае ты можешь написать ему в личку и спросить про эту коллекцию.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.08.2007 (Чт) 12:43

Денис
Иногда лучше жевать.

http://bbs.vbstreets.ru/viewtopic.php?t=24078 - на первой же странице форума. BV модерит только раздел "Наши проекты" (где и лежит топик), и уже давно здесь почти не появляется. А жаль.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 31.08.2007 (Пт) 17:26

заюзать стандартные АПИ ColorRGBToHLS и ColorHLSToRGB

Балин, книжка Microsoft Press, я и не думал что они могут соврать... ) Да, кстати какие они там стандартные я не знаю, но в API Viewer их нет ) Сейчас посмотрю модули для PowerBasic, но очень сомневаюсь что они будут и там.
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

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

Сообщение tyomitch » 31.08.2007 (Пт) 17:42

udpn, а ты лучше на этом форуме посмотри. Тут они есть.
Изображение

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 01.09.2007 (Сб) 9:47

Прошёлся по приведённым ссылкам и ColorRGBToHLS в поиске, плюс инфа с этого топика - для меня, ламера, куча сложной информации, буду мучительно разбираться. Всем огромное спасибо! Если возникнут конкретные вопросы, позволю себе побеспокоить общество ещё раз. Спасибо!!!
Георгий


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

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

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

    TopList