Тонирование изображения

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Тонирование изображения

Сообщение Joo » 11.07.2009 (Сб) 11:23

Привет!
Такая задача есть исходное изображение, с помощью регулятора H(0..360) можно менять цветовой тон этого изображения. Мда, мутно получилось...
В общем нужно реализовать функцию аналогичную Photoshop ("Цветовой тон/насыщенность" с включенной опцией "тонирование").
Может у кого есть алгоритм?
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Тонирование изображения

Сообщение MIT » 11.07.2009 (Сб) 11:38

Делаешь изображение черно-белым, потом просто меняешь серый цвет отдельного пикселя на цвет, выбранный с помощью трех ползунков (тон, насыщенность, яркость), сохраняя интенсивность.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Тонирование изображения

Сообщение Joo » 11.07.2009 (Сб) 11:52

MIT писал(а):Делаешь изображение черно-белым, потом просто меняешь серый цвет отдельного пикселя на цвет, выбранный с помощью трех ползунков (тон, насыщенность, яркость), сохраняя интенсивность.

Да мне достаточно только тон, яркость и насыщенность не надо.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Тонирование изображения

Сообщение Alec » 11.07.2009 (Сб) 14:41

Может, поможет:
http://ru.wikipedia.org/wiki/HSL
Иногда лучше вовремя остановиться...
И начать заново!

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Тонирование изображения

Сообщение Joo » 12.07.2009 (Вс) 9:55

Alec писал(а):Может, поможет:
http://ru.wikipedia.org/wiki/HSL

Нет это не то!
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Тонирование изображения

Сообщение Alec » 12.07.2009 (Вс) 16:06

алгоритм перевода HSL->RGB взят с http://www.easyrgb.com/index.php?X=MATH&H=19#text19
перевод RGB->HSL встроен в класс Color (GetHue, GetSaturation, GetBrightness) (не знаю, почему у них GetBrightness, а не GetBrightness или GetIntensity, однако опытным путем установлено, что возвращаются цветовые компоненты именно модели HSL)
Код: Выделить всё
Public Function FromHSL(ByVal H As Single, ByVal S As Single, ByVal L As Single) As Color
    Dim R, G, B As Integer
    Dim var1, var2 As Single
    H = H / 360
    If S = 0 Then
      R = CInt(255 * l)
      G = CInt(255 * l)
      B = CInt(255 * l)
    Else
      If l < 0.5 Then
        var2 = L * (1 + S)
      Else
        var2 = (L + S) - (S * L)
      End If
      var1 = 2 * L - var2
    End If
    R = CInt(255 * Hue2RGB(var1, var2, CSng(H + (1 / 3))))
    G = CInt(255 * Hue2RGB(var1, var2, H))
    B = CInt(255 * Hue2RGB(var1, var2, CSng(H - (1 / 3))))
    Return Color.FromArgb(R, G, B)
  End Function

  Private Function Hue2RGB(ByVal v1 As Single, ByVal v2 As Single, ByVal vH As Single) As Single
    If vH < 0 Then vH += 1
    If vH > 1 Then vH -= 1
    If 6 * vH < 1 Then Return v1 + (v2 - v1) * 6 * vH
    If 2 * vH < 1 Then Return v2
    If 3 * vH < 2 Then Return CSng(v1 + (v2 - v1) * ((2 / 3) - vH) * 6)
    Return v1
  End Function

Теперь цвет каждого пикселя изображения нужно изменить функцией ChangeHue:
Код: Выделить всё
Public Function ChangeHue(ByVal C As Color, ByVal DeltaHue As Single) As Color
    If C.GetHue + DeltaHue < 0 Then DeltaHue += 360
    If C.GetHue + DeltaHue > 360 Then DeltaHue -= 360
    Return FromHSL(C.GetHue + DeltaHue, C.GetSaturation, C.GetBrightness)
  End Function
Иногда лучше вовремя остановиться...
И начать заново!

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Тонирование изображения

Сообщение Joo » 12.07.2009 (Вс) 17:34

Alec,
Спасибо, близко но, как я уже говорил, не совсем то, нужно аналогично фотошоповскому с галочкой "Тонирование". Но результат тоже интересный, правда черно белые картинки не тонирует.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Тонирование изображения

Сообщение Alec » 13.07.2009 (Пн) 16:13

Joo писал(а):нужно аналогично фотошоповскому с галочкой "Тонирование"

К сожалению, не имею фотошопа, посему не знаю, о чем именно идет речь...
Joo писал(а): правда черно белые картинки не тонирует.

В данном случае и не будет, у черно-белых насыщенность (Saturation) нулевая. Вот если ее при этом увеличить, то можно "затонировать" черно-белое изображение. Но это уже два ползунка (тон/насыщенность), и недалеко до третьего)
Иногда лучше вовремя остановиться...
И начать заново!

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

Re: Тонирование изображения

Сообщение Mikle » 13.07.2009 (Пн) 16:44

Увеличить насыщенность черно-белой картинки нельзя. Увеличение насыщенности - это умножение, а ноль, сколько ни умножай...

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

Re: Тонирование изображения

Сообщение Mikle » 13.07.2009 (Пн) 17:38

Пора мне уже новые кирпичи делать...
Видимо что-то вроде:
Вложения
Tone.zip
(70.42 Кб) Скачиваний: 68

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Тонирование изображения

Сообщение Joo » 13.07.2009 (Пн) 20:07

Mikle писал(а):Пора мне уже новые кирпичи делать...
Видимо что-то вроде:


Не, не то, но спасибо, появилась мысля.
Если сработает выложу.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Тонирование изображения

Сообщение Alec » 13.07.2009 (Пн) 20:15

Mikle писал(а):Увеличить насыщенность черно-белой картинки нельзя. Увеличение насыщенности - это умножение, а ноль, сколько ни умножай...

А кто говорл об умножении? Я, например, имел ввиду установку насыщенности в значение, большее нуля, например 0.5...
Иногда лучше вовремя остановиться...
И начать заново!

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

Re: Тонирование изображения

Сообщение Mikle » 14.07.2009 (Вт) 9:55

Joo писал(а):Не, не то, но спасибо, появилась мысля.
Если сработает выложу.

А что не так? У меня фотошоп то же самое делает.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Тонирование изображения

Сообщение Joo » 14.07.2009 (Вт) 10:07

Mikle писал(а):
Joo писал(а):Не, не то, но спасибо, появилась мысля.
Если сработает выложу.

А что не так? У меня фотошоп то же самое делает.

Галочку тонирование нужно поставить!
Ты получается просто смещаешь "Hue", я так делаю на основе алгоритма перевода RGB2HSB и наоборот, а нужно немного другое чуть позже доберусь до студии и накидаю, идея уже есть.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

    TopList