Автор Тема: Плавный переход от одного цвета к другому  (Прочитано 382 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 206
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем доброго.
Хотел реализовать функцию для плавного изменения цвета и понял, что не так просто. Сделал тупо и получилось что-то не то:
Код: AutoIt [Выделить]
Global $GUI = GUICreate('', 200, 200)
GUISetState()
GUISetBkColor(0x0093BC, $GUI)
For $i = 0x0093BC To 0x7F4200 Step 12
   ;ConsoleWrite($i&@CR)
   GUISetBkColor('0x'&Hex($i, 6), $GUI)
Next
 


Кто знает, поделитесь пожалуйста. Мне нужно получать непосредственно промежуточные числа цвета (например в 100 шагов), а не рисовать на окне, поэтому GDIP наверное не подойдет, хотя рассмотрю любые варианты.

Русское сообщество AutoIt

Плавный переход от одного цвета к другому
« Отправлен: Сентябрь 03, 2018, 18:42:02 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3973
  • Репутация: 1055
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #1, Отправлен: Сентябрь 04, 2018, 13:47:11 »
Для улучшения визуального восприятия увеличьте шаг и добавьте задержку
Код: AutoIt [Выделить]
Global $GUI = GUICreate('', 200, 200)
GUISetState()
GUISetBkColor(0x0093BC, $GUI)
For $i = 0x0093BC To 0x7F4200 Step 500
   ConsoleWrite('0x'&Hex($i, 6)&@CR)
   GUISetBkColor($i, $GUI)
   If GUIGetMsg() = -3 Then Exit
   Sleep(111)
Next


А если нужно изменение "по радуге", то вы уже спрашивали здесь: https://www.autoitscript.com/forum/topic/189130-colorization-custom-sliders/
Код: AutoIt [Выделить]
GUICreate("", 200, 200)
GUISetState()
For $h = 0 To 360
    $iRGB = HSLToRGB($h / 360, 1, 0.5)
    GUISetBkColor($iRGB)
    ConsoleWrite(Hex($iRGB) & @CRLF)
    If GUIGetMsg() = -3 Then Exit
    Sleep(11)
Next

Func HSLToRGB($h, $s, $l)
    If Not $s Then Return BitShift(0xFF * $l, -16) + BitShift(0xFF * $l, -8) + BitShift(0xFF * $l, 0)
    Local Const $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s
    Local Const $p = 2 * $l - $q
    Return BitShift(0xFF * HUEtoRGB($p, $q, $h - 0.33333333), -16) + BitShift(0xFF * HUEtoRGB($p, $q, $h), -8) + BitShift(0xFF * HUEtoRGB($p, $q, $h + 0.33333333), 0)
EndFunc

Func HUEtoRGB($p, $q, $t)
    If($t < 0) Then $t += 1
    If($t > 1) Then $t -= 1
    If($t < 0.16666666) Then Return $p + ($q - $p) * 6 * $t
    If($t < 0.5) Then Return $q
    If($t < 0.66666666) Then Return $p + ($q - $p) * (0.66666666 - $t) * 6
    Return $p
EndFunc


Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 206

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #2, Отправлен: Сентябрь 04, 2018, 18:56:43 »
Цитировать
Для улучшения визуального восприятия увеличьте шаг и добавьте задержку

Как-то грубо получается, цвет прыгает. Сначала плавно меняется, а потом прыжок и цвет резко другой. Наверное, в такой схеме движение в RGB  кубе не линейное получается.

Цитировать
А если нужно изменение "по радуге", то вы уже спрашивали

О, я спрашивал совсем другие вещи  :) Здесь вы показали изменение только по шкале оттенка, а мне нужно получить схему преобразования цвета во всех его параметрах: H, S, L — движение точки внутри RGB куба. По сути, нужна формула. Сейчас опять начну изобретать, а потом окажется, что это всегда было  :laugh:
« Последнее редактирование: Сентябрь 04, 2018, 19:02:42 от musicstashall »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3973
  • Репутация: 1055
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #3, Отправлен: Сентябрь 04, 2018, 19:51:10 »
musicstashall  [?]
Цитировать
Сначала плавно меняется, а потом прыжок и цвет резко другой
И это правильно. Вот смотрите.
В десятичной системе: 205 + 100 = 305
В шестнадцатеричной: 0x0000CD + 0x000064 = 0x000131
В "цветах": к ярко синему прибавили шаг 100 и получили почти чёрный ;)

Цитировать
движение точки внутри RGB куба
Разложите цвет на компоненты RGB. Переместите точку. Пересчитайте компоненты. Сложите компоненты в новый цвет.
Фактически, это похоже на выбор цвета в диалоге цветов путём ручного ввода компонентов.

