Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.11.10;
Скачать: [xml.tar.bz2];

Вниз

Плавно преобразовать один цвет в другой.   Найти похожие ветки 

 
О-Сознание   (2013-05-25 17:09) [0]

Есть цвет, допустим красный.
Нужно его преобразовать в фиолетовый.
Плавно, прогресс в процентах.

Думаю, нужно разбить цвет на каналы.
Потом найти максимальные и минимальные каналы соответственно.

А потом, что потом?


 
Rouse_ ©   (2013-05-25 17:33) [1]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls;

type
 TForm1 = class(TForm)
   TrackBar1: TTrackBar;
   procedure FormCreate(Sender: TObject);
   procedure TrackBar1Change(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

const
 StartColor: TColor = $FF;
 EndColor: TColor = $FF00FF;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TrackBar1.Max := 100;
 TrackBar1.Min := 1;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);

 function RoundByte(Value: Integer): Integer;
 begin
   Result := Value;
   if Value < 0 then
     Result := 0;
   if Value > 255 then
     Result := 255;
 end;

begin
 Color := RGB(
   RoundByte(
     MulDiv(GetRValue(StartColor), 100 - TrackBar1.Position, 100) +
     MulDiv(GetRValue(EndColor), TrackBar1.Position, 100)),
   RoundByte(
     MulDiv(GetGValue(StartColor), 100 - TrackBar1.Position, 100) +
     MulDiv(GetGValue(EndColor), TrackBar1.Position, 100)),
   RoundByte(
     MulDiv(GetBValue(StartColor), 100 - TrackBar1.Position, 100) +
     MulDiv(GetBValue(EndColor), TrackBar1.Position, 100)));
end;

end.


 
Pavia ©   (2013-05-25 18:11) [2]

Линейное интерполирование
C(t) = (1-t)*A+t*B
Здесь t принимает значения от 0 до 1.


 
robt5   (2013-05-25 18:17) [3]

Иисус называл это градиентом


 
О-Сознание   (2013-05-25 20:35) [4]


> Pavia ©   (25.05.13 18:11) [2]


Неоптимально, лучше так:


  return cx + s*(cy - cx);


 
О-Сознание   (2013-05-25 20:43) [5]


> robt5   (25.05.13 18:17) [3]
>
> Иисус называл это градиентом


Градиент - это когда изображены все цвета.
У нас чистое преобразование от одного к другому, от одного к другому...


 
Dimka Maslov ©   (2013-05-25 20:55) [6]


> Градиент - это когда изображены все цвета.
> У нас чистое преобразование от одного к другому, от одного
> к другому...


Формула линейной интерполяции от этого не меняется.


 
robt5   (2013-05-25 21:10) [7]


> О-Сознание   (25.05.13 20:43) [5]

это и есть линейный градиент
фотошоп слышал, не ?


 
Pavia ©   (2013-05-25 21:37) [8]


> Неоптимально, лучше так:   return cx + s*(cy - cx);

Тогда уж и от умножение избавиться.
Inc(A,dx);


> Градиент - это когда изображены все цвета.

Нет. Читайте определения градиента.


 
О-Сознание   (2013-05-25 21:54) [9]


> Dimka Maslov ©   (25.05.13 20:55) [6]
>
>
> > Градиент - это когда изображены все цвета.
> > У нас чистое преобразование от одного к другому, от одного
> > к другому...
>
>
> Формула линейной интерполяции от этого не меняется.


Я про линейную интерполяцию разве говорил?


> robt5   (25.05.13 21:10) [7]
>
>
> > О-Сознание   (25.05.13 20:43) [5]
>
> это и есть линейный градиент
> фотошоп слышал, не ?


Слышал.
Градиент это вот это:

http://phot-style.ru/osnovy-photoshop/obzor-instrumentov-photoshop/instrumenty-risovaniya-v-fotoshope-chast-2-gradient-gradient.htmlh=775&facrc=_&imgrc=5yvB5iItKw8u7M%3A%3B7LVo84cQqNmqjM%3Bhttp%253A%252F%252Fphot-style.ru%252Fwp-content%252Fuploads%252F2012%252F06%252Fgradient-v-fotoshope-3.png%3Bhttp%253A%252F%252Fphot-style.ru%252Fosnovy-photoshop%252Fobzor-instrumentov-photoshop%252Finstrumenty-risovaniya-v-fotoshope-chast-2-gradient-gradient.html%3B200%3B200

А у меня плавный морфинг цвета от одного к другому.

> Pavia ©   (25.05.13 21:37) [8]
> Нет. Читайте определения градиента.

Изображены все цвета "от одного к другому" имелось в виду.


 
Eraser ©   (2013-05-25 21:55) [10]


> О-Сознание   (25.05.13 17:09) 

вот сегодняшняя статья http://habrahabr.ru/post/180839/


 
О-Сознание   (2013-05-25 22:15) [11]


> Pavia ©   (25.05.13 21:37) [8]
>
>
> > Неоптимально, лучше так:   return cx + s*(cy - cx);
>
> Тогда уж и от умножение избавиться.
> Inc(A,dx);


Объясните, пожалуйста.


 
Dimka Maslov ©   (2013-05-25 22:21) [12]


> Я про линейную интерполяцию разве говорил?


Пересчёт перехода одного цвета в другой производится при помощи линейной интерполяции и ничего более того.


 
Rouse_ ©   (2013-05-25 22:30) [13]


> А у меня плавный морфинг цвета от одного к другому.

