Форум: "Прочее";
Текущий архив: 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