Русское сообщество AutoIt

Re: Плавный переход от одного цвета к другому
« Ответ #3 Отправлен: Сентябрь 04, 2018, 19:51:10 »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 206

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #4, Отправлен: Сентябрь 04, 2018, 20:58:03 »
Цитировать
Разложите цвет на компоненты RGB. Переместите точку. Пересчитайте компоненты. Сложите компоненты в новый цвет.
Фактически, это похоже на выбор цвета в диалоге цветов путём ручного ввода компонентов.

Я так и думал, придется опять заниматься математикой  :)


Добавлено: Сентябрь 05, 2018, 00:15:00
Ну вот, если «топором», то так:

Код: AutoIt [Выделить]
#include <Color.au3>
#include <Array.au3>

Global $GUI = GUICreate('', 200, 200)
GUISetState()

_FlowColor(0x426D79, 0x5C4124, 100, 1, 'GUISetBkColor')

Func _FlowColor($Color1, $Color2, $_To, $_Sleep, $_Func)
   Local $Color, $_Rmax, $_Rmin = 0, $_Gmax, $_Gmin = 0, $_Bmax, $_Bmin = 0
   Local $RGB1 = _ColorGetRGB($Color1)
   Local $RGB2 = _ColorGetRGB($Color2)
   Local $RGB[2][3] = [[$RGB1[0], $RGB1[1], $RGB1[2]], [$RGB2[0], $RGB2[1], $RGB2[2]]]
   $_Rmax = _ArrayMaxIndex($RGB, 1, -1, -1, 0)
   If $_Rmax = 0 Then $_Rmin = 1
   $_Gmax = _ArrayMaxIndex($RGB, 1, -1, -1, 1)
   If $_Gmax = 0 Then $_Gmin = 1
   $_Bmax = _ArrayMaxIndex($RGB, 1, -1, -1, 2)
   If $_Bmax = 0 Then $_Bmin = 1
   $_R_step = ($RGB[$_Rmax][0] - $RGB[$_Rmin][0])/$_To
   If $_Rmax = 0 Then $_R_step = - $_R_step
   $_G_step = ($RGB[$_Gmax][1] - $RGB[$_Gmin][1])/$_To
   If $_Gmax = 0 Then $_G_step = - $_G_step
   $_B_step = ($RGB[$_Bmax][2] - $RGB[$_Bmin][2])/$_To
   If $_Bmax = 0 Then $_B_step = - $_B_step
   For $i = 1 To $_To
      $R = $RGB[0][0] + $_R_step*$i
      $G = $RGB[0][1] + $_G_step*$i
      $B = $RGB[0][2] + $_B_step*$i
      $Color = '0x'&StringFormat("%02X%02X%02X", Int($R), Int($G), Int($B))
      Call($_Func, $Color)
      Sleep(Int($_Sleep))
   Next
EndFunc
 

« Последнее редактирование: Сентябрь 05, 2018, 00:21:30 от musicstashall »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3973
  • Репутация: 1055
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #5, Отправлен: Сентябрь 05, 2018, 01:24:55 »
Так меньше кода
Код: AutoIt [Выделить]
Func _FlowColor($Color1, $Color2, $_To, $_Sleep, $_Func)
   Local $RGB1 = _ColorGetRGB($Color1)
   Local $RGB2 = _ColorGetRGB($Color2)
   Local $_R_step = ($RGB1[0] - $RGB2[0]) / $_To
   Local $_G_step = ($RGB1[1] - $RGB2[1]) / $_To
   Local $_B_step = ($RGB1[2] - $RGB2[2]) / $_To
   For $i = 1 To $_To
      $RGB1[0] -= $_R_step
      $RGB1[1] -= $_G_step
      $RGB1[2] -= $_B_step
      Call($_Func, Dec(StringFormat("%02X%02X%02X", $RGB1[0], $RGB1[1], $RGB1[2])))
      Sleep($_Sleep)
   Next
EndFunc


Только сейчас понял, о чём вы хотели спросить :)
« Последнее редактирование: Сентябрь 05, 2018, 02:26:46 от InnI »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 206

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #6, Отправлен: Сентябрь 05, 2018, 12:22:25 »
Код: AutoIt [Выделить]
Local $_R_step = ($RGB1[0] - $RGB2[0]) / $_To
Local $_G_step = ($RGB1[1] - $RGB2[1]) / $_To
Local $_B_step = ($RGB1[2] - $RGB2[2]) / $_To
 


А разве не важно, чтобы находить разницу между бо́льшим и меньшим значением, вычитая из бо́льшего меньшее? Но ведь работает  :laugh: Удивительно
Ах, ну да, понятно. Знак то меняется потом. Спс

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 206

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Плавный переход от одного цвета к другому
« Ответ #7, Отправлен: Сентябрь 10, 2018, 14:49:03 »
Еще усовершенствовал, сделал для многих цветов одновременно:

Код: AutoIt [Выделить]
#include <Color.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
Global $MATRIX[0][2], $__To = 0

Global $hGUI = GUICreate('', 300, 100)
Global $lab1 = GUICtrlCreateLabel('', 0, 0, 100, 100)
GUICtrlSetBkColor(-1, 0xf8640c)
Global $index1 = _AddColorsToMatrix(0xf8640c, 0x00ae57, 100)
Global $lab2 = GUICtrlCreateLabel('', 100, 0, 100, 100)
GUICtrlSetBkColor(-1, 0x0046ff)
Global $index2 = _AddColorsToMatrix(0x0046ff, 0xf8640c, 100)
Global $lab3 = GUICtrlCreateLabel('', 200, 0, 100, 100)
GUICtrlSetBkColor(-1, 0xd73539)
Global $index3 = _AddColorsToMatrix(0xd73539, 0x0000ff, 100)
GUISetState(@SW_SHOW, $hGUI)

_RunFlowMatrix('Flow', 50)

Func Flow($Color)
   ConsoleWrite($Color[$index1]&', '&$Color[$index2]&', '&$Color[$index3]&@CR)
   GUICtrlSetBkColor($lab1, $Color[$index1])
   GUICtrlSetBkColor($lab2, $Color[$index2])
   GUICtrlSetBkColor($lab3, $Color[$index3])
EndFunc

While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
            ExitLoop

   EndSwitch
WEnd


Func _AddColorsToMatrix($Color1, $Color2, $_To)
    Local $RGB1 = _ColorGetRGB($Color1)
    Local $RGB2 = _ColorGetRGB($Color2)
    Local $_step[3]
    $__To = $_To
    For $i = 0 To 2
        $_step[$i] = ($RGB1[$i] - $RGB2[$i]) / $__To
    Next
    Return _ArrayAdd($MATRIX, _ArrayToString($RGB1)&'::'&_ArrayToString($_step), Default, '::')
EndFunc

Func _RunFlowMatrix($__Func, $_Sleep)
    Local $_Color[0], $_RGB, $_step
    For $i = 0 To $__To
        For $a = 0 To UBound($MATRIX) - 1
            $_RGB = StringSplit($MATRIX[$a][0], '|', $STR_NOCOUNT)
            $_step = StringSplit($MATRIX[$a][1], '|', $STR_NOCOUNT)
            For $j = 0 To 2
                $_RGB[$j] -= $_step[$j]
                If $_RGB[$j] < 0 Then $_RGB[$j] = 0
                If $_RGB[$j] > 255 Then $_RGB[$j] = 255
            Next
            $MATRIX[$a][0] = _ArrayToString($_RGB)
            _ArrayAdd($_Color, '0x'&StringFormat("%02X%02X%02X", Int($_RGB[0]), Int($_RGB[1]), Int($_RGB[2])))
        Next
        Call($__Func, $_Color)
        Sleep($_Sleep)
        Dim $_Color[0]
    Next
    Dim $MATRIX[0][2], $__To = 0
EndFunc
 


Русское сообщество AutoIt

Re: Плавный переход от одного цвета к другому
« Ответ #7 Отправлен: Сентябрь 10, 2018, 14:49:03 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
8 Ответов
4920 Просмотров
Последний ответ Март 21, 2011, 15:40:25
от Kaster
3 Ответов
2925 Просмотров
Последний ответ Ноябрь 04, 2011, 12:37:24
от mini
2 Ответов
2524 Просмотров
Последний ответ Апрель 30, 2013, 22:32:03
от AZJIO
13 Ответов
7856 Просмотров
Последний ответ Сентябрь 05, 2013, 18:01:40
от InnI
5 Ответов
9363 Просмотров
Последний ответ Апрель 27, 2015, 22:49:08
от Afonichev
3 Ответов
1389 Просмотров
Последний ответ Июль 07, 2015, 11:48:43
от InnI
19 Ответов
4754 Просмотров
Последний ответ Май 21, 2016, 12:32:41
от valldar
14 Ответов
4440 Просмотров
Последний ответ Март 31, 2016, 10:56:09
от Alofa
6 Ответов
2049 Просмотров
Последний ответ Декабрь 29, 2016, 02:48:06
от Dessan
0 Ответов
272 Просмотров
Последний ответ Март 30, 2018, 13:03:33
от Cytrus