Ну а я тебе что показал, не плавный "морфинг"?


 
Pavia ©   (2013-05-25 22:43) [14]


> > Inc(A,dx);Объясните, пожалуйста.

Новое значение цвета можно получить из старого путём прибавления константы.
Константы можно вычислить через ряд Тейлора.  Для линейного интерполирования ясно что разложение ограничено одним членом ряда. Поэтому достаточно одного коэффициента. Если будешь брать другую функцию, то ряд Тейлора можно ограничить 3 коэффициентами.


 
Аббат Пиккола   (2013-05-26 00:25) [15]

Вообще-то от одного цвета к другому существует более, чем 1 путь.


 
Аббат Пиккола   (2013-05-26 00:27) [16]

Возьмем цветовой треугольник. На его вершинах - чистые RGB. В центре - белый. Два цвета это 2 точки на плоскости. Между этими двумя точками можно провести сколько угодно путей. Плавных.
О чем вообще здесь толкуют?


 
Inovet ©   (2013-05-26 08:11) [17]

> [16] Аббат Пиккола   (26.05.13 00:27)
> О чем вообще здесь толкуют?

О кратчайшем?


 
О-Сознание   (2013-05-26 11:03) [18]


> Rouse_ ©   (25.05.13 22:30) [13]
>
>
> > А у меня плавный морфинг цвета от одного к другому.
>
> Ну а я тебе что показал, не плавный "морфинг"?


Я и не говорил такого. :)


 
Аббат Пиккола   (2013-05-26 12:52) [19]

>Inovet ©   (26.05.13 08:11) [17]

> [16] Аббат Пиккола   (26.05.13 00:27)
> О чем вообще здесь толкуют?

>О кратчайшем?

Допустим, мы хотим "плавно перейти" от зеленого к пурпурному. Мы можем "обойти" треугольник по периметру. К тому же по или против часовой стрелки. В одном случае мы последовательно перейдем от насыщенного зеленого к насыщенному голубому, затем насыщенному фиолетовому и потом к насыщенному пурпурному. Или мы можем пойти к насыщенному желтому, затем к насыщенному красному и затем подойти к насыщенному пурпурному. Названий цветов там больше, я упомянул лишь часть. Важно то, что мы имеем 2 пути через насыщенные цвета.

Другой вариант - движемся напрямую. Через белый, в данном случае. Сначала насыщенность зеленого падает до нуля, затем от нуля растет насыщенность пурпурного.

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

В любом случае я вижу несколько решений для такой задачи. И сначала автор вопроса должен, ИМХО, точно решить, чего он он хочет конкретно. А уже реализация вытекает из этого решения и некоторого знакомства с цветовым треугольником.


 
Аббат Пиккола   (2013-05-26 12:54) [20]

Я к тому, что нет здесь "стандартного решения". Решений может быть много и для начала нужно выбрать, что именно надо.


 
Inovet ©   (2013-05-26 12:55) [21]

> [19] Аббат Пиккола   (26.05.13 12:52)

Ну так и что, пусть проходит через них. В условии ничего не сказано об этом. Можно взять треугольник в другом цветовом пространстве.


 
Inovet ©   (2013-05-26 12:56) [22]

> [20] Аббат Пиккола   (26.05.13 12:54)

Да я понял.


 
Exception   (2013-05-26 13:54) [23]

FireMonkey, TColorAnimation, одних только интерполяций более десятка.


 
asail ©   (2013-05-27 02:15) [24]


> Exception   (26.05.13 13:54) [23]
> FireMonkey, TColorAnimation, одних только интерполяций более
> десятка.

Куда ж без них, да на iOS?.. :)


 
О-Сознание   (2013-05-27 10:12) [25]


> Exception   (26.05.13 13:54) [23]
>
> FireMonkey, TColorAnimation


Гуглил, но не нашел исходники этого класса.
Где их взять? Я их хочу в D7 использовать.


 
Jeer ©   (2013-05-27 15:39) [26]

Удалено модератором


 
Exception   (2013-05-27 16:25) [27]

> asail ©   (27.05.13 02:15) [24]

Win 32/64, Mac OS, iOS

> О-Сознание   (27.05.13 10:12) [25]
> Я их хочу в D7 использовать.


А, так бы сразу и говорили!
Значит так, берете палитру, кисть, из тюбиков выдавливаете на палитру небольшое количество краски, и круговыми движениями кисти производите перемешивание двух красок до получения нужного оттенка. Получившимся колором зарисовываете форму Delphi 7, прямо по экрану монитора.
Решение универсальное, подходит для Delphi 7, 6, 5, 4, 3, 2, 1, Windows 98, 95, 3.11, 3.1, 3.0, 2.0, 1.0, Dendy, Atari, ZX Spectrum и стены в подъезде.


 
О-Сознание   (2013-05-27 16:37) [28]


> Exception   (27.05.13 16:25) [27]
>
> А, так бы сразу и говорили!


Не, я серьезно.
Исходник TColorAnimation найти не могу...



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.11.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
15-1369703482
Сергей
2013-05-28 05:11
2013.11.10
Нормализованое число


6-1269002967
Domkrat
2010-03-19 15:49
2013.11.10
Login на Google


2-1360084342
Tcount
2013-02-05 21:12
2013.11.10
Авторизация ВКонтакте


15-1366604147
Sergey Masloff
2013-04-22 08:15
2013.11.10
куда пойти учиться


15-1369324793
Rouse_
2013-05-23 19:59
2013.11.10
Ничего так замиксовали :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский