Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,
в которых можно было бы выставить имеющиеся (R,G,B)
и поменять их значениями, типа - цвет, яркость, контрастность.
Поэтому попытался написать свои в этой программе...
Программа (формулы - в окошке, снизу по центру "оставить галочку на - поменять цвет RGB")
С кодом дружу плохо, все тормозит и антивирусники ругаются..
Может кто-то знает нормальные "формулы"?
Заранее благодарен...

К сообщению приложен файл (! Поменять цвет (R,G,B).docx - 26Kb) cкачать
8 авг 18, 09:49    [21633841]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68


К сообщению приложен файл (Поменять цвет (R,G,B).docx - 26Kb) cкачать
8 авг 18, 09:54    [21633850]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 507
Из Гугла:

Яркость (стандартная для определенных цветовых пространств): (0.2126*R + 0.7152*G + 0.0722*B)
Luminance (вариант 1): (0.299*R + 0.587*G + 0.114*B)
Luminance (вариант 2, медленнее для вычисления): sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 ) или
sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)

Судя по обсуждениям, 3-я формула наиболее точная.

Остальные формулы найдете в Гугле сами.
8 авг 18, 10:17    [21633915]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
Это новый вирус такой - через docx распространяется ?
8 авг 18, 10:30    [21633950]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4499
GraphUtil.ColorRGBToHLS
GraphUtil.ColorHLSToRGB
8 авг 18, 10:39    [21633969]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
d7i,
Ну вот я подставлю свои значения R,G,B в эту формулу
"sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)"
А как сделать яркость больше, меньше?
8 авг 18, 10:40    [21633976]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Kazantsev Alexey,
Не программным способом, а с помощью формул
8 авг 18, 10:46    [21633985]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
schi,
После скачивания вордовского документа, у него почему-то теряется формат.
В имени файла дописываю .docx и тогда открывается..
8 авг 18, 10:51    [21633995]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Прошу прощения, вордовский документ в виде изображения пытался загрузить.. :\
Поменять цвет (R,G,B)
8 авг 18, 11:00    [21634017]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4499
Ученик_333
Не программным способом, а с помощью формул

Посмотри на реализацию этих методов, там и найдёшь формулы.
8 авг 18, 11:03    [21634023]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 507
Ученик_333
d7i,
Ну вот я подставлю свои значения R,G,B в эту формулу
"sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)"
А как сделать яркость больше, меньше?


Вычисляем текущую яркость:
Y=sqrt(0.299*R^2 + 0.587*G^2 + 0.114*B^2);

Измененная яркость (умноженная на коэффициент К):
Y1=K*sqrt(0.299*R^2 + 0.587*G^2 + 0.114*B^2);

Значение Y1 нам известно.

Вычисляем новые значения RGB и устанавливаем их.
Как быстрее и точнее вычислить - ищите в Гугле.
Там всё есть, только искать надо уметь.

От себя: в данной задаче легче будет работать через HLS-модель, а не RGB.
Формулы преобразований моделей найдете в интернете. Заодно изучите вопрос о цвете в общем.
Там не всё так просто...
Творите.
8 авг 18, 11:15    [21634036]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Arioch
Member

Откуда:
Сообщений: 11101
Ученик_333
Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,


надо было Википедию почитать что ли....
8 авг 18, 11:24    [21634045]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12762
d7i
Судя по обсуждениям, 3-я формула наиболее точная.
Сомнительно это очень.
Все формулы - ни что иное, как попытка адаптации под психофизику человеческого зрения. И там все должно быть линейно, эвклидовой метрики неоткуда взяться.
8 авг 18, 12:20    [21634148]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Сергей N
Member

Откуда: отсюда
Сообщений: 69
[quot Соколинский Борис]
d7i
эвклидовой метрики неоткуда взяться.


В приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход. Можно нашлепать и еще формулы:

 function RGBMultiLuminance(Color: TColor; Mode: Byte): integer;
begin
  with LongRec(ColorToRGB(Color)) do
    case Mode of
      // Быстрая R:= Round(0.299 * Bytes[0] + 0.587 * Bytes[1] + 0.114 * Bytes[2]);
      0: Result:= (306 * Bytes[0] + 601 * Bytes[1] + 117 * Bytes[2] + 511) shr 10;
      // Быстрая R:= Round(0.2126 * Bytes[0] + 0.7152 * Bytes[1] + 0.0722 * Bytes[2]);
      1: Result:= (3483 * Bytes[0] + 11718 * Bytes[1] + 1183 * Bytes[2] + 8191) shr 14;
      // Медленная функция
      2: Result:= Round(SqrtX(0.299*Bytes[0]*Bytes[0] + 0.587*Bytes[1]*Bytes[1] + 0.114*Bytes[2]*Bytes[2]));
      // Медленная
      3: Result:= Round(SqrtX(0.241*Bytes[0]*Bytes[0] + 0.691*Bytes[1]*Bytes[1] + 0.068*Bytes[2]*Bytes[2]));
      // Медленная
      4: Result:= Round(SqrtX(0.2126*Bytes[0]*Bytes[0] + 0.7152*Bytes[1]*Bytes[1] + 0.0722*Bytes[2]*Bytes[2]));
      // Медленная уточненная
      5: Result:= Round(SqrtX(0.312161399548533*Bytes[0]*Bytes[0] + 0.612838600451467*Bytes[1]*Bytes[1] + 0.075*Bytes[2]*Bytes[2]));
      // Медленная уточненная
      6: Result:= Round(SqrtX(0.322285553*Bytes[0]*Bytes[0] + 0.632714447*Bytes[1]*Bytes[1] + 0.045*Bytes[2]*Bytes[2]));
      // Медленная уточненная
      7: Result:= Round(SqrtX(0.31*Bytes[0]*Bytes[0] + 0.639*Bytes[1]*Bytes[1] + 0.051*Bytes[2]*Bytes[2]));
    else
      Result:= (306 * Bytes[0] + 601 * Bytes[1] + 117 * Bytes[2] + 511) shr 10;
    end;
end;


Я, например, на практике для уточнения коэффициентов использовал метод минимального контраста с серым, рассчитанная яркость которого равна рассчитанной яркости исходного цвета (нужен калиброванный экран). (Почему-то не получается вставить картинку).
Чтобы не ломать голову, для изменения яркости в процентах вполне подходит функция ColorAdjustLuma (external 'Shlwapi.dll', примеры поищите в интернете).

К сообщению приложен файл. Размер - 100Kb
8 авг 18, 13:06    [21634271]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
Контрастность не может быть применена к цвету, если что. Контрастность - это отношение яркости, как минимум, двух цветов. Про оттенок и яркость уже сказали - их всяко удобно менять в HLS
8 авг 18, 13:34    [21634330]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12762
Сергей N
В приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход.
Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, поэтому простые линейные формулы тоже плохо работают).
8 авг 18, 13:48    [21634365]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 507
Вот теперь Ученик_333, наверное, уже понял во что он вляпался...
Работа с цветом и его характеристиками не очень простая. Там не только несколько моделей, но ещё
и кучу цветовых профилей нужно использовать применительно к целевому устройству и назначению.
Достаточно посмотреть на всю эту кухню , к примеру, в фотошопе, чтобы убедится что это далеко не травиальная задача,
которая сводится к паре формул...
8 авг 18, 13:57    [21634383]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Нужны формулы элементарно разжеванные как здесь, !поставил свои значения и ковыряешься в носу!....
У меня процедура получилась очень большая, есть ли что-то подобное, только компактнее? (В виде формул! + - все дела)

Красным вы вводите нужное вам значение, синим выделен полученный на выходе результат...

R := вставить число от 0 до 255; G := … ; B := … ; // Свое значение "RGB"
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета
E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;
Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости "Light"
Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду "Z"
Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1 
          (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1 
          (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1 
Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки 
Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// Координата по оси X, на общей сетке координат
//--------------------------------------------------------Противоположное значение цвета -------------------------------------------------------------
// "не обязательно" Чтобы найти значение цвета через определенный промежуток - прибавить число от +1 до +1529
// Xmain := Xmain + вставить число от 1 до 1529;
// Lc := Trunc(Xmain/1530); // Если Xmain>1529, то Lc=1, иначе Lc=0
// Xmain := Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall := Xmain+1;
//-----------------------------------------------------------------------Поменять «Цвет» -------------------------------------------------------------------- 
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
  //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529

// Чтобы оставить знач. цвета в прежнем состоянии (Xall = Xmain+1)
Xall := вставить число от 0 до 1531; // Поменять Цвет (Координата выбранной ячейки с цветом, по оси X)
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду "Z"
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
  Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
  Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
 SkipRow1 := Trunc((127-Z)/126)*(D*2)*(1-Lc);  // При D=0,5 и Z=1, SkipRow1=1, иначе 0
Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет - на контрастности Z
   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));         Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));
//------------------------------------------------Поменять значения «Яркость» - «Контрастность» ------------------------------------------------

// Чтобы оставить знач. яркости в прежнем состоянии (Yarkost = Light*2)
Yarkost := вставить число от 0 до 508 / 2; // Поменять Яркость
// Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
Zcontrast := вставить число от 0 до 127; // Поменять Контрастность
D := Yarkost-Trunc(Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
Yarkost := Trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости "Yarkost"
Lc := 1-Ceil(((127-Zcontrast)-Zmax)/128); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := (127-Zcontrast)*Lc + Zmax*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
 Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0

// Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже 
Zero := 1-Ceil(Zmax/127); // Переменная, для исключения деления на ноль
Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
//------------------------------------Установить ограничение по контрастности (не обязательно)----------------------------------------------
// Zmainmax2 := trunc(127-Zmax);  // Минимальное значение контраст., на заданной яркости "Yarkost"
//---------------Ниже, можно использовать формулы, по отдельности для - «Яркость-Контрастность» или «Цвет»---------------
 Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы "k" в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), "k"=0
 k := (1/(Y1+Zero2))* (Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Z)
 Y2 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)

 Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)

 Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast 

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254); 
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;      RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y2/2)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

// Результат "RGB" Сопоставить полученные результаты (RGBmid, RGBmin, RGBmax) с (R, G, B)
R:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
G:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
B:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
// Переменные
R, G, B : byte;
RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
Light, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
Zero, Zero2, k, Y2, Xc2, Z, Zcontrast,
Yarkost, Lc, Zmax, Zmax2, NoRow254,
RGBmax2, RGBmin2, RGBmid2, Xmain,
Xall, Xall2, Xx, Xx2, Xborder, Xout,
SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid : Extended;


Небольшая программка с примером конкретно этих формул (вместе с исходниками "Delphi")

Большая программа, понапихано все подряд (без исходников)
Большая программа, понапихано все подряд (с исходниками "Delphi")

К сообщению приложен файл. Размер - 108Kb
8 авг 18, 15:42    [21634586]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Arioch
Member

Откуда:
Сообщений: 11101
schi
Контрастность - это отношение яркости, как минимум, двух цветов

Сергей N
метод минимального контраста с серым


что не так?
8 авг 18, 19:25    [21634908]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6010
Соколинский Борис
Сергей N
В приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход.
Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, ...).

В плане физики вроде норм, это не расстояние, это энергия. У каждого цвета свой диапазон длин волн и соответственно энергия. Весь вопрос в нормировочных коэффициентах и их корректировке в плане физиологии человеческого глаза
9 авг 18, 08:49    [21635355]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12762
kealon(Ruslan),
Энергия - скаляр, а формула явно для векторов.
ЕМНИП, правильная формула все же линейная, но с переменными крэффициентами, которые зависят от точки белого (white point), а она тоже может плавать.
9 авг 18, 09:20    [21635397]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6010
Соколинский Борис,

это да, но у каждого цвета своя энергия, а спектр по цветам и есть вектор
9 авг 18, 10:40    [21635524]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Сергей N
Member

Откуда: отсюда
Сообщений: 69
Соколинский Борис
kealon(Ruslan),
правильная формула все же линейная, но с переменными крэффициентами, которые зависят от точки белого (white point), а она тоже может плавать.


По сути, Вы говорите об относительном сером цвете с максимальной яркостью (термин не очень подходит) для данного источника (монитора). Про зависимость от точки белого я согласен, но, к сожалению, мне не удалось свести с приемлемой точностью известные линейные функции с визуальной сравнительной оценкой соответствующего серого цвета. Мой опыт дал противоположный результат. Гораздо быстрее удавалось свести квадратичные функции (энергетические или интенсивностные). Так что я согласен с kealon.
9 авг 18, 11:21    [21635632]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Kazantsev Alexey
GraphUtil.ColorRGBToHLS GraphUtil.ColorHLSToRGB

schi
Про оттенок и яркость уже сказали - их всяко удобно менять в HLS

HLS модель не подходит, т.к. хотелось бы работать со всеми имеющимися цветами без потерь...
Из-за введенных констант в формулах типа - (Y = 0.299 * R + 0.587 * G + 0.114 * B)
нет уверенности, что учитывается весь диапазон цвета (16 777 216 цветов).
В этой программе я расставил все цвета таким образом, чтобы они не терялись и не повторялись...
(каждый, конечно, не проверял, но вроде бы все на своих местах)
Только в формулах очень много лишнего, если постараться, то можно написать и покороче, но я не математик...
Arioch
надо было Википедию почитать что ли....

d7i
ищите в Гугле. Там всё есть

Еще раз перелопатил весь интернет в поисках нужного алгоритма,
но опять столкнулся с тем, что в каждой найденной теме используются константы.
Очевидно - глаза у всех видят по разному, а значит что и константа нужна лишь затем,
чтобы сформировать конкретный диапазон цвета, под конкретного человека
+ нужно учитывать, что каждый монитор показывает цвета по разному,
так что смысл не в том, чтобы подгонять цвета под константы, а в том, чтобы
расставить их в таком порядке, в каком они используются в природе.
(та же радуга к примеру или преломление света через призму)
(1 0 0) (255 0 0) (255 254 254) - Красный (темный,чистый,светлый)
(1 1 0) (255 255 0) (255 255 254) - Желтый (темный,чистый,светлый)
(0 1 0) (0 255 0) (254 255 254) - Зеленый (темный,чистый,светлый)
(0 1 1) (0 255 255) (254 255 255) - Голубой (темный,чистый,светлый)
(0 0 1) (0 0 255) (254 254 255) - Синий (темный,чистый,светлый)
(1 0 1) (255 0 255) (255 254 255) - Фиолетовый (темный,чистый,светлый)

К сообщению приложен файл. Размер - 129Kb
22 авг 18, 10:51    [21650405]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 507
Относительно "радуги" лично у меня имеются большие сомнения...
Там один цвет (голубой) явно притянут за уши.
Судите сами: есть 3 основных цвета - красный,желтый,синий. И между ними 3 дополнительных (смеси соседних):
красный+желтый=оранжевый
желтый+синий=зеленый
синий+красный=фиолетовый
Итого имеем: красный-оранжевый-желтый-зеленый-синий-фиолетовый
Голубой сюда просто не вписывается, так как является частью синего.

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

Так что не всё так просто и от формул с коэффициентами избавиться не удастся, так как все формулы
адаптированы под человека. Можете их упростить, но тогда они будут под непонятно кого.
Может для робота-андроида сгодятся, если его зрение будет работать именно по этим формулам.
22 авг 18, 11:31    [21650472]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
Ученик_333,

http://koi.tspu.ru/kg/lab.htm ?
22 авг 18, 11:52    [21650503]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
d7i, Да видимо от формул с коэффициентами действительно избавиться не удастся...
schi
Ученик_333, http://koi.tspu.ru/kg/lab.htm ?

Благодарю за полезную информацию
22 авг 18, 16:50    [21651030]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Если кому-то понадобится создать собственную библиотеку цвета, и работать с ней в других проектах, то эта программа, как вариант, может оказаться полезной.
Видео - как пользоваться программой "TheColors":
2 май 19, 09:13    [21876687]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Все файлы: https://cloud.mail.ru/public/QqDf/4uginZwkh

Ссылка на программу "TheColors" (С Исходниками Delphi):
https://cloud.mail.ru/public/ruVt/XGH1GzycE
Ссылка на программу "TheColors" (Без Исходников Delphi):
https://cloud.mail.ru/public/4YLA/5MbBBNr8J

Ссылка на программу "All Brights":
https://cloud.mail.ru/public/3nwq/wJnqUXLPL

Ссылка на программу "Проверка цвета" (Исходники с примером, о том как пользоваться библиотекой "AllBrights.txt", в своих проектах):
https://cloud.mail.ru/public/4JGr/5drg9Y51c
2 май 19, 09:39    [21876695]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Dimonka
Member

Откуда:
Сообщений: 1178
Мутная какая-то программа получилась. Без бутылки в ней фиг разберёшься.

Посмотри как другие с цветом работают:
https://color.adobe.com/create

Глядишь и свою программу упростишь для "простых" людей.
2 май 19, 12:15    [21876816]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Dimonka,

Учту, но мне до их уровня, еще учиться и учиться...
А пока дельное что-то состряпаю, глядишь кто-то из "простых" людей и с бутылкой разберется)
2 май 19, 13:00    [21876859]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Распознавание цвета по названию, через веб-камеру:

Файл: "AllBrights + Видео с веб-камеры": https://cloud.mail.ru/public/QqDf/4uginZwkh
8 май 19, 07:23    [21880571]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Черные, серые и белые оттенки:

Файл: "AllBrights + Видео с веб-камеры 2": https://cloud.mail.ru/public/2Y2S/48Kd3qmxB
13 май 19, 07:46    [21882970]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Ссылка на программу "TheColors_3d":
https://cloud.mail.ru/public/v6ke/VUW49t59v
Файлы "BrightLibrary.txt", "ColorsLibrary.txt", нужно пересохранять из "ANSI" в "UTF-8".
И в название добавить номер "BrightLibrary0.txt".

К сообщению приложен файл. Размер - 132Kb
25 окт 19, 15:20    [22002727]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Delphi:
+ Найти RGB по яркости, оттенку и контрастности
// uses  Math; // Для округления чисел


function RGB_ByBSC(NumOfBright,NumOfShade,NumOfContrast:integer;
                    out R,G,B:integer):boolean; // Найти RGB по яркости, оттенку и контрастности
var
// Переменные
Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
Zero2, k, Y2, Xc2, Zcontrast,
Yarkost, Lc, Zmax2, NoRow254,
RGBmax2, RGBmin2, RGBmid2,
Xall, Xall2, Xx, Xx2, Xborder, Xout, SkipRow1,
Qrgbmax, Qrgbmin, Qrgbmid : Extended;
begin
BGW := 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
//------------------------------------------------Поменять значения «Яркость» - «Контрастность» ----------------------------------------------
Yarkost := NumOfBright/2; // Яркость
Zcontrast := NumOfContrast; // Контрастность
D := Yarkost-Trunc(Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
Yarkost := trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'

Lc := 1-Ceil(((127-Zcontrast)-Zmax2)/128);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := (Zcontrast)*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контраст., за пределами Zmax2, то Zcontrast=Zmax2
//-----------------------------------------------------------------------Поменять «Цвет» --------------------------------------------------------------------
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
  //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
  Xall := NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
  Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
  Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
 SkipRow1 := Trunc((127-Zcontrast)/126)*(D*2)*(1-Lc);  // При D=0,5 и Z=1, SkipRow1=1, иначе 0

Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет (Координата по оси X, на общей сетке коорд.)

   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));
   Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));

//---------------Ниже, можно использовать формулы, по отдельности для - «Яркость-Контрастность» или «Цвет»-----------

Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Z)
 Y2 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)

 Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)

 //Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Коорд. по оси X, на общей сетке координат (Если не исп. формулы цвета)

 // Поменять значение оттенка, контрастности (если за пределами) ******************************
//  Main_NumOfShade := trunc(Xx+1); // Новый оттенок +1
//  Main_NumOfContrast := trunc(Zcontrast); // Новая контрастность
// ****************************************************************************

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254);
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y2/2)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
end;


procedure TForm3.Button1Click(Sender: TObject); // По нажатию кнопки
var
R,G,B, Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast : integer;
begin
 Main_NumOfBright := 254; // Яркость, от 0 до 508
 Main_NumOfShade := 127 + 1; // Оттенок, от 0 до 1529 +1
 Main_NumOfContrast := 0; // Контрастность, от 0 до 127

 // Найти RGB по яркости, оттенку и контрастности
 RGB_ByBSC(Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast,   R,G,B);
 Form3.Caption := 'R: '+inttostr(R)+'  G: '+inttostr(G)+'  B: '+inttostr(B);
end;
+ Яркость, оттенок, контрастность, по RGB
// uses  Math; // Для округления чисел


function BSC_ByRGB(R,G,B:integer;
              out NumOfBright,NumOfShade,NumOfContrast:integer):boolean; // Яркость, оттенок, контрастность, по RGB
var
//NumOfBright,NumOfShade,NumOfContrast : integer;
//R, G, B : integer;
RGBmax,RGBmin,RGBmid,Rm,Gm,Bm,
Light,BGW,D,E,Q,Zmax,Z,Qp,LR,Y1,Xc,Xmain: Extended;
begin
// R := … ;  G := … ;  B := … ;
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета
E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;
Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
          (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
          (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

NumOfBright := Trunc((Light+D)*2); // Яркость, от 0 до 508
NumOfShade := Trunc(Xmain+1); // Оттенок, от 0 до 1529 +1
NumOfContrast := Trunc(Z); // Контрастность, от 0 до 127
end;


procedure TForm3.Button1Click(Sender: TObject); // По нажатию кнопки
var
R,G,B, Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast : integer;
begin
 R := 255; G := 0; B := 0; // от 0 до 255

 // Яркость, оттенок, контрастность, по RGB
 BSC_ByRGB(R,G,B,  Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast);

 Form3.Caption := 'Яркость: '+inttostr(Main_NumOfBright)
  +'  Оттенок +1: '+inttostr(Main_NumOfShade)
  +'  Контрастность: '+inttostr(Main_NumOfContrast);
end;
+ Открыть файл ‘AllBrights.txt’
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  System.StrUtils, // Для замены строк AnsiReplace
  Math // Для округления чисел
  ;

type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

    procedure ColorInMass; // Загрузить свойства цвета из текстового документа

  private
    { Private declarations }
  public
    { Public declarations }
  end;


 ColorProperties = record // Свойства цвета
  BGW:byte;        // Если "R=G=B" то BGW=0, иначе BGW=1
  Bright:extended; // Яркость
  Shade:integer;   // Оттенок (Цвет)
  Contrast,        // Контрастность
  Triangle,        // Номер треугольника
  CountCell,       // Количество ячеек, в треугольнике, в ряду "Contrast"
  Cell             // Номер ячейки, в треугольнике, в ряду "Contrast"
 // CountRow         // Количество рядов, на яркости "Bright"
  :byte;
  Num,             // Номер цвета
  FullNum,         // Номер полного имени цвета
  R1,              // R1
  G1,              // G1
  B1,              // B1
  R2,              // R2
  G2,              // G2
  B2               // B2
  :integer;
  Name,            // Имя цвета
  FullName         // Полное имя цвета (по яркости)
  : string;
 end;

 ColorNum = record // Номер цвета
  Num,        // Xman - Оттенок (Координата по оси X, на общей сетке координат)
  Name,       // Номер названия цвета "Красный"
  FullName    // Номер полного названия цвета "Черный |с красным оттенком|"
  :Integer;
 end;


var
  Form3: TForm3;
  Edit1 : TEdit; // Текстовое поле "R"
  Edit2 : TEdit; // Текстовое поле "G"
  Edit3 : TEdit; // Текстовое поле "B"
  Button1 : TButton; // Кнопка
  Memo1 : TMemo; // Текстовое поле "Свойства цвета"
  Image1 : TImage; // Изображение

  ColorProperty : array of array of ColorNum; // Номер цвета
  NameOfColor : array of array of string; // Название цвета по номеру
  RGB_OfColor : array of array of array of integer;  // RGB цвета по номеру
  CountOfColors0 : integer; // Количество цветов

implementation

{$R *.dfm}


procedure TForm3.ColorInMass; // Загрузить свойства цвета из текстового документа
var
LoadColor:TStringList;
Pp1,Pp2,i,l,Pp1a,Pp2a,
Pp1b,Pp2b,Pp1c,Pp2c,
Pp1d,Pp2d,Pp1e,Pp2e,
Pp1f,Pp2f,Pp1g,Pp2g,Pp1h,Pp2h,n5,n6,n7,
LastPart1,LastPart2,D,D2,TheBright,
TheContrast,NumberLine,maxNumOfColor:integer;
s,ss,LoadColorS:string;
begin
 if FileExists(GetCurrentDir+'\AllBrights.txt') then // Если выбранный файл существует
 begin
  LoadColor:=TStringList.Create;
  LoadColor.LoadFromFile(GetCurrentDir+'\AllBrights.txt'); // Открыть текстовый документ

  LoadColorS := LoadColor.Text;

 // ДЛИНА МАССИВА //////////////////////////////////////////////////////////////
  Pp1 := AnsiPos('(Количество названий=',LoadColorS);
  Pp2 := PosEx(')',LoadColorS,Pp1+1);

  if (Pp1>0) and (Pp2>0) then
  begin
   l := length('(Количество названий=');
   CountOfColors0 := strtointdef(copy(LoadColorS,Pp1+l,Pp2-Pp1-l),1);

   setlength(ColorProperty,32896,CountOfColors0); // Указать длину массива "ColorProperty"
  end;

 // НАЗВАНИЯ ЦВЕТА В МАССИВ "NameOfColor" //////////////////////////////////////

  LastPart1 := 0;
  Pp1 := AnsiPos('Название цвета по номеру: (Количество названий=',LoadColorS);
  Pp2 := PosEx('Массив значений: ***********************',LoadColorS,Pp1);

  if (Pp1>0) and (Pp2>0) then
  begin
   s := copy(LoadColorS,Pp1,Pp2-Pp1);

   Pp1a := 1;
   maxNumOfColor := 0; // Максимальное количество полных названий цвета
   repeat
    Pp1a := AnsiPos('_' + inttostr(maxNumOfColor) + '_',s);
    if (Pp1a > 0) then
    maxNumOfColor := maxNumOfColor + 1;
   until (Pp1a = 0);
   maxNumOfColor := maxNumOfColor + 1;
   setlength(NameOfColor,CountOfColors0,maxNumOfColor); // Указать длину массива, названий
   setlength(RGB_OfColor,CountOfColors0,maxNumOfColor,3); // Указать длину массива, RGB 'RGB_OfColor'

   Pp1a := PosEx('('+inttostr(LastPart1)+') ''',s,1);
   Pp2a := PosEx('('+inttostr(LastPart1+1)+') ''',s,Pp1a+1);
   if Pp2a=0 then Pp2a := s.Length;

   repeat
    if (Pp1a>0) and (Pp2a>0) then
    begin
     LastPart2 := 0;

     Pp1b := PosEx('_'+inttostr(LastPart2)+'_ ''',s,Pp1a);
     Pp2b := PosEx('_'+inttostr(LastPart2+1)+'_ ''',s,Pp1b+1);
     if (Pp2b=0) or (Pp2b>Pp2a) then Pp2b := Pp2a;

     if (Pp1b>0) and (Pp2b>0) then
     begin
      ss := copy(s,Pp1a,Pp1b-Pp1a-2);
      Pp1c := PosEx('''',ss,1);
      Pp2c := ss.Length-PosEx('''',AnsiReverseString(ss),1) +1;
      NameOfColor[LastPart1,0] := copy(ss,Pp1c+1,Pp2c-Pp1c-1);
     end;

     repeat
      LastPart2 := LastPart2+1;
      if (Pp1b>0) and (Pp2b>0) then
      begin
       ss := copy(s,Pp1b,Pp2b-Pp1b-2);
       Pp1c := PosEx('''',ss,1);
       Pp2c := ss.Length-PosEx('''',AnsiReverseString(ss),1) +1;
       NameOfColor[LastPart1,LastPart2] := copy(ss,Pp1c+1,Pp2c-Pp1c-1);
      end;

      Pp1b := Pp2b;
      Pp2b := PosEx('_'+inttostr(LastPart2+1)+'_ ''',s,Pp1b+1);
      if (Pp2b=0) or (Pp2b>Pp2a) then Pp2b := Pp2a;
     until (Pp1b=0) or (Pp2b=0) or (Pp1b=Pp2b);
    end;

    LastPart1 := LastPart1+1;
    Pp1a := Pp2a;
    Pp2a := PosEx('('+inttostr(LastPart1+1)+') ''',s,Pp1a+1);

    if Pp2a=0 then Pp2a := s.Length;
   until (Pp1a=0) or (Pp2a=0) or (Pp1a=Pp2a);
  end;


	// RGB ЦВЕТА В МАССИВ 'RGB_OfColor' //////////////////////////////////////
  LastPart1 := 0;
  Pp1 := AnsiPos('RGB по номеру: (Количество названий=',LoadColorS);
  Pp2 := PosEx('Название цвета по номеру: (Количество названий=',LoadColorS,Pp1);

  if (Pp1>0) and (Pp2>0) then
  begin
   s := copy(LoadColorS,Pp1,Pp2-Pp1);

   Pp1a := PosEx('('+inttostr(LastPart1)+') ''',s,1);
   Pp2a := PosEx('('+inttostr(LastPart1+1)+') ''',s,Pp1a+1);
   if Pp2a=0 then Pp2a := s.Length;

   repeat
    if (Pp1a>0) and (Pp2a>0) then
    begin
     LastPart2 := 0;

     Pp1b := PosEx('_'+inttostr(LastPart2)+'_ ''',s,Pp1a);
     Pp2b := PosEx('_'+inttostr(LastPart2+1)+'_ ''',s,Pp1b+1);
     if (Pp2b=0) or (Pp2b>Pp2a) then Pp2b := Pp2a;

     if (Pp1b>0) and (Pp2b>0) then
     begin
      ss := copy(s,Pp1a,Pp1b-Pp1a-2);
      Pp1c := PosEx('''',ss,1);
      Pp2c := ss.Length-PosEx('''',AnsiReverseString(ss),1) +1;
      ss := copy(ss,Pp1c+1,Pp2c-Pp1c-1);
      Pp1c := PosEx('R',ss,1);
      Pp2c := PosEx('G',ss,1);
      RGB_OfColor[LastPart1,0,0] := strtointdef(copy(ss,Pp1c+1,Pp2c-Pp1c-1),0);
      Pp1c := PosEx('B',ss,1);
      RGB_OfColor[LastPart1,0,1] := strtointdef(copy(ss,Pp2c+1,Pp1c-Pp2c-1),0);
      Pp2c := ss.Length+1;
      RGB_OfColor[LastPart1,0,2] := strtointdef(copy(ss,Pp1c+1,Pp2c-Pp1c-1),0);
     end;

     repeat
      LastPart2 := LastPart2+1;
      if (Pp1b>0) and (Pp2b>0) then
      begin
       ss := copy(s,Pp1b,Pp2b-Pp1b-2);
       Pp1c := PosEx('''',ss,1);
       Pp2c := ss.Length-PosEx('''',AnsiReverseString(ss),1) +1;
       ss := copy(ss,Pp1c+1,Pp2c-Pp1c-1);
       Pp1c := PosEx('R',ss,1);
       Pp2c := PosEx('G',ss,1);
       RGB_OfColor[LastPart1,LastPart2,0] := strtointdef(copy(ss,Pp1c+1,Pp2c-Pp1c-1),0);
       Pp1c := PosEx('B',ss,1);
       RGB_OfColor[LastPart1,LastPart2,1] := strtointdef(copy(ss,Pp2c+1,Pp1c-Pp2c-1),0);
       Pp2c := ss.Length+1;
       RGB_OfColor[LastPart1,LastPart2,2] := strtointdef(copy(ss,Pp1c+1,Pp2c-Pp1c-1),0);
      end;

      Pp1b := Pp2b;
      Pp2b := PosEx('_'+inttostr(LastPart2+1)+'_ ''',s,Pp1b+1);
      if (Pp2b=0) or (Pp2b>Pp2a) then Pp2b := Pp2a;
     until (Pp1b=0) or (Pp2b=0) or (Pp1b=Pp2b);
    end;

    LastPart1 := LastPart1+1;
    Pp1a := Pp2a;
    Pp2a := PosEx('('+inttostr(LastPart1+1)+') ''',s,Pp1a+1);

    if Pp2a=0 then Pp2a := s.Length;
   until (Pp1a=0) or (Pp2a=0) or (Pp1a=Pp2a);
  end;


 // ЗНАЧЕНИЯ ЦВЕТА В МАССИВ "ColorProperty" ////////////////////////////////////

  NumberLine := 0; // Номер ячейки в массиве

  Pp1 := AnsiPos('Массив значений: ***************************',LoadColorS);
  Pp2d := Pp1;
  if Pp1>0 then
  begin
   for D := 0 to 1 do
   for TheBright := 0 to 254-D do
   begin
    D2 := Floor(TheBright/127)*D;

    for TheContrast := abs(127-TheBright)+D2 to 127 do
    begin
     Pp1d := PosEx('/1/'+'\'+inttostr(D)+'\'+'{'+inttostr(TheBright)+'}'
                                +'|'+inttostr(TheContrast)+'|',LoadColorS,Pp2d);
     Pp2d := PosEx(';',LoadColorS,Pp1d+1);

            if (Pp1d>0) and (Pp2d>0) then
            begin
             s := copy(LoadColorS,Pp1d,Pp2d-Pp1d);

             Pp1e := PosEx(',',s,1);
             Pp2e := PosEx(',',s,Pp1e+1);

             LastPart1 := 0; // Номер последней части массива

             repeat
              if (Pp1e>0) and (Pp2e>0) then
              begin
               Pp1f := PosEx('[',s,Pp1e);
               Pp2f := PosEx(']',s,Pp1f+1);
               if (Pp1f>0) and (Pp2f>0) then
               begin
                n5 := strtointdef(copy(s,Pp1f+1,Pp2f-Pp1f-1),-1); // Xmain

                if n5>-1 then
                begin
                 Pp1g := PosEx('(',s,Pp2f+1);
                 Pp2g := PosEx(')',s,Pp1g+1);
                 if (Pp1g>0) and (Pp2g>0) then
                 begin
                  n6 := strtointdef(copy(s,Pp1g+1,Pp2g-Pp1g-1),-1); // Номер названия цвета

                  if n6>-1 then
                  begin
                   Pp1h := PosEx('_',s,Pp2g+1);
                   Pp2h := PosEx('_',s,Pp1h+1);
                   if (Pp1h>0) and (Pp2h>0) then
                   begin
                    n7 := strtointdef(copy(s,Pp1h+1,Pp2h-Pp1h-1),-1); // Номер полного названия цвета

                    with ColorProperty[NumberLine,LastPart1] do
                    begin
                     Num := n5; // Xmain
                     Name := n6; // Номер названия цвета
                     FullName := n7; // Номер полного названия цвета
                    end;

                    LastPart1 := LastPart1+1; // Номер последней части массива
                   end;
                  end;
                 end;
                end;
               end;
              end;
              Pp1e := Pp2e;
              Pp2e := PosEx(',',s,Pp1e+1);
             until (Pp1e=0) or (Pp2e=0);

             // Если остались незаполненные части массива
             if LastPart1<=CountOfColors0-1 then
             for i := LastPart1 to CountOfColors0-1 do
             with ColorProperty[NumberLine,i] do
             begin
              Num := -1; // Xmain
              Name := -1; // Номер названия цвета
              FullName := -1; // Номер полного названия цвета
             end;

            end;

     NumberLine := NumberLine+1; // Номер ячейки в массиве
    end;
   end;

   Pp2d := Pp2e;

   for TheBright := 0 to 255 do
   begin

    Pp1d := PosEx('/0/'+'\1\'+'{'+inttostr(TheBright)+'}'+'|0|',LoadColorS,Pp2d);
    Pp2d := PosEx(';',LoadColorS,Pp1d+1);

            if (Pp1d>0) and (Pp2d>0) then
            begin
             s := copy(LoadColorS,Pp1d,Pp2d-Pp1d);

             Pp1e := PosEx(',',s,1);
             Pp2e := PosEx(',',s,Pp1e+1);

             LastPart1 := 0; // Номер последней части массива

             repeat
              if (Pp1e>0) and (Pp2e>0) then
              begin
               Pp1f := PosEx('[',s,Pp1e);
               Pp2f := PosEx(']',s,Pp1f+1);
               if (Pp1f>0) and (Pp2f>0) then
               begin
                n5 := strtointdef(copy(s,Pp1f+1,Pp2f-Pp1f-1),-1); // Xmain

                if n5>-1 then
                begin
                 Pp1g := PosEx('(',s,Pp2f+1);
                 Pp2g := PosEx(')',s,Pp1g+1);
                 if (Pp1g>0) and (Pp2g>0) then
                 begin
                  n6 := strtointdef(copy(s,Pp1g+1,Pp2g-Pp1g-1),-1); // Номер названия цвета

                  if n6>-1 then
                  begin
                   Pp1h := PosEx('_',s,Pp2g+1);
                   Pp2h := PosEx('_',s,Pp1h+1);
                   if (Pp1h>0) and (Pp2h>0) then
                   begin
                    n7 := strtointdef(copy(s,Pp1h+1,Pp2h-Pp1h-1),-1); // Номер полного названия цвета

                    with ColorProperty[NumberLine,LastPart1] do
                    begin
                     Num := n5; // Xmain
                     Name := n6; // Номер названия цвета
                     FullName := n7; // Номер полного названия цвета
                    end;

                    LastPart1 := LastPart1+1; // Номер последней части массива
                   end;
                  end;
                 end;
                end;
               end;
              end;
              Pp1e := Pp2e;
              Pp2e := PosEx(',',s,Pp1e+1);
             until (Pp1e=0) or (Pp2e=0);

             // Если остались незаполненные части массива
             if LastPart1<=CountOfColors0-1 then
             for i := LastPart1 to CountOfColors0-1 do
             with ColorProperty[NumberLine,i] do
             begin
              Num := -1; // Xmain
              Name := -1; // Номер названия цвета
              FullName := -1; // Номер полного названия цвета
             end;

            end;

    NumberLine := NumberLine+1; // Номер ячейки в массиве
   end;
  end;
 end
 else showmessage('Не найден файл "AllBrights.txt"');
end;


function AboutColor(R,G,B:byte) : ColorProperties; // Свойства цвета через "R,G,B"
var
RGBmax,RGBmin,RGBmid,
Rm,Gm,Bm,BGW,D,Light,E,
Q,Z,Y1,Qp,LR,Xc,Xmain,
Zmax:extended;
n,n2,k,k2,l2,m,m2,Lastk,Lastk2,
NumOfName,NumOfBright,i,j,Count1,
a1,b1,c1:integer;
NameByNum,BrightNameByNum,
s,ss:string;
begin
// ОСНОВНЫЕ ХАРАКТЕРИСТИКИ ЦВЕТА //////////////////////////////////////////////

 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
 BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
 D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
 Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета
 E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
 // Номер треугольника
 Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;
 //Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости "Light"
 Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
 Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду "Z"
 Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
  // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
 LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
           (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
           (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
 Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
 Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

// НОМЕР ЯЧЕЙКИ В МАССИВЕ //////////////////////////////////////////////////////

 a1 := floor(Light /128); // 1 - Если "TheBright">127
 b1 := trunc(127-abs(127-Light)+1); // Количество повторений яркости
 c1 := trunc((abs((16385-(b1-1))*a1-(1+b1*(b1-1)/2))
       +((D*2)*(16384-floor(Light/127)-a1*(Light-127)))
       +((b1-1)-(127-Z)))*BGW+(32641+Light)*(1-BGW)-1); // Номер ячейки в массиве

// НОМЕР НАЗВАНИЯ ЦВЕТА ///////////////////////////////////////////////////////

 Count1 := -1; // Номер последней части массива
 for i := 0 to CountOfColors0-1 do
 with ColorProperty[c1,i] do
 begin
  if (i+1<=CountOfColors0-1) and (Num>-1) then
  begin
    // Если выбранный цвет попадает в заданный диапазон
    if (Xmain >= Num) and
       (Xmain < ColorProperty[c1,i+1].Num)
    then
    begin
     Count1 := i;
     break;
    end;
  end
  else
  begin
    for j := i downto 0 do
    with ColorProperty[c1,j] do
    if Num > -1 then
    begin
     Count1 := j;
     break;
    end;
  end;
 end;

// НАЗВАНИЕ ЦВЕТА ПО НОМЕРУ ///////////////////////////////////////////////////

 if Count1 > -1 then
 with ColorProperty[c1,Count1] do
 begin
  Result.Num := Name;                              // Номер цвета
  Result.FullNum := FullName;                      // Номер полного имени цвета
  Result.Name := NameOfColor[Name,0];              // Имя цвета
  Result.FullName := NameOfColor[Name,FullName+1]; // Полное имя цвета (по яркости)
   Result.R1 := RGB_OfColor[Name,0,0];              // R1
   Result.G1 := RGB_OfColor[Name,0,1];              // G1
   Result.B1 := RGB_OfColor[Name,0,2];              // B1
     Result.R2 := RGB_OfColor[Name,FullName+1,0];     // R2
     Result.G2 := RGB_OfColor[Name,FullName+1,1];     // G2
     Result.B2 := RGB_OfColor[Name,FullName+1,2];     // B2
 end;

 Result.BGW := trunc(BGW);             // Если "R=G=B" то BGW=0, иначе BGW=1
  Result.Bright := Light+D*BGW; // Яркость
   Result.Shade := trunc(Xmain);       // Оттенок (Цвет)
    Result.Contrast := trunc(Z);       // Контрастность
     Result.Triangle := trunc(Q);      // Номер треугольника
      Result.CountCell := trunc(Y1);   // Количество ячеек, в треугольнике, в ряду "Contrast"
       Result.Cell := trunc(Xc);       // Номер ячейки, в треугольнике, в ряду "Contrast"
       // Result.CountRow := trunc(Zmax); // Количество рядов, на яркости "Bright"
end;



procedure TForm3.FormCreate(Sender: TObject); // Загрузить свойства цвета из текстового документа
begin
 Form3.Width := 451;
 Form3.Height := 393;

 // Создать компоненты с текстовыми полями R,G,B
 Edit1 := TEdit.Create( Form3 );
   Edit2 := TEdit.Create( Form3 );
     Edit3 := TEdit.Create( Form3 );
 with Edit1 do
 begin
  Parent := Form3;
  Text := '255';
  Width := 120;
  Height := 20;
  Top := 20;
  Left := 70;
 end;
 with Edit2 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 120;
  Height := 20;
  Top := 55;
  Left := 70;
 end;
  with Edit3 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 120;
  Height := 20;
  Top := 90;
  Left := 70;
 end;
 // Создать кнопку
 Button1 := TButton.Create( Form3 );
 with Button1 do
 begin
  Parent := Form3;
  Caption := 'Найти';
  Width := 120;
  Height := 40;
  Top := 120;
  Left := 70;
  OnClick := Form3.Button1Click; // По нажатию кнопки
 end;
 // Текстовое поле для вывода характеристик цвета
 Memo1 := TMemo.Create( Form3 );
 with Memo1 do
 begin
  Parent := Form3;
  Width := 425;
  Height := 175;
  Top := 175;
  Left := 5;
 end;
 // Изображение
 Image1 := TImage.Create( Form3 );
 with Image1 do
 begin
  Parent := Form3;
  Width := 145;
  Height := 145;
  Top := 10;
  Left := 265;
 end;

 ColorInMass;
end;


procedure TForm3.Button1Click(Sender: TObject); // Свойства цвета через "R,G,B"
var
R,G,B:byte;
begin
 R := strtointdef(Edit1.Text,0);
 G := strtointdef(Edit2.Text,0);
 B := strtointdef(Edit3.Text,0);

 with AboutColor(R,G,B) do
 begin
  Image1.Canvas.Brush.Color := RGB(R,G,B);
  Image1.Canvas.FillRect(Rect(0,0,Image1.Width,trunc(Image1.Height/3)));
    Image1.Canvas.Brush.Color := RGB(R1,G1,B1);
    Image1.Canvas.FillRect(Rect(0,trunc(Image1.Height/3),
                             Image1.Width,trunc(Image1.Height/3)*2));
      Image1.Canvas.Brush.Color := RGB(R2,G2,B2);
      Image1.Canvas.FillRect(Rect(0,trunc(Image1.Height/3)*2,
                               Image1.Width,Image1.Height));

  Memo1.Text := 'R '+inttostr(R)+' G '+inttostr(G)+' B '+inttostr(B)
  		      	+#13#10+'Цвет RGB: R ' + inttostr(R1)
                               +' G ' + inttostr(G1) +' B ' + inttostr(B1)
			        +#13#10+'Полный цвет RGB: R ' + inttostr(R2)
                                      +' G ' + inttostr(G2) +' B ' + inttostr(B2)
              +#13#10+'Имя цвета: '+Name
              +#13#10+'Полное имя: '+FullName
              +#13#10+'Номер цвета: '+inttostr(Num)
              +#13#10+'Номер полного имени цвета: '+inttostr(FullNum)
              +#13#10+'Яркость: '+floattostr(Bright)
              +#13#10+'Оттенок: '+inttostr(Shade)
              +#13#10+'Контрастность: '+inttostr(Contrast)
              +#13#10+'Номер треугольника: '+inttostr(Triangle)
              +#13#10+'Количество ячеек, в треугольнике, в ряду "Контрастность": '
                                                            +inttostr(CountCell)
              +#13#10+'Номер ячейки, в треугольнике, в ряду "Контрастность": '
                                                                +inttostr(Cell);
 end;
end;


end.

C# Unity3D:
+ Найти RGB по яркости, оттенку и контрастности
 private int R = 0;
 private int G = 0;
 private int B = 0;
 private int Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast;

 void OnGUI () {
  if (GUI.Button (new Rect (10, 40, 60, 30), "Найти")) { // По нажатию кнопки
   Main_NumOfBright = 254; // Яркость, от 0 до 508
   Main_NumOfShade = 127 + 1; // Оттенок, от 0 до 1529 +1
   Main_NumOfContrast = 0; // Контрастность, от 0 до 127

   // Найти RGB по яркости, оттенку и контрастности
   RGB_ByBSC (Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast,
    out R, out G, out B);
  }   
  GUI.Label (new Rect (10, 14, 150, 23), "R: " + R.ToString () + "  G: " + G.ToString () + "  B: " + B.ToString ());
 }

 public bool RGB_ByBSC(int NumOfBright, int NumOfShade, int NumOfContrast,
                    out int R, out int G, out int B) // Найти RGB по яркости, оттенку и контрастности
 {
  // Переменные:
  //int R, G, B;
  float Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
  Zero2, k, Y2, Xc2, Zcontrast, Yarkost, Lc, Zmax, NoRow254,
  RGBmax2, RGBmin2, RGBmid2, Xall, Xall2, Xx, Xx2, Xborder, Xout, 
  SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;

  Yarkost = NumOfBright/2f; // Яркость
  Zcontrast = NumOfContrast; // Контрастность

  BGW = 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
  D = Yarkost - Mathf.FloorToInt (Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
  Yarkost = Mathf.FloorToInt (Yarkost);
  Zmax = Mathf.FloorToInt (Mathf.Abs (127 - Mathf.Abs ((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
  Lc = 1 - Mathf.CeilToInt (((127 - Zcontrast) - Zmax) / 128f);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
  Zcontrast = (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
  //------------------Поменять «Цвет» --------------------------------------
  // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
  // а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529

  Xall = NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X

  // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
  Xout = Mathf.CeilToInt ((765 - Xall) / 766f) * ((1 - Mathf.CeilToInt (Xall / 1531f)) + Mathf.FloorToInt (Xall / 1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
  Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q = Mathf.CeilToInt ((Xall2 + 1) / 255f);    // Номер выбранного треугольника
  E = 1 - (Q / 2f - Mathf.FloorToInt (Q / 2f)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 = (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
  Xborder = 127 - (Y1 / 2f); // Количество пустых ячеек, слева от треугольника
  Qa = (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
  Xc = Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
  LR = Mathf.CeilToInt ((Xc / 254f) - 0.5f); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
  // КОРРЕКТИРОВКА
  // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
  Lc = 1 - Mathf.CeilToInt (Mathf.FloorToInt (Mathf.Abs ((Xall2 - Qa) - 127) / ((Y1 / 2f) + 1)) / 128f);
  Xc = (Xc - Xborder) * Lc + (Y1 * LR) * (1 - Lc); // Порядковый номер выбранной ячейки в треугольнике
  // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то стандартный переброс
  // между ячейками невозможен, поэтому следует сделать сплошной переход (включая в рассчеты пустую ячейку)
  SkipRow1 = Mathf.FloorToInt ((127 - Zcontrast) / 126f) * (D * 2) * (1 - Lc); // При D=0,5 и Z=1, SkipRow1=1, иначе 0
  // Координата по оси X, на общей сетке координат
  Xx = Mathf.FloorToInt (((1530 * (1 - Mathf.CeilToInt ((Q - 1) / 6f)) + Qa - Xborder - 1 + (1 - 2 * E) * (D * 2)) * (1 - LR) +
   (Qa + 255 + Xborder - (1 - 2 * E) * (D * 2) - 1530 * Mathf.FloorToInt (Q / 6f)) * LR) *
   (1 - Lc - SkipRow1 + Mathf.Abs (Xout)) + (Xall - 1) * (Lc + SkipRow1 - Mathf.Abs (Xout)));
  //+++++++++++++++++++++++++++++++++++++++++++
  // = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
  Qrgbmax = Mathf.FloorToInt ((Q + ((1 - LR) * (-E) + LR * E) - (LR * Mathf.FloorToInt (Q / 6f) * 6)) / 2f);
  // = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
  Qrgbmin = ((Q + ((1 - LR) * (-(1 - E)) + LR * (1 - E)) + ((1 - LR) * ((1 - Mathf.CeilToInt ((Q - 1) / 6f)) * 6))) / 2f) - 1;
  Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
  // = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
  Qrgbmid = (Qp + LR - (LR * Mathf.FloorToInt (Qp / 3f) * 3)) - 1;
  // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
  Rm = (1 - Mathf.CeilToInt (Qrgbmax / 2f)) * 2 + Mathf.FloorToInt (Qrgbmid / 2f);
  Gm = (1 - Mathf.Abs (Qrgbmax - 1)) * 2 + (1 - Mathf.Abs (Qrgbmid - 1));
  Bm = Mathf.FloorToInt (Qrgbmax / 2f) * 2 + (1 - Mathf.CeilToInt (Qrgbmid / 2f));

  //// Цвет RGB //////////////////////////////////////////////////////////////// 
  Zero2 = 1-Mathf.CeilToInt(Y1/254f);
  k = (1/(Y1+Zero2))*Xc;
  Y2 = ((127-Zcontrast)*2)+(D*4)*E;
  Xc2 = Mathf.Abs((Y2*LR)-Mathf.Round(Mathf.Abs(k-LR)*Y2));
  //Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

  // Поменять значение оттенка, контрастности (если за пределами) ******************************
  //  Main_NumOfShade = Mathf.FloorToInt(Xx+1); // Новый оттенок +1
  //  Main_NumOfContrast = Mathf.FloorToInt(Zcontrast); // Новая контрастность
  // ****************************************************************************

  // NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
  NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
  // Вычислить максимальное, минимальное и среднее значение
  RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
  RGBmin2 = Yarkost-(127-Zcontrast);
  RGBmid2 = Mathf.Abs(Mathf.Abs((Y2/2f)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

  // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R_main, G_main, B_main)
  R=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
   (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
  G=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
   (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
  B=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
   (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
  return true;
 }
+ Яркость, оттенок, контрастность, по RGB
 private int R, G, B;
 private int Main_NumOfBright = 0;
 private int Main_NumOfShade = 0;
 private int Main_NumOfContrast = 0;

 void OnGUI () {
  if (GUI.Button (new Rect (10, 40, 60, 30), "Найти")) { // По нажатию кнопки
   R = 255; G = 0;   B = 0;

   // Яркость, оттенок, контрастность, по RGB
   BSC_ByRGB (R, G, B,
    out Main_NumOfBright, out Main_NumOfShade, out Main_NumOfContrast);
  }   
  GUI.Label (new Rect (10, 14, 350, 23), "Яркость: " + Main_NumOfBright.ToString ()
   + "  Оттенок +1: " + Main_NumOfShade.ToString () + "  Контрастность: " + Main_NumOfContrast.ToString ());
 }

 public bool BSC_ByRGB(int R, int G, int B,
  out int NumOfBright, out int NumOfShade, out int NumOfContrast) // Яркость, оттенок, контрастность, по RGB
 {
  // Переменные
  //int NumOfBright,NumOfContrast,NumOfShade;
  //int R, G, B;
  float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
  Light, BGW, D, E, Q, Zmax, Z, Qp,  LR, Y1, Xc, Xmain;

  //R = … ;  G = … ;  B = … ;
  // Найти максимальное, минимальное и среднее значение из заданных R,G,B
  RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
  RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
  RGBmid=(R+G+B)-(RGBmax+RGBmin);
  // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
  Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
  Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
  Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
  BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
  D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
  Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета
  E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  // Номер треугольника
  Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;
  Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
  Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
  Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
  Qp = Q-Mathf.FloorToInt(Q/4f)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
  // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
  LR = (1-Mathf.Abs(Bm-1))*Mathf.FloorToInt((Qp-1)/2f)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
   (1-Mathf.Abs(Rm-1))*(1-Mathf.Abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
   (1-Mathf.Abs(Gm-1))*(1-Mathf.CeilToInt((Qp-1)/2f));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
  Xc = Mathf.Abs((Light-RGBmin)*(1-LR*2)-Mathf.Abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
  Xmain = ((127-Y1/2f)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

  NumOfBright = Mathf.FloorToInt((Light+D)*2); // Яркость, от 0 до 508
  NumOfShade = Mathf.FloorToInt(Xmain+1); // Оттенок, от 0 до 1529 +1
  NumOfContrast = Mathf.FloorToInt(Z); // Контрастность, от 0 до 127
  return true;
 }
+ Открыть файл ‘AllBrights.txt’
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text; // Для работы с текстом
using System.IO; // Используем библиотеку ввода вывода
using System; // Для изменения размеров многомерного массива
// using System.Text.RegularExpressions; // Для работы с текстом (Regex.Replace)
public class UploadAllBrights : MonoBehaviour {
	private static string ReverseString(string s) // Перевернуть строку
	{
		char[] arr = s.ToCharArray ();
		Array.Reverse (arr);
		return new string(arr);
	}
	private static Array ResizeArray(Array arr, int[] newSizes) // Поменять размер массива
	{
		if (newSizes.Length != arr.Rank)
			throw new ArgumentException("arr must have the same number of dimensions " +
				"as there are elements in newSizes", "newSizes"); 
		var temp = Array.CreateInstance(arr.GetType().GetElementType(), newSizes);
		int length = arr.Length <= temp.Length ? arr.Length : temp.Length;
		Array.ConstrainedCopy(arr, 0, temp, 0, length);
		return temp;
	} 
	void Start () {
		ColorInMass(); // Загрузить свойства цвета из текстового документа
		// Стиль для текстовых полей
		largeFont.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
		largeFont.fontSize = 32;
		largeFont.normal.textColor = Color.black;
		largeFontText.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
		largeFontText.fontSize = 14;
		largeFontText.normal.textColor = Color.black;
	}
	private int [,,] ColorProperty = new int[1,1,3]; // Номер цвета
	// [0,0, 0 ]  Xmain - Оттенок (Координата по оси X, на общей сетке координат)
	// [0,0, 1 ]  Номер названия цвета 'Красный'
	// [0,0, 2 ]  Номер полного названия цвета 'Черный |с красным оттенком|'
	private string [,] NameOfColor = new string[1,1]; // Название цвета по номеру
	private int [,,] RGB_OfColor = new int[1,1,1]; // RGB цвета по номеру
	private int CountOfColors0, // Количество цветов
	maxNumOfColor; // Максимальное количество полных названий цвета
	private bool BoolTryParse;
	public bool ColorInMass() // Загрузить свойства цвета из текстового документа
	{
		StreamReader LoadColor; // Открываем файл
		int Pp1, Pp2, i, l, Pp1a, Pp2a,
		Pp1b, Pp2b, Pp1c, Pp2c,
		Pp1d, Pp2d, Pp1e, Pp2e,
		Pp1f, Pp2f, Pp1g, Pp2g, Pp1h, Pp2h, n5, n6, n7,
		LastPart1, LastPart2, D, D2, TheBright,
		TheContrast, NumberLine;
		string s, ss, LoadColorS;
		if (File.Exists ("AllBrights.txt")) { // Если выбранный файл существует			
			LoadColor = new StreamReader ("AllBrights.txt"); // Открыть текстовый документ
			LoadColorS = LoadColor.ReadToEnd ();
			// ДЛИНА МАССИВА //////////////////////////////////////////////////////////////
			Pp1 = LoadColorS.IndexOf ("(Количество названий=");
			Pp2 = LoadColorS.IndexOf (")", Pp1 + 1);
			CountOfColors0 = 1; // Количество цветов
			if ((Pp1 > -1) & (Pp2 > -1)) {
				l = "(Количество названий=".Length;
				BoolTryParse = int.TryParse (LoadColorS.Substring (Pp1 + l, Pp2 - Pp1 - l), out CountOfColors0);
				if (!BoolTryParse)
					CountOfColors0 = 1;
				ColorProperty = (int[,,])ResizeArray (ColorProperty, new int[] { 32896, CountOfColors0, 3 }); // Указать длину массива 'ColorProperty'
			}
			// НАЗВАНИЯ ЦВЕТА В МАССИВ 'NameOfColor' //////////////////////////////////////
			LastPart1 = 0;
			Pp1 = LoadColorS.IndexOf ("Название цвета по номеру: (Количество названий=");
			Pp2 = LoadColorS.IndexOf ("Массив значений: ***********************", Pp1 + 1);
			if ((Pp1 > -1) & (Pp2 > -1)) {
				s = LoadColorS.Substring (Pp1, Pp2 - Pp1);
				Pp1a = 1;
				maxNumOfColor = 0; // Максимальное количество полных названий цвета
				while (Pp1a > -1) {				
					Pp1a = s.IndexOf ("_" + (maxNumOfColor).ToString () + "_");
					if (Pp1a > -1)
						maxNumOfColor = maxNumOfColor + 1;
				}
				maxNumOfColor = maxNumOfColor + 1;
				NameOfColor = (string[,])ResizeArray (NameOfColor, new int[] { CountOfColors0, maxNumOfColor }); // Указать длину массива, названий 'NameOfColor'
				RGB_OfColor = (int[,,])ResizeArray (RGB_OfColor, new int[] { CountOfColors0, maxNumOfColor, 3 }); // Указать длину массива, RGB 'RGB_OfColor'
				Pp1a = s.IndexOf ("(" + (LastPart1).ToString () + ") '");
				Pp2a = s.IndexOf ("(" + (LastPart1 + 1).ToString () + ") '", Pp1a + 1);
				if (Pp2a == -1)
					Pp2a = s.Length - 1;			
				while ((Pp1a > -1) & (Pp2a > -1) & (Pp1a != Pp2a)) {
					if ((Pp1a > -1) & (Pp2a > -1)) {
						LastPart2 = 0;
						Pp1b = s.IndexOf ("_" + (LastPart2).ToString () + "_ '", Pp1a + 1);
						Pp2b = s.IndexOf ("_" + (LastPart2 + 1).ToString () + "_ '", Pp1b + 1);
						if ((Pp2b == -1) | (Pp2b > Pp2a))
							Pp2b = Pp2a;
						if ((Pp1b > -1) & (Pp2b > -1)) {
							ss = s.Substring (Pp1a, Pp1b - Pp1a - 2);
							Pp1c = ss.IndexOf ("'");
							Pp2c = ss.Length - ReverseString (ss).IndexOf ("'") - 1;
							NameOfColor [LastPart1, 0] = ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1);
						}
						while ((Pp1b > -1) & (Pp2b > -1) & (Pp1b != Pp2b)) {
							LastPart2 = LastPart2 + 1;
							if ((Pp1b > -1) & (Pp2b > -1)) {
								ss = s.Substring (Pp1b, Pp2b - Pp1b - 2);
								Pp1c = ss.IndexOf ("'");
								Pp2c = ss.Length - ReverseString (ss).IndexOf ("'") - 1;
								NameOfColor [LastPart1, LastPart2] = ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1);
							}
							Pp1b = Pp2b;
							Pp2b = s.IndexOf ("_" + (LastPart2 + 1).ToString () + "_ '", Pp1b + 1);
							if ((Pp2b == -1) | (Pp2b > Pp2a))
								Pp2b = Pp2a;
						}
					}
					LastPart1 = LastPart1 + 1;
					Pp1a = Pp2a;
					Pp2a = s.IndexOf ("(" + (LastPart1 + 1).ToString () + ") '", Pp1a + 1);
					if (Pp2a == -1)
						Pp2a = s.Length - 1;			
				}
			}
		// RGB ЦВЕТА В МАССИВ 'RGB_OfColor' //////////////////////////////////////
		LastPart1 = 0;
		Pp1 = LoadColorS.IndexOf ("RGB по номеру: (Количество названий=");
		Pp2 = LoadColorS.IndexOf ("Название цвета по номеру: (Количество названий=", Pp1 + 1);

		if ((Pp1 > -1) & (Pp2 > -1)) {
			s = LoadColorS.Substring (Pp1, Pp2 - Pp1);

			Pp1a = s.IndexOf ("(" + (LastPart1).ToString () + ") '");
			Pp2a = s.IndexOf ("(" + (LastPart1 + 1).ToString () + ") '", Pp1a + 1);
			if (Pp2a == -1)
				Pp2a = s.Length - 1;			

			while ((Pp1a > -1) & (Pp2a > -1) & (Pp1a != Pp2a)) {
				if ((Pp1a > -1) & (Pp2a > -1)) {
					LastPart2 = 0;

					Pp1b = s.IndexOf ("_" + (LastPart2).ToString () + "_ '", Pp1a + 1);
					Pp2b = s.IndexOf ("_" + (LastPart2 + 1).ToString () + "_ '", Pp1b + 1);
					if ((Pp2b == -1) | (Pp2b > Pp2a))
						Pp2b = Pp2a;

					if ((Pp1b > -1) & (Pp2b > -1)) {
						ss = s.Substring (Pp1a, Pp1b - Pp1a - 2);
						Pp1c = ss.IndexOf ("'");
						Pp2c = ss.Length - ReverseString (ss).IndexOf ("'") - 1;
						ss = ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1);
						Pp1c = ss.IndexOf ("R");
						Pp2c = ss.IndexOf ("G");
						int.TryParse (ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1), out RGB_OfColor [LastPart1, 0, 0]);
						Pp1c = ss.IndexOf ("B");
						int.TryParse (ss.Substring (Pp2c + 1, Pp1c - Pp2c - 1), out RGB_OfColor [LastPart1, 0, 1]);
						Pp2c = ss.Length;
						int.TryParse (ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1), out RGB_OfColor [LastPart1, 0, 2]);
					}

					while ((Pp1b > -1) & (Pp2b > -1) & (Pp1b != Pp2b)) {
						LastPart2 = LastPart2 + 1;
						if ((Pp1b > -1) & (Pp2b > -1)) {
							ss = s.Substring (Pp1b, Pp2b - Pp1b - 2);
							Pp1c = ss.IndexOf ("'");
							Pp2c = ss.Length - ReverseString (ss).IndexOf ("'") - 1;

							ss = ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1);
							Pp1c = ss.IndexOf ("R");
							Pp2c = ss.IndexOf ("G");
							int.TryParse (ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1), out RGB_OfColor [LastPart1, LastPart2, 0]);
							Pp1c = ss.IndexOf ("B");
							int.TryParse (ss.Substring (Pp2c + 1, Pp1c - Pp2c - 1), out RGB_OfColor [LastPart1, LastPart2, 1]);
							Pp2c = ss.Length;
							int.TryParse (ss.Substring (Pp1c + 1, Pp2c - Pp1c - 1), out RGB_OfColor [LastPart1, LastPart2, 2]);
						}

						Pp1b = Pp2b;
						Pp2b = s.IndexOf ("_" + (LastPart2 + 1).ToString () + "_ '", Pp1b + 1);
						if ((Pp2b == -1) | (Pp2b > Pp2a))
							Pp2b = Pp2a;
					}
				}

				LastPart1 = LastPart1 + 1;
				Pp1a = Pp2a;
				Pp2a = s.IndexOf ("(" + (LastPart1 + 1).ToString () + ") '", Pp1a + 1);

				if (Pp2a == -1)
					Pp2a = s.Length - 1;			
			}
		}
			// ЗНАЧЕНИЯ ЦВЕТА В МАССИВ 'ColorProperty' ////////////////////////////////////
			NumberLine = 0; // Номер ячейки в массиве
			Pp1 = LoadColorS.IndexOf ("Массив значений: ***************************");
			Pp2d = Pp1;
			Pp2e = 0;
			if (Pp1 > -1) {
				for (D = 0; D <= 1; D++)
					for (TheBright = 0; TheBright <= (254 - D); TheBright++) {
						D2 = Mathf.FloorToInt (TheBright / 127f) * D;
						for (TheContrast = Mathf.Abs (127 - TheBright) + D2; TheContrast <= 127; TheContrast++) {
							Pp1d = LoadColorS.IndexOf ("/1/" + @"\" + (D).ToString () + @"\" + "{" + (TheBright).ToString () + "}"
								+ "|" + (TheContrast).ToString () + "|", Pp2d + 1);
							Pp2d = LoadColorS.IndexOf (";", Pp1d + 1);
							if ((Pp1d > -1) & (Pp2d > -1)) {
								s = LoadColorS.Substring (Pp1d, Pp2d - Pp1d);
								Pp1e = s.IndexOf (",");
								Pp2e = s.IndexOf (",", Pp1e + 1);
								LastPart1 = 0; // Номер последней части массива
								while ((Pp1e > -1) & (Pp2e > -1)) {
									if ((Pp1e > -1) & (Pp2e > -1)) {
										Pp1f = s.IndexOf ("[", Pp1e + 1);
										Pp2f = s.IndexOf ("]", Pp1f + 1);
										if ((Pp1f > -1) & (Pp2f > -1)) {
											BoolTryParse = int.TryParse (s.Substring (Pp1f + 1, Pp2f - Pp1f - 1), out n5); // Xmain
											if (!BoolTryParse)
												LastPart1 = -1;
											if (n5 > -1) {
												Pp1g = s.IndexOf ("(", Pp2f + 1);
												Pp2g = s.IndexOf (")", Pp1g + 1);
												if ((Pp1g > -1) & (Pp2g > -1)) {
													BoolTryParse = int.TryParse (s.Substring (Pp1g + 1, Pp2g - Pp1g - 1), out n6); // Номер названия цвета
													if (!BoolTryParse)
														LastPart1 = -1;
													if (n6 > -1) {
														Pp1h = s.IndexOf ("_", Pp2g + 1);
														Pp2h = s.IndexOf ("_", Pp1h + 1);
														if ((Pp1h > -1) & (Pp2h > -1)) {
															BoolTryParse = int.TryParse (s.Substring (Pp1h + 1, Pp2h - Pp1h - 1), out n7); // Номер полного названия цвета
															if (!BoolTryParse)
																LastPart1 = -1;
															ColorProperty [NumberLine, LastPart1, 0] = n5; // Xmain
															ColorProperty [NumberLine, LastPart1, 1] = n6; // Номер названия цвета
															ColorProperty [NumberLine, LastPart1, 2] = n7; // Номер полного названия цвета
															LastPart1 = LastPart1 + 1; // Номер последней части массива
														}
													}
												}
											}
										}
									}
									Pp1e = Pp2e;
									Pp2e = s.IndexOf (",", Pp1e + 1);
								}
								// Если остались незаполненные части массива
								if (LastPart1 <= CountOfColors0 - 1)
									for (i = LastPart1; i <= CountOfColors0 - 1; i++) {
										ColorProperty [NumberLine, i, 0] = -1; // Xmain
										ColorProperty [NumberLine, i, 1] = -1; // Номер названия цвета
										ColorProperty [NumberLine, i, 2] = -1; // Номер полного названия цвета
									}                                        
							}
							NumberLine = NumberLine + 1; // Номер ячейки в массиве
						}
					}
				Pp2d = Pp2e;
				for (TheBright = 0; TheBright <= 255; TheBright++) {
					Pp1d = LoadColorS.IndexOf (@"/0/" + @"\1\" + "{" + (TheBright).ToString () + "}" + "|0|", Pp2d + 1);
					Pp2d = LoadColorS.IndexOf (";", Pp1d + 1);
					if ((Pp1d > -1) & (Pp2d > -1)) {
						s = LoadColorS.Substring (Pp1d, Pp2d - Pp1d);
						Pp1e = s.IndexOf (",");
						Pp2e = s.IndexOf (",", Pp1e + 1);
						LastPart1 = 0; // Номер последней части массива
						while ((Pp1e > -1) & (Pp2e > -1)) {
							if ((Pp1e > -1) & (Pp2e > -1)) {
								Pp1f = s.IndexOf ("[", Pp1e + 1);
								Pp2f = s.IndexOf ("]", Pp1f + 1);
								if ((Pp1f > -1) & (Pp2f > -1)) {
									BoolTryParse = int.TryParse (s.Substring (Pp1f + 1, Pp2f - Pp1f - 1), out n5); // Xmain
									if (!BoolTryParse)
										LastPart1 = -1;
									if (n5 > -1) {
										Pp1g = s.IndexOf ("(", Pp2f + 1);
										Pp2g = s.IndexOf (")", Pp1g + 1);
										if ((Pp1g > -1) & (Pp2g > -1)) {
											BoolTryParse = int.TryParse (s.Substring (Pp1g + 1, Pp2g - Pp1g - 1), out n6); // Номер названия цвета
											if (!BoolTryParse)
												LastPart1 = -1;
											if (n6 > -1) {
												Pp1h = s.IndexOf ("_", Pp2g + 1);
												Pp2h = s.IndexOf ("_", Pp1h + 1);
												if ((Pp1h > -1) & (Pp2h > -1)) {
													BoolTryParse = int.TryParse (s.Substring (Pp1h + 1, Pp2h - Pp1h - 1), out n7); // Номер полного названия цвета
													if (!BoolTryParse)
														LastPart1 = -1;
													ColorProperty [NumberLine, LastPart1, 0] = n5; // Xmain
													ColorProperty [NumberLine, LastPart1, 1] = n6; // Номер названия цвета
													ColorProperty [NumberLine, LastPart1, 2] = n7; // Номер полного названия цвета
													LastPart1 = LastPart1 + 1; // Номер последней части массива
												}
											}
										}
									}
								}
							}
							Pp1e = Pp2e;
							Pp2e = s.IndexOf (",", Pp1e + 1);
						}
						// Если остались незаполненные части массива
						if (LastPart1 <= CountOfColors0 - 1)
							for (i = LastPart1; i <= CountOfColors0 - 1; i++) {
								ColorProperty [NumberLine, i, 0] = -1; // Xmain
								ColorProperty [NumberLine, i, 1] = -1; // Номер названия цвета
								ColorProperty [NumberLine, i, 2] = -1; // Номер полного названия цвета
							}
					}
					NumberLine = NumberLine + 1; // Номер ячейки в массиве
				}                                
			}
		} else
			print ("Не найден файл 'AllBrights.txt'");
		return true;    
	}
	// структура, которая описывает 'Свойства цвета'
	struct ColorProperties
	{
		public int BGW;         // Если 'R=G=B' то BGW=0, иначе BGW=1
		public float Bright;    // Яркость
		public int Shade;       // Оттенок (Цвет)
		public int Contrast;    // Контрастность
		public int Triangle;    // Номер треугольника
		public int CountCell;   // Количество ячеек, в треугольнике, в ряду 'Contrast'
		public int Cell;        // Номер ячейки, в треугольнике, в ряду 'Contrast'
		//public int CountRow;  // Количество рядов, на яркости 'Bright'
		public int Num;         // Номер цвета
		public int FullNum;     // Номер полного имени цвета
		public string Name;     // Имя цвета
		public string FullName; // Полное имя цвета (по яркости)
		public int R1;          // R1
		public int G1;          // G1
		public int B1;          // B1
		public int R2;          // R2
		public int G2;          // G2
		public int B2;          // B2
	}
	private ColorProperties AboutColor(int R, int G, int B) // Свойства цвета через 'R,G,B'
	{
		ColorProperties    AC_Result = new ColorProperties ();
		float RGBmax, RGBmin, RGBmid,    Rm, Gm, Bm, BGW, D, Light, E,
		//Zmax,
		Q, Z, Y1, Qp, LR, Xc, Xmain;
		int i, j, Count1, a1, b1, c1;    
		// ОСНОВНЫЕ ХАРАКТЕРИСТИКИ ЦВЕТА //////////////////////////////////////////////
		// Найти максимальное, минимальное и среднее значение из заданных R,G,B
		RGBmax = (((((R + G) / 2f) + (Mathf.Abs (R - G) / 2f)) + B) / 2f) + (Mathf.Abs ((((R + G) / 2f) + (Mathf.Abs (R - G) / 2f)) - B) / 2f);
		RGBmin = (((((R + G) / 2f) - (Mathf.Abs (R - G) / 2f)) + B) / 2f) - (Mathf.Abs ((((R + G) / 2f) - (Mathf.Abs (R - G) / 2f)) - B) / 2f);
		RGBmid = (R + G + B) - (RGBmax + RGBmin);
		// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
		Rm = Mathf.Abs ((Mathf.FloorToInt ((R + 1) / (RGBmax + 1)) * 3) + Mathf.FloorToInt ((RGBmin + 1) / (R + 1)) - 1);
		Gm = Mathf.Abs ((Mathf.FloorToInt ((G + 1) / (RGBmax + 1)) * 3) + Mathf.FloorToInt ((RGBmin + 1) / (G + 1)) - 1);
		Bm = Mathf.Abs ((Mathf.FloorToInt ((B + 1) / (RGBmax + 1)) * 3) + Mathf.FloorToInt ((RGBmin + 1) / (B + 1)) - 1);
		BGW = 1 - Mathf.FloorToInt ((Rm + Gm + Bm) / 9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
		D = ((RGBmax - RGBmin + 1) / 2f) - Mathf.FloorToInt ((RGBmax - RGBmin + 1) / 2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
		Light = ((253 + ((RGBmax - 127) - (127 - RGBmin))) / 2f) - D + (1 - BGW); // Яркость выбранного цвета
		E = Mathf.CeilToInt ((RGBmid - Light) / 129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
		// Номер треугольника
		Q = ((1 - E) * (Mathf.FloorToInt (Rm / 2f) + Mathf.FloorToInt (Gm / 2f) * 3 + Mathf.FloorToInt (Bm / 2f) * 5) + E * ((1 - Mathf.CeilToInt (Bm / 2f)) * 2 + (1 - Mathf.CeilToInt (Rm / 2f)) * 4 + (1 - Mathf.CeilToInt (Gm / 2f)) * 6)) * BGW;
		//Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
		Z = (127 - ((RGBmax - Light) - 1 - (D * 2))) * BGW; // Контрастность (Номер ряда с цветом)
		Y1 = (((127 - Z) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Z'
		Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
		// Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
		LR = (1 - Mathf.Abs (Bm - 1)) * Mathf.FloorToInt ((Qp - 1) / 2f) + // Если Bm = RGBmid, и Qp = 3(6), то LR=1
			(1 - Mathf.Abs (Rm - 1)) * (1 - Mathf.Abs (Qp - 2)) + // Если Rm = RGBmid, и Qp = 2(5), то LR=1
			(1 - Mathf.Abs (Gm - 1)) * (1 - Mathf.CeilToInt ((Qp - 1) / 2f));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
		Xc = Mathf.Abs ((Light - RGBmin) * (1 - LR * 2) - Mathf.Abs (RGBmid - RGBmin * (1 - E) - RGBmax * E) + (D * 2) * E * (1 - LR * 2));  // Порядковый № ячейки
		Xmain = ((127 - Y1 / 2f) + Xc + (Q - 1) * 255) * BGW;// // Оттенок (Координата по оси X, на общей сетке координат)
		// НОМЕР ЯЧЕЙКИ В МАССИВЕ //////////////////////////////////////////////////////
		a1 = Mathf.FloorToInt (Light / 128f); // 1 - Если 'TheBright'>127
		b1 = Mathf.FloorToInt (127 - Mathf.Abs (127 - Light) + 1); // Количество повторений яркости
		c1 = Mathf.FloorToInt ((Mathf.Abs ((16385 - (b1 - 1)) * a1 - (1 + b1 * (b1 - 1) / 2f))
			+ ((D * 2) * (16384 - Mathf.FloorToInt (Light / 127f) - a1 * (Light - 127)))
			+ ((b1 - 1) - (127 - Z))) * BGW + (32641 + Light) * (1 - BGW) - 1); // Номер ячейки в массиве
		// НОМЕР НАЗВАНИЯ ЦВЕТА ///////////////////////////////////////////////////////
		Count1 = -1; // Номер последней части массива
		for (i = 0; i <= CountOfColors0 - 1; i++) {
			if ((i + 1 <= CountOfColors0 - 1) & (ColorProperty [c1, i, 0] > -1)) {
				// Если выбранный цвет попадает в заданный диапазон
				if ((Xmain >= ColorProperty [c1, i, 0]) &
					(Xmain < ColorProperty [c1, i + 1, 0])) {
					Count1 = i;
					break;
				}
			} else {
				for (j = i; j >= 0; j--)
					if (ColorProperty [c1, j, 0] > -1) {
						Count1 = j;
						break;
					}
			}
		}
		// НАЗВАНИЕ ЦВЕТА ПО НОМЕРУ ///////////////////////////////////////////////////
		if (Count1 > -1) {
			AC_Result.Num = ColorProperty [c1, Count1, 1];                  // Номер цвета
			AC_Result.FullNum = ColorProperty [c1, Count1, 2];              // Номер полного имени цвета
			AC_Result.Name = NameOfColor [ColorProperty [c1, Count1, 1], 0];  // Имя цвета
			AC_Result.FullName = NameOfColor [ColorProperty [c1, Count1, 1],
				ColorProperty [c1, Count1, 2] + 1];          // Полное имя цвета (по яркости)
		 	 AC_Result.R1 = RGB_OfColor [ColorProperty [c1, Count1, 1], 0, 0];  // R1
			 AC_Result.G1 = RGB_OfColor [ColorProperty [c1, Count1, 1], 0, 1];  // G1
			 AC_Result.B1 = RGB_OfColor [ColorProperty [c1, Count1, 1], 0, 2];  // B1
			    AC_Result.R2 = RGB_OfColor [ColorProperty [c1, Count1, 1],
				    ColorProperty [c1, Count1, 2] + 1,0];          // R2			
			    AC_Result.G2 = RGB_OfColor [ColorProperty [c1, Count1, 1],
				    ColorProperty [c1, Count1, 2] + 1,1];          // G2			
			    AC_Result.B2 = RGB_OfColor [ColorProperty [c1, Count1, 1],
				    ColorProperty [c1, Count1, 2] + 1,2];          // B2			
		}
		AC_Result.BGW = Mathf.FloorToInt (BGW);             // Если 'R=G=B' то BGW=0, иначе BGW=1
		AC_Result.Bright = Light + D * BGW; // Яркость
		AC_Result.Shade = Mathf.FloorToInt (Xmain);       // Оттенок (Цвет)
		AC_Result.Contrast = Mathf.FloorToInt (Z);       // Контрастность
		AC_Result.Triangle = Mathf.FloorToInt (Q);      // Номер треугольника
		AC_Result.CountCell = Mathf.FloorToInt (Y1);   // Количество ячеек, в треугольнике, в ряду 'Contrast'
		AC_Result.Cell = Mathf.FloorToInt (Xc);       // Номер ячейки, в треугольнике, в ряду 'Contrast'
		// AC_Result.CountRow = Mathf.FloorToInt(Zmax); // Количество рядов, на яркости 'Bright'
		return AC_Result;
	}
	// Текстовое поле /////////////////////////////////////////////
	private string stringToEdit = ""; // Текст
	private string R_stringToEdit = "255"; // R 
	private string G_stringToEdit = "0"; // G 
	private string B_stringToEdit = "127"; // B 
	private Rect R_boxOfGUI = new Rect (10, 200, 140, 40); // Положение текстового поля R
	private Rect G_boxOfGUI = new Rect (160, 200, 140, 40); // Положение текстового поля G
	private Rect B_boxOfGUI = new Rect (310, 200, 160, 40); // Положение текстового поля B
	private Rect boxOfGUI = new Rect (10, 250, 290, 276); // Положение текстового поля
	private Rect boxOfGUIc1 = new Rect (310, 250, 160, 92); // Положение квадрата с цветом 1
	private Rect boxOfGUIc2 = new Rect (310, 342, 160, 92); // Положение квадрата с цветом 2
	private Rect boxOfGUIc3 = new Rect (310, 434, 160, 92); // Положение квадрата с цветом 3
	private GUIStyle largeFont = new GUIStyle("textField"); // Стиль текста
	private GUIStyle largeFontText = new GUIStyle("textField"); // Стиль текста 2
	private GUIStyle styleColorLable1 = new GUIStyle("textField"); // Цветной квадрат 1
	private GUIStyle styleColorLable2 = new GUIStyle("textField"); // Цветной квадрат 2
	private GUIStyle styleColorLable3 = new GUIStyle("textField"); // Цветной квадрат 3
	///////////////////////////////////////////////////////////////
	private Texture2D MakeTex(int width, int height, Color col) // Создать текстуру определенного цвета
	{
		Color[] pix = new Color[width*height];
		for(int i = 0; i < pix.Length; i++)
			pix[i] = col;
		Texture2D result = new Texture2D(width, height);
		result.SetPixels(pix);
		result.Apply();
		return result;
	}
	void OnGUI () {
		if (GUI.Button (new Rect (310, 530, 160, 70), "Найти")) { // Если нажата кнопка            
			int R,G,B;
			//B_stringToEdit = Regex.Replace (B_stringToEdit, "[^0-9]", ""); // Оставить только числа
			int.TryParse (R_stringToEdit, out R); // Перевести текст в число
			int.TryParse (G_stringToEdit, out G);
			int.TryParse (B_stringToEdit, out B);
			stringToEdit = 
				"R "+(R).ToString()+" G "+(G).ToString()+" B "+(B).ToString()+ System.Environment.NewLine +
				"Цвет RGB: R " + AboutColor (R, G, B).R1 +
			          	" G " + AboutColor (R, G, B).G1 +
			          	" B " + AboutColor (R, G, B).B1 + System.Environment.NewLine +
				"Полный цвет RGB: R " + AboutColor (R, G, B).R2 +
			                 	" G " + AboutColor (R, G, B).G2 +
			                 	" B " + AboutColor (R, G, B).B2 + System.Environment.NewLine +
				"Имя цвета: "+AboutColor(R,G,B).Name+ System.Environment.NewLine +
				"Полное имя: "+AboutColor(R,G,B).FullName+ System.Environment.NewLine +
				"Номер цвета: "+(AboutColor(R,G,B).Num).ToString()+ System.Environment.NewLine +
				"Номер полного имени цвета: "+(AboutColor(R,G,B).FullNum).ToString()+ System.Environment.NewLine +
				"Яркость: "+(AboutColor(R,G,B).Bright).ToString()+ System.Environment.NewLine +
				"Оттенок: "+(AboutColor(R,G,B).Shade).ToString()+ System.Environment.NewLine +
				"Контрастность: "+(AboutColor(R,G,B).Contrast).ToString()+ System.Environment.NewLine +
				"Номер треугольника: "+(AboutColor(R,G,B).Triangle).ToString()+ System.Environment.NewLine +
				"Количество ячеек, в треугольнике, "+ System.Environment.NewLine +
				"в ряду 'Контрастность': "+ System.Environment.NewLine +
				(AboutColor(R,G,B).CountCell).ToString()+ System.Environment.NewLine +
				"Номер ячейки, в треугольнике, "+ System.Environment.NewLine +
				"в ряду 'Контрастность': "+ System.Environment.NewLine +
				(AboutColor(R,G,B).Cell).ToString();
		styleColorLable1.normal.background = MakeTex (100, 100, new Color (R / 255f, G / 255f, B / 255f)); // Заполнить квадрат 1 цветом R,G,B
		styleColorLable2.normal.background = MakeTex (100, 100, new Color (AboutColor (R, G, B).R1 / 255f,
			                                                               AboutColor (R, G, B).G1 / 255f, 
			                                                               AboutColor (R, G, B).B1 / 255f)); // Заполнить квадрат 2 цветом R1,G1,B1
		styleColorLable3.normal.background = MakeTex (100, 100, new Color (AboutColor (R, G, B).R2 / 255f,
			                                                               AboutColor (R, G, B).G2 / 255f, 
			                                                               AboutColor (R, G, B).B2 / 255f)); // Заполнить квадрат 3 цветом R2,G2,B2
		}    
		GUI.Label (boxOfGUIc1, "", styleColorLable1);	// Квадрат с цветом	1		
		GUI.Label (boxOfGUIc2, "", styleColorLable2);	// Квадрат с цветом	2		
		GUI.Label (boxOfGUIc3, "", styleColorLable3);	// Квадрат с цветом	3		
		R_stringToEdit = GUI.TextField (R_boxOfGUI, R_stringToEdit, 3, largeFont); // Отрисовка текстовго поля    R        
		G_stringToEdit = GUI.TextField (G_boxOfGUI, G_stringToEdit, 3, largeFont); // Отрисовка текстовго поля    G    
		B_stringToEdit = GUI.TextField (B_boxOfGUI, B_stringToEdit, 3, largeFont); // Отрисовка текстовго поля    B        
		stringToEdit = GUI.TextField (boxOfGUI, stringToEdit, largeFontText); // Отрисовка текстовго поля    
	}
}
20 дек 19, 10:38    [22044988]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Delphi:
+ Поменять цвет RGB (2)
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls,
  Math; // Для округления чисел

type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);
    // По нажатию на кнопку, прибавить число к оттенку
    procedure Button_2Click(Sender: TObject);

    procedure WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); message WM_MOUSEWHEEL; // Прокручено колесико мыши
    procedure Edit_1Change(Sender: TObject);
    procedure Edit_2Change(Sender: TObject);
    procedure Edit_3Change(Sender: TObject);

     // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
    procedure Find_BSC_AndMake_TheSameColor();

    procedure TrackBar_1Change(Sender: TObject);
    procedure TrackBar_2Change(Sender: TObject);
    procedure TrackBar_3Change(Sender: TObject);

     // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
    procedure Find_RGB_AndMake_TheSameColor();

    procedure TrackBar_4Change(Sender: TObject);
    procedure TrackBar_5Change(Sender: TObject);
    procedure TrackBar_6Change(Sender: TObject);

     // Установить значения нижних текстовых полей
    procedure Show_Changed_Color();

    // Найти RGB по яркости, оттенку и контрастности - Delphi
    procedure RGB_ByBSC(NumOfBright,NumOfShade,NumOfContrast:integer; out R,G,B:integer);
    // Яркость, оттенок, контрастность, по RGB - Delphi
    procedure BSC_ByRGB(R,G,B:integer; out NumOfBright,NumOfShade,NumOfContrast:integer);
    // Поменять цвет RGB - Delphi
    procedure Change_RGB(R,G,B,NumOfBright_Before,NumOfBright_New,
                               NumOfShade_Before,NumOfShade_New,
                               NumOfContrast:integer;
                               out R2,G2,B2:integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
  Button_2 : TButton; // Кнопка (+ Оттенок)
  Edit_1,Edit_2,Edit_3, // Текстовые поля "RGB" (Указываемый цвет)
  Edit_4,Edit_5,Edit_6, // Текстовые поля "RGB" (Результат)
  Edit_7: TEdit;        // Текстовое поле (+ Оттенок)
  Image_1,          // Изображение (Указываемый цвет)
  Image_2 : TImage; // Изображение (Результат)
  TrackBar_1,TrackBar_2,TrackBar_3,            // Ползунки яркости, оттенка, контрастности (Указываемый цвет)
  TrackBar_4,TrackBar_5,TrackBar_6: TTrackBar; // Ползунки яркости, оттенка, контрастности (Результат)
  Label_1,Label_2,Label_3,Label_4,         // Label - яркость, оттенок, контрастность, RGB (Указываемый цвет)
  Label_5,Label_6,Label_7,Label_8: TLabel; // Label - яркость, оттенок, контрастность, RGB (Результат)
  CheckBox_1 : TCheckBox; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции
  Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, // Яркость, Оттенок, Контрастность
  Main_NumOfBright2, Main_NumOfShade2, Main_NumOfShade3,
  Main_NumOfContrast2, Main_NumOfContrast3, // Яркость2, Оттенок2, Контрастность2
  Main_R, Main_G, Main_B,
  Main_R2, Main_G2, Main_B2 : integer;
  EditProgramChange,               // true - RGB меняется программно, false - вручную
  TrackBarProgramChange : boolean; // true - Яркость, оттенок, контрастность меняются программно, false - вручную
implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
begin
 Form3.Width := 495;
 Form3.Height := 504;
 Form3.Left := (Screen.Width div 2) - (Form3.Width div 2);
 Form3.Top := (Screen.Height div 2) - (Form3.Height div 2) - 20;

 // Создать кнопку
 Button_2 := TButton.Create( Form3 );
 with Button_2 do
 begin
  Parent := Form3;
  Caption := '+ Оттенок';
  Width := 75;
  Height := 25;
  Top := 220;
  Left := 385;
  OnClick := Button_2Click; // По нажатию на кнопку, прибавить число к оттенку
 end;
 // Создать компоненты с текстовыми полями R,G,B
 Edit_1 := TEdit.Create( Form3 );
   Edit_2 := TEdit.Create( Form3 );
     Edit_3 := TEdit.Create( Form3 );
 Edit_4 := TEdit.Create( Form3 );
   Edit_5 := TEdit.Create( Form3 );
     Edit_6 := TEdit.Create( Form3 );
 Edit_7 := TEdit.Create( Form3 );
 with Edit_1 do
 begin
  Parent := Form3;
  Text := '255';
  Width := 40;
  Height := 20;
  Top := 188;
  Left := 38;
  NumbersOnly := true;
  OnChange := Edit_1Change; // При изменении текста
 end;
 with Edit_2 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 188;
  Left := 102;
  NumbersOnly := true;
  OnChange := Edit_2Change; // При изменении текста
 end;
 with Edit_3 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 188;
  Left := 167;
  NumbersOnly := true;
  OnChange := Edit_3Change; // При изменении текста
 end;
 with Edit_4 do
 begin
  Parent := Form3;
  Text := '255';
  Width := 40;
  Height := 20;
  Top := 424;
  Left := 38;
  NumbersOnly := true;
 end;
 with Edit_5 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 424;
  Left := 102;
  NumbersOnly := true;
 end;
 with Edit_6 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 424;
  Left := 167;
  NumbersOnly := true;
 end;
 with Edit_7 do
 begin
  Parent := Form3;
  Text := '1';
  Width := 40;
  Height := 20;
  Top := 222;
  Left := 340;
 end;
 // Изображения
 Image_1 := TImage.Create( Form3 );
  Image_2 := TImage.Create( Form3 );
 with Image_1 do
 begin
  Parent := Form3;
  Width := 169;
  Height := 185;
  Top := 24;
  Left := 280;
 end;
 with Image_2 do
 begin
  Parent := Form3;
  Width := 169;
  Height := 185;
  Top := 260;
  Left := 280;
 end;
 // Создать ползунки яркости, оттенка, контрастности
 TrackBar_1 := TTrackBar.Create( Form3 );
   TrackBar_2 := TTrackBar.Create( Form3 );
     TrackBar_3 := TTrackBar.Create( Form3 );
 TrackBar_4 := TTrackBar.Create( Form3 );
   TrackBar_5 := TTrackBar.Create( Form3 );
     TrackBar_6 := TTrackBar.Create( Form3 );
 with TrackBar_1 do
 begin
  Parent := Form3;
  Max := 508;
  Position := 254;
  Width := 211;
  Height := 22;
  Top := 40;
  Left := 32;
  OnChange := Form3.TrackBar_1Change; // При изменении позиции ползунка
 end;
 with TrackBar_2 do
 begin
  Parent := Form3;
  Max := 1531;
  Position := 128;
  Width := 211;
  Height := 22;
  Top := 88;
  Left := 32;
  OnChange := Form3.TrackBar_2Change; // При изменении позиции ползунка
 end;
 with TrackBar_3 do
 begin
  Parent := Form3;
  Max := 127;
  Position := 0;
  Width := 211;
  Height := 22;
  Top := 131;
  Left := 32;
  OnChange := Form3.TrackBar_3Change; // При изменении позиции ползунка
 end;
 with TrackBar_4 do
 begin
  Parent := Form3;
  Max := 508;
  Position := 254;
  Width := 211;
  Height := 22;
  Top := 276;
  Left := 32;
  OnChange := Form3.TrackBar_4Change; // При изменении позиции ползунка
 end;
 with TrackBar_5 do
 begin
  Parent := Form3;
  Max := 1531;
  Position := 128;
  Width := 211;
  Height := 22;
  Top := 325;
  Left := 32;
  OnChange := Form3.TrackBar_5Change; // При изменении позиции ползунка
 end;
 with TrackBar_6 do
 begin
  Parent := Form3;
  Max := 127;
  Position := 0;
  Width := 211;
  Height := 22;
  Top := 367;
  Left := 32;
  OnChange := Form3.TrackBar_6Change; // При изменении позиции ползунка
 end;
 // Создать Label
 Label_1 := TLabel.Create( Form3 );
   Label_2 := TLabel.Create( Form3 );
     Label_3 := TLabel.Create( Form3 );
      Label_4 := TLabel.Create( Form3 );
 Label_5 := TLabel.Create( Form3 );
   Label_6 := TLabel.Create( Form3 );
     Label_7 := TLabel.Create( Form3 );
       Label_8 := TLabel.Create( Form3 );
 with Label_1 do
 begin
  Parent := Form3;
  Caption := 'Яркость: 254 (127,0)';
  Width := 106;
  Height := 13;
  Top := 24;
  Left := 38;
 end;
 with Label_2 do
 begin
  Parent := Form3;
  Caption := 'Оттенок: 127';
  Width := 69;
  Height := 13;
  Top := 72;
  Left := 38;
 end;
 with Label_3 do
 begin
  Parent := Form3;
  Caption := 'Контрастность: 0';
  Width := 90;
  Height := 13;
  Top := 116;
  Left := 38;
 end;
 with Label_4 do
 begin
  Parent := Form3;
  Caption := 'R                   G                    B';
  Width := 137;
  Height := 13;
  Top := 171;
  Left := 53;
 end;
 with Label_5 do
 begin
  Parent := Form3;
  Caption := 'Яркость: 254 (127,0)';
  Width := 106;
  Height := 13;
  Top := 260;
  Left := 38;
 end;
 with Label_6 do
 begin
  Parent := Form3;
  Caption := 'Оттенок: 127';
  Width := 69;
  Height := 13;
  Top := 308;
  Left := 38;
 end;
 with Label_7 do
 begin
  Parent := Form3;
  Caption := 'Контрастность: 0';
  Width := 90;
  Height := 13;
  Top := 353;
  Left := 38;
 end;
 with Label_8 do
 begin
  Parent := Form3;
  Caption := 'R                   G                    B';
  Width := 137;
  Height := 13;
  Top := 407;
  Left := 53;
 end;
 // Создать CheckBox
 CheckBox_1 := TCheckBox.Create( Form3 );
 with CheckBox_1 do
 begin
  Parent := Form3;
  Caption := 'Не сохранять пропорции (яркость - контрастность)';
  Hint := 'Выключено - Контрастность вторичного цвета не может быть выше,'
  +#13#10+'чем максимальная контрастность на яркости основного цвета';
  Width := 280;
  Height := 13;
  Top := 231;
  Left := 38;
 end;
 CheckBox_1.Checked := false; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции
 ShowHint := true; // показывать подсказки

 Main_NumOfBright := 254; // Яркость
 Main_NumOfShade := 128;  // Оттенок
 Main_NumOfContrast := 0; // Контрастность
  Main_NumOfBright2 := 254; // Яркость2
  Main_NumOfShade2 := 128;  // Оттенок2
  Main_NumOfContrast2 := 0; // Контрастность2
   Main_NumOfShade3 := 128;  // Оттенок2 (для контрастности)
   Main_NumOfContrast3 := 0; // Контрастность2 (для яркости)

 Main_R := 255;
 Main_G := 0;
 Main_B := 0;
  Main_R2 := 255;
  Main_G2 := 0;
  Main_B2 := 0;
end;

procedure TForm3.Button_2Click(Sender: TObject); // По нажатию на кнопку, прибавить число к оттенку
var
i : integer;
begin
 i := strtointdef(Edit_7.Text,0); // от -1529 до 1529
 if i<-1529 then
 begin
  i := -1529;
  Edit_7.Text := '-1529';
 end;
 if i>1529 then
 begin
  i := 1529;
  Edit_7.Text := '1529';
 end;

 // Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
            Main_NumOfBright2, Main_NumOfBright2,
            Main_NumOfShade2, TrackBar_5.Position + i,
            Main_NumOfContrast2,
            Main_R2,Main_G2,Main_B2);

 Main_NumOfShade2 := TrackBar_5.Position; // Оттенок

 Show_Changed_Color(); // Установить значения нижних текстовых полей
end;

procedure TForm3.WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); // Прокручено колесико мыши
var
MP: TPoint;
EditScrL,EditScrT : integer;
begin
 GetCursorPos(MP); // Получить координаты курсора, относительно экрана

 // Если колесо прокручено над Edit_1
 EditScrL:=Form3.Left+10+Edit_1.Left;
 EditScrT:=Form3.Top+32+Edit_1.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_1.Width) and (MP.Y<=EditScrT+Edit_1.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_1.Text,0)+1)<256 then
    Edit_1.Text:=inttostr(strtointdef(Edit_1.Text,0)+1);
   end
   else
   if (strtointdef(Edit_1.Text,0)-1)>-1 then
   Edit_1.Text:=inttostr(strtointdef(Edit_1.Text,0)-1);
  exit;
 end;

 // Если колесо прокручено над Edit_2
 EditScrL:=Form3.Left+10+Edit_2.Left;
 EditScrT:=Form3.Top+32+Edit_2.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_2.Width) and (MP.Y<=EditScrT+Edit_2.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_2.Text,0)+1)<256 then
    Edit_2.Text:=inttostr(strtointdef(Edit_2.Text,0)+1);
   end
   else
   if (strtointdef(Edit_2.Text,0)-1)>-1 then
   Edit_2.Text:=inttostr(strtointdef(Edit_2.Text,0)-1);
  exit;
 end;

 // Если колесо прокручено над Edit_3
 EditScrL:=Form3.Left+10+Edit_3.Left;
 EditScrT:=Form3.Top+32+Edit_3.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_3.Width) and (MP.Y<=EditScrT+Edit_3.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_3.Text,0)+1)<256 then
    Edit_3.Text:=inttostr(strtointdef(Edit_3.Text,0)+1);
   end
   else
   if (strtointdef(Edit_3.Text,0)-1)>-1 then
   Edit_3.Text:=inttostr(strtointdef(Edit_3.Text,0)-1);
  exit;
 end;

 // Если колесо прокручено над Edit_7
 EditScrL:=Form3.Left+10+Edit_7.Left;
 EditScrT:=Form3.Top+32+Edit_7.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_7.Width) and (MP.Y<=EditScrT+Edit_7.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_7.Text,0)+1)<1530 then
    Edit_7.Text:=inttostr(strtointdef(Edit_7.Text,0)+1);
   end
   else
   if (strtointdef(Edit_7.Text,0)-1)>-1530 then
   Edit_7.Text:=inttostr(strtointdef(Edit_7.Text,0)-1);
  exit;
 end;
end;

procedure TForm3.Edit_1Change(Sender: TObject);
begin
 if (EditProgramChange = false) then // Если RGB меняется вручную
 begin
  if strtointdef(Edit_1.Text,0)<0 then
  begin
   Edit_1.Text := '0';
  end;
  if strtointdef(Edit_1.Text,0)>255 then
  begin
   Edit_1.Text := '255';
  end;
  Main_R := strtointdef(Edit_1.Text,0);

  Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Edit_2Change(Sender: TObject);
begin
 if (EditProgramChange = false) then // Если RGB меняется вручную
 begin
  if strtointdef(Edit_2.Text,0)<0 then
  begin
   Edit_2.Text := '0';
  end;
  if strtointdef(Edit_2.Text,0)>255 then
  begin
   Edit_2.Text := '255';
  end;
  Main_G := strtointdef(Edit_2.Text,0);

  Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Edit_3Change(Sender: TObject);
begin
 if (EditProgramChange = false) then // Если RGB меняется вручную
 begin
  if strtointdef(Edit_3.Text,0)<0 then
  begin
   Edit_3.Text := '0';
  end;
  if strtointdef(Edit_3.Text,0)>255 then
  begin
   Edit_3.Text := '255';
  end;
  Main_B := strtointdef(Edit_3.Text,0);

  Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
begin
  TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно

  // Яркость, оттенок, контрастность, по RGB - Delphi
  BSC_ByRGB(Main_R,Main_G,Main_B, Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast);
  TrackBar_1.Position := Main_NumOfBright;
  TrackBar_2.Position := Main_NumOfShade;
  TrackBar_3.Position := Main_NumOfContrast;

  TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
  with Image_1 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;

  EditProgramChange := true; // RGB меняется программно
  Edit_4.Text := inttostr(Main_R);
   Edit_5.Text := inttostr(Main_G);
    Edit_6.Text := inttostr(Main_B);
  Main_R2 := Main_R;
   Main_G2 := Main_G;
    Main_B2 := Main_B;
  EditProgramChange := false; // RGB меняется вручную
  with Image_2 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;
  TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
  TrackBar_4.Position := TrackBar_1.Position;
   TrackBar_5.Position := TrackBar_2.Position;
    TrackBar_6.Position := TrackBar_3.Position;
  Main_NumOfBright2 := TrackBar_1.Position;
   Main_NumOfShade2 := TrackBar_2.Position;
   Main_NumOfShade3 := TrackBar_2.Position;
    Main_NumOfContrast2 := TrackBar_3.Position;
    Main_NumOfContrast3 := TrackBar_3.Position;
  TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
end;

procedure TForm3.TrackBar_1Change(Sender: TObject);
begin
 if Odd(TrackBar_1.Position)=false then  // Четное
  Label_1.Caption := 'Яркость: '+inttostr(TrackBar_1.Position)
                   +' ('+Floattostr(TrackBar_1.Position/2)+',0)'
 else // Нечетное
 Label_1.Caption := 'Яркость: '+inttostr(TrackBar_1.Position)
                   +' ('+Floattostr(TrackBar_1.Position/2)+')';

 if ((TrackBarProgramChange = false)   and // Если Яркость, оттенок, контрастность меняются вручную
  (TrackBar_1.Position<>Main_NumOfBright)) // Выполнить процедуру только 1 раз
 then
 begin
  Main_NumOfBright := TrackBar_1.Position; // Яркость

  Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.TrackBar_2Change(Sender: TObject);
begin
 Label_2.Caption := 'Оттенок: '+inttostr(TrackBar_2.Position - 1);

 if ((TrackBarProgramChange = false)  and // Если Яркость, оттенок, контрастность меняются вручную
  (TrackBar_2.Position<>Main_NumOfShade)) // Выполнить процедуру только 1 раз
 then
 begin
  Main_NumOfShade := TrackBar_2.Position; // Оттенок

  Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.TrackBar_3Change(Sender: TObject);
begin
 Label_3.Caption := 'Контрастность: '+inttostr(TrackBar_3.Position);

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
  (TrackBar_3.Position<>Main_NumOfContrast)) // Выполнить процедуру только 1 раз
 then
 begin
  Main_NumOfContrast := TrackBar_3.Position; // Контрастность

  Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
begin
  // Найти RGB по яркости, оттенку и контрастности - Delphi
  RGB_ByBSC(Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast, Main_R,Main_G,Main_B);
  EditProgramChange := true; // RGB меняется программно
  Edit_1.Text := inttostr(Main_R);
  Edit_2.Text := inttostr(Main_G);
  Edit_3.Text := inttostr(Main_B);
  EditProgramChange := false; // RGB меняется вручную
  with Image_1 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;

  EditProgramChange := true; // RGB меняется программно
  Edit_4.Text := inttostr(Main_R);
   Edit_5.Text := inttostr(Main_G);
    Edit_6.Text := inttostr(Main_B);
  Main_R2 := Main_R;
   Main_G2 := Main_G;
    Main_B2 := Main_B;
  EditProgramChange := false; // RGB меняется вручную
  with Image_2 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;
  TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
  //Main_NumOfBright := TrackBar_1.Position;
  // Main_NumOfShade := TrackBar_2.Position;
  //  Main_NumOfContrast := TrackBar_3.Position;

  TrackBar_4.Position := TrackBar_1.Position;
   TrackBar_5.Position := TrackBar_2.Position;
    TrackBar_6.Position := TrackBar_3.Position;

  Main_NumOfBright2 := TrackBar_1.Position;
   Main_NumOfShade2 := TrackBar_2.Position;
   Main_NumOfShade3 := TrackBar_2.Position;
    Main_NumOfContrast2 := TrackBar_3.Position;
    Main_NumOfContrast3 := TrackBar_3.Position;
  TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
end;

procedure TForm3.TrackBar_4Change(Sender: TObject);
begin
 if Odd(TrackBar_4.Position)=false then  // Четное
  Label_5.Caption := 'Яркость: '+inttostr(TrackBar_4.Position)
                   +' ('+Floattostr(TrackBar_4.Position/2)+',0)'
 else // Нечетное
 Label_5.Caption := 'Яркость: '+inttostr(TrackBar_4.Position)
                   +' ('+Floattostr(TrackBar_4.Position/2)+')';

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
   (TrackBar_4.Position<>Main_NumOfBright2)) // Выполнить процедуру только 1 раз
 then
 begin
  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, TrackBar_4.Position,
             Main_NumOfShade3, Main_NumOfShade3,
             Main_NumOfContrast3,
             Main_R2,Main_G2,Main_B2);

  Main_NumOfBright2 := TrackBar_4.Position; // Яркость
 // Main_NumOfShade2 := TrackBar_5.Position; // Оттенок
 // Main_NumOfContrast2 := TrackBar_6.Position; // Контрастность

  Show_Changed_Color(); // Установить значения нижних текстовых полей
 end;
end;

procedure TForm3.TrackBar_5Change(Sender: TObject);
begin
 Label_6.Caption := 'Оттенок: '+inttostr(TrackBar_5.Position - 1);

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
   (TrackBar_5.Position<>Main_NumOfShade2)) // Выполнить процедуру только 1 раз
 then
 begin
  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, Main_NumOfBright2,
             Main_NumOfShade2, TrackBar_5.Position,
             Main_NumOfContrast2,
             Main_R2,Main_G2,Main_B2);

  Main_NumOfShade2 := TrackBar_5.Position; // Оттенок

  Show_Changed_Color(); // Установить значения нижних текстовых полей
 end;
end;

procedure TForm3.TrackBar_6Change(Sender: TObject);
begin
 Label_7.Caption := 'Контрастность: '+inttostr(TrackBar_6.Position);

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
   (TrackBar_6.Position<>Main_NumOfContrast2)) // Выполнить процедуру только 1 раз
 then
 begin
  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, Main_NumOfBright2,
             Main_NumOfShade3, Main_NumOfShade3,
             TrackBar_6.Position,
             Main_R2,Main_G2,Main_B2);

  Main_NumOfContrast2 := TrackBar_6.Position; // Контрастность

  Show_Changed_Color(); // Установить значения нижних текстовых полей
 end;
end;

procedure TForm3.Show_Changed_Color(); // Установить значения нижних текстовых полей
begin
  EditProgramChange := true; // RGB меняется программно
  Edit_4.Text := inttostr(Main_R2);
  Edit_5.Text := inttostr(Main_G2);
  Edit_6.Text := inttostr(Main_B2);
  EditProgramChange := false; // RGB меняется вручную
  with Image_2 do
  begin
   Canvas.Brush.Color:=RGB(Main_R2,Main_G2,Main_B2);
   Canvas.Rectangle(0,0,width,height);
  end;
end;

procedure TForm3.BSC_ByRGB(R,G,B:integer;
                    out NumOfBright,NumOfShade,NumOfContrast:integer); // Яркость, оттенок, контрастность, по RGB - Delphi
var
//NumOfBright1,NumOfContrast1,NumOfShade1 : integer;
//R, G, B : byte;
RGBmax,RGBmin,RGBmid,Rm,Gm,Bm,
Light,BGW,D,E,Q,Zmax,Z,Qp,LR,Y1,Xc,Xmain: Extended;
begin
// R := … ;  G := … ;  B := … ;
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета
E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;
Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
          (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
          (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

NumOfBright := Trunc((Light+D)*2); // Яркость, от 0 до 508
NumOfContrast := Trunc(Z); // Контрастность, от 0 до 127
NumOfShade := Trunc(Xmain+1); // Оттенок, от 0 до 1529 +1
end;


procedure TForm3.RGB_ByBSC(NumOfBright,NumOfShade,NumOfContrast:integer;
                    out R,G,B:integer); // Найти RGB по яркости, оттенку и контрастности - Delphi
var
// Переменные
Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
Zero2, k, Y2, Xc2, Zcontrast,
Yarkost, Lc, Zmax2, NoRow254,
RGBmax2, RGBmin2, RGBmid2,
Xall, Xall2, Xx, Xx2, Xborder, Xout, SkipRow1,
Qrgbmax, Qrgbmin, Qrgbmid : Extended;
begin
BGW := 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
//------------------------------------------------Поменять значения «Яркость» - «Контрастность» ----------------------------------------------
Yarkost := NumOfBright/2; // Яркость
Zcontrast := NumOfContrast; // Контрастность
D := Yarkost-Trunc(Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
Yarkost := trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'

Lc := 1-Ceil(((127-Zcontrast)-Zmax2)/128);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := (Zcontrast)*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контраст., за пределами Zmax2, то Zcontrast=Zmax2
//-----------------------------------------------------------------------Поменять «Цвет» --------------------------------------------------------------------
  Xall := NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
  Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
  Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 SkipRow1 := Trunc((127-Zcontrast)/126)*(D*2)*(1-Lc);  // При D=0,5 и Z=1, SkipRow1=1, иначе 0

Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет (Координата по оси X, на общей сетке коорд.)

   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));
   Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));

//---------------Ниже, можно использовать формулы, по отдельности для - «Яркость-Контрастность» или «Цвет»-----------

Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Z)
 Y2 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)

 Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)

 //Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Коорд. по оси X, на общей сетке координат (Если не исп. формулы цвета)

 // Поменять значение оттенка, контрастности (если за пределами) ******************************
 TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно

 TrackBar_2.Position := trunc(Xx+1); // Новый оттенок
 TrackBar_3.Position := trunc(Zcontrast); // Новая контрастность

 TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
 // ****************************************************************************

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254);
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y2/2)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
end;

procedure TForm3.Change_RGB(R,G,B,
     NumOfBright_Before,NumOfBright_New,
     NumOfShade_Before,NumOfShade_New,
     NumOfContrast:integer;out R2,G2,B2:integer); // Поменять цвет RGB - Delphi
var
// Переменные
RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
Light, BGW, D, D2, E, Q, Qp, Qa, LR,
Y1, Xc, Y2, Xc2, Zero, Zero2, k, Z, Xx2,
Lc,  Zmax, NoRow254, Yarkost, Zcontrast, Zmax2,
RGBmax2, RGBmin2, RGBmid2, Xmain,
Xall, Xall2, Xx, Xborder, Xout,
SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid : Extended;
begin
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета

//-------------Поменять значения «Яркость» ------------------------------------------------
 // Чтобы оставить знач. яркости в прежнем состоянии, можно закомментировать 3 нижние строки и поменять 4-ую  "Zmax2 := Zmax;"
Yarkost := NumOfBright_New / 2; // Яркость
D := Yarkost-Trunc(Yarkost); // Четная (D2=0) или нечетная (D2=0.5) яркость
Yarkost := Trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'

E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;

 if (CheckBox_1.Checked=false) then // Если нужно сохранять пропорции (яркость - контрастность)
 begin
  Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
  Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
 end
 else
 begin
  Zmax := (127-D*2)*BGW; // Максимальное количество рядов на яркости 'Light'
  Z := (127-Zmax)*BGW; // Контрастность (Номер ряда с цветом)
 end;

  // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
   if NumOfShade_New<0 then Lc := 1 else Lc := 0;
  // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
   Xmain := NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
   Lc := Trunc(Xmain/1530); // Если Xmain>1529, то Lc=1, иначе Lc=0
   Xmain := Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall := Xmain+1;

//--------------Поменять «Цвет» -----------------------------------------------------------------------
     Xall := Xmain; // Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
 Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

//-------------Поменять значение «Контрастность» ------------------------------------------------
 // Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
Zcontrast := NumOfContrast; // Контрастность

 Lc := 1-Ceil(((127-Zcontrast)-Zmax)/128); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax

 if (NumOfBright_Before <> NumOfBright_New) then // Если яркость меняется вручную
 begin
  Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
  // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
  Zero := 1-Ceil(Zmax/127); // Переменная, для исключения деления на ноль
  Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
 end
 else // Если яркость меняется программно
 begin
  Lc := 1-Ceil(((127-Zcontrast)-Zmax2)/128); // Если Zcontrast меньше или равен Zmax2 , то Lc=1, иначе Lc=0
  Zcontrast := Zcontrast*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контрастность, за пределами Zmax2, то Z=Zmax2

  Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
  // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
  Zero := 1-Ceil(Zmax2/127); // Переменная, для исключения деления на ноль
  Main_NumOfContrast3 := trunc(127 - (Round((Zmax/(Zmax2+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc)));  // Ряд-Контрастность , при «Yarkost»
 end;

 Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
 Y1 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
 Xc := abs((Y1*LR)-Round(abs(k-LR)*Y1)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
 Xx := (127-Y1/2)+Xc+(Q-1)*255; // Цвет - на контрастности Zcontrast

//------------------- Если оттенок меняется вручную ----------------------------------------------------------------
  if (NumOfShade_Before <> NumOfShade_New) then
  begin
  // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
   if NumOfShade_New<0 then Lc := 1 else Lc := 0;
  // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
   Xmain := NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
   Lc := Trunc(Xmain/1530); // Если Xmain>1529, то Lc=1, иначе Lc=0
   Xmain := Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall := Xmain+1;

     Xall := Xmain; // Координата выбранной ячейки с цветом, по оси X
   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
      Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
      Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
     Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
     E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
     Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
      Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
      Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
      Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
      LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
     Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
     Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
    SkipRow1 := Trunc((127-Zcontrast)/126)*(D*2)*(1-Lc);  // При D=0,5 и Zcontrast=1, SkipRow1=1, иначе 0

   // Оттенок относительно контрастности Zcontrast
   Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
   LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет - на контрастности Zcontrast

   Xx := (abs(Xx)+Xx)/2; // Если Xx меньше 0, то Xx = 0, иначе оставить то же число
   if Xx>1529 then Xx := 0;

     Q := Ceil((Xx+1)/255);    // Номер выбранного треугольника
     E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
     Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
      Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
      Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
      Xc := Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
      LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
     Lc := 1-Ceil(Trunc(abs((Xx-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
     Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

   // Оттенок относительно контрастности Zcontrast
   Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль

  //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
   k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
   Y2 := ((127-Z)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
   Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
   Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast
   Main_NumOfShade3 := trunc(Xx2+1);
  end
  else // Если оттенок меняется программно
  begin
     Q := Ceil((Xx+1)/255);    // Номер выбранного треугольника
     E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
     Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
      Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
      Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
      Xc := Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
      LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
     Lc := 1-Ceil(Trunc(abs((Xx-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
     Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
  end;

   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));
   Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254);
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y1/2)-Xc)+(RGBmin2*(1-E)-RGBmax2*E));
//---------------------------- Полученный цвет RGB -----------------------------------------------
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R2:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G2:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B2:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));

//---------------------------- Указать новый оттенок, контрастность -----------------------------------------------
 TrackBarProgramChange := true; // Программное изменение оттенка, контрастности
  // Чтобы процедура выполнялась только один раз
  Main_NumOfShade2 := trunc(Xx*BGW+1);
  Main_NumOfContrast2 := trunc(Zcontrast*BGW);
  ///////////////////////////////////////////////
  TrackBar_5.Position := trunc(Xx*BGW+1); // Новый оттенок (Xx=0..1529, +1 для переброса между значениями)
  TrackBar_6.Position := trunc(Zcontrast*BGW); // Новая контрастность
 TrackBarProgramChange := false; // Ручное изменение оттенка, контрастности
end;

end.

C# Unity3D:
+ Поменять цвет RGB (2)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColorRGB_2 : MonoBehaviour {

  private int Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, // Яркость, Оттенок, Контрастность
  Main_NumOfBright2, Main_NumOfShade2, Main_NumOfShade3,
  Main_NumOfContrast2, Main_NumOfContrast3, // Яркость2, Оттенок2, Контрастность2
  Main_R, Main_G, Main_B, Main_R2, Main_G2, Main_B2;
  private bool CheckBox_1; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции        


  void Start () {
   CheckBox_1 = false; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции

   Main_NumOfBright = 254; // Яркость
   Main_NumOfShade = 128;  // Оттенок
   Main_NumOfContrast = 0; // Контрастность
   Main_NumOfBright2 = 254; // Яркость2
   Main_NumOfShade2 = 128;  // Оттенок2
   Main_NumOfContrast2 = 0; // Контрастность2
   Main_NumOfShade3 = 128;  // Оттенок2 (для контрастности)
   Main_NumOfContrast3 = 0; // Контрастность2 (для яркости)

   Main_R = 255;
   Main_G = 0;
   Main_B = 0;
   Main_R2 = 255;
   Main_G2 = 0;
   Main_B2 = 0;

   TrackBar_1 = 254; // Яркость
   TrackBar_2 = 128;  // Оттенок
   TrackBar_3 = 0; // Контрастность
   TrackBar_4 = 254; // Яркость2
   TrackBar_5 = 128;  // Оттенок2
   TrackBar_6 = 0; // Контрастность2

   TrackBar_1_Check = TrackBar_1;
   TrackBar_2_Check = TrackBar_2;
   TrackBar_3_Check = TrackBar_3;
   TrackBar_4_Check = TrackBar_4;
   TrackBar_5_Check = TrackBar_5;
   TrackBar_6_Check = TrackBar_6;

   // Стиль для текстовых полей 
   largeFont_RGB.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
   largeFont_RGB.fontSize = 14;
   largeFont_RGB.normal.textColor = Color.black;
   styleColor_Label.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
   styleColor_Label.fontSize = 14;
   styleColor_Label.normal.textColor = Color.black;
   styleColor_Label_4.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
   styleColor_Label_4.fontSize = 9;
   styleColor_Label_4.normal.textColor = Color.black;
  }

  // Кнопка /////////////////////////////////////////////
  private Rect boxOfGUI_Button_1 = new Rect (390, 219, 80, 30); // Положение кнопки (+ оттенок)
  // Текстовые поля
  private GUIStyle largeFont_RGB = new GUIStyle("textField"); // Стиль текстовых полей RGB
  private bool RGB1_Changed; // Если RGB1 изменен
  private string sToEdit_Check_R1,sToEdit_Check_G1,sToEdit_Check_B1; // Для проверки изменения текста
  private string stringToEdit_R1 = "127"; // Текст "R" (Указываемый цвет)
  private Rect boxOfGUI_Edit_R1 = new Rect (38, 188, 40, 20); // Положение текстового поля "R" (Указываемый цвет)
  private string stringToEdit_G1 = "0"; // Текст "G" (Указываемый цвет)
  private Rect boxOfGUI_Edit_G1 = new Rect (102, 188, 40, 20); // Положение текстового поля "G" (Указываемый цвет)
  private string stringToEdit_B1 = "0"; // Текст "B" (Указываемый цвет)
  private Rect boxOfGUI_Edit_B1 = new Rect (167, 188, 40, 20); // Положение текстового поля "B" (Указываемый цвет)
  private string stringToEdit_R2 = "127"; // Текст "R" (Результат)
  private Rect boxOfGUI_Edit_R2 = new Rect (38, 424, 40, 20); // Положение текстового поля "R" (Результат)
  private string stringToEdit_G2 = "0"; // Текст "G" (Результат)
  private Rect boxOfGUI_Edit_G2 = new Rect (102, 424, 40, 20); // Положение текстового поля "G" (Результат)
  private string stringToEdit_B2 = "0"; // Текст "B" (Результат)
  private Rect boxOfGUI_Edit_B2 = new Rect (167, 424, 40, 20); // Положение текстового поля "B" (Результат)
  private string stringToEdit_PlusShade = "1"; // Текст (+ Оттенок)
  private Rect boxOfGUI_Edit_PlusShade = new Rect (330, 224, 50, 20); // Положение текстового поля  (+ Оттенок)
  private float R_timeLeft, G_timeLeft, B_timeLeft, PS_timeLeft; // Таймер чтобы не прокручивать значения слишком быстро
  // Изображения
  private GUIStyle styleColor_Image_1 = new GUIStyle("textField"); // Изображение (Указываемый цвет)
  private GUIStyle styleColor_Image_2 = new GUIStyle("textField"); // Изображение (Результат)
  private Rect boxOfGUI_Image_1 = new Rect (280, 24, 169, 185); // Положение изображения (Указываемый цвет)
  private Rect boxOfGUI_Image_2 = new Rect (280, 260, 169, 185); // Положение изображения (Результат)
  // Ползунки
  private Rect boxOfGUI_TrackBar_1 = new Rect (32, 40, 211, 22); // Положение ползунка яркости (Указываемый цвет)
  private Rect boxOfGUI_TrackBar_2 = new Rect (32, 88, 211, 22); // Положение ползунка оттенка (Указываемый цвет)
  private Rect boxOfGUI_TrackBar_3 = new Rect (32, 131, 211, 22); // Положение ползунка контрастности (Указываемый цвет)
  private Rect boxOfGUI_TrackBar_4 = new Rect (32, 276, 211, 22); // Положение ползунка яркости (Результат)
  private Rect boxOfGUI_TrackBar_5 = new Rect (32, 325, 211, 22); // Положение ползунка оттенка (Результат)
  private Rect boxOfGUI_TrackBar_6 = new Rect (32, 367, 211, 22); // Положение ползунка контрастности (Результат)
  float TrackBar_1, TrackBar_2, TrackBar_3, // Ползунки яркости, оттенка, контрастности (Указываемый цвет)
  TrackBar_4, TrackBar_5, TrackBar_6,       // Ползунки яркости, оттенка, контрастности (Результат)
  TrackBar_1_Check, TrackBar_2_Check, TrackBar_3_Check, // Для проверки изменения позиций
  TrackBar_4_Check, TrackBar_5_Check, TrackBar_6_Check;
  private float TrackBar_1_timeLeft, TrackBar_2_timeLeft, TrackBar_3_timeLeft,
  TrackBar_4_timeLeft, TrackBar_5_timeLeft, TrackBar_6_timeLeft; // Таймер чтобы не прокручивать значения слишком быстро
  private bool TrackBar_WheelChanged; // true - TrackBar изменен колесиком мыши
  // Label
  private GUIStyle styleColor_Label = new GUIStyle("textField"); // Стиль
  private GUIStyle styleColor_Label_4 = new GUIStyle("textField"); // Стиль
  private Rect boxOfGUI_Label_1 = new Rect (38, 14, 156, 23); // Положение Label - яркость RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_2 = new Rect (38, 62, 119, 23); // Положение Label - оттенок RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_3 = new Rect (38, 106, 140, 23); // Положение Label - контрастность RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_4 = new Rect (50, 171, 145, 13); // Положение Label - RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_5 = new Rect (38, 250, 156, 23); // Положение Label - яркость RGB (Результат)
  private Rect boxOfGUI_Label_6 = new Rect (38, 298, 119, 23); // Положение Label - оттенок RGB (Результат)
  private Rect boxOfGUI_Label_7 = new Rect (38, 343, 140, 23); // Положение Label - контрастность RGB (Результат)
  private Rect boxOfGUI_Label_8 = new Rect (50, 407, 145, 13); // Положение Label - RGB (Результат)
  // Чекбокс
  private Rect boxOfGUI_CheckBox_1 = new Rect (38, 215, 280, 25); // Label - яркость RGB (Указываемый цвет)
  ///////////////////////////////////////////////////////////////

  private Texture2D MakeTex(int width, int height, Color col) // Создать текстуру определенного цвета
  {
   Color[] pix = new Color[width*height];

   for(int i = 0; i < pix.Length; i++)
    pix[i] = col;

   Texture2D result = new Texture2D(width, height);
   result.SetPixels(pix);
   result.Apply();

   return result;
  }


  void OnGUI () {
   // Текстовые поля /////////////////////////////////////////////

   // Текстовые поля "RGB" (Указываемый цвет)
   stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString(), 3, largeFont_RGB);  
   stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString(), 3, largeFont_RGB);  
   stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString(), 3, largeFont_RGB);  
   // Текстовые поля "RGB" (Результат)
   stringToEdit_R2 = GUI.TextField (boxOfGUI_Edit_R2, Main_R2.ToString(), 3, largeFont_RGB);  
   stringToEdit_G2 = GUI.TextField (boxOfGUI_Edit_G2, Main_G2.ToString(), 3, largeFont_RGB);  
   stringToEdit_B2 = GUI.TextField (boxOfGUI_Edit_B2, Main_B2.ToString(), 3, largeFont_RGB);  
   // Текстовое поле (+ Оттенок)
   stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, stringToEdit_PlusShade, 5, largeFont_RGB);  

   if (boxOfGUI_Edit_R1.Contains (Event.current.mousePosition)) { // Если курсор над R1
    if (Time.fixedTime > R_timeLeft) {
     if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
      R_timeLeft = Time.fixedTime + 0.01f; 
      if (Main_R < 255) {
       Main_R = Main_R + 1;
       stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
       RGB1_Changed = true; // true - RGB1 изменен
      }
     } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
      R_timeLeft = Time.fixedTime + 0.01f;  
      if (Main_R > 0) {     
       Main_R = Main_R - 1;
       stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
       RGB1_Changed = true; // true - RGB1 изменен
      }
     }
    }
   }
   else
    if (boxOfGUI_Edit_G1.Contains (Event.current.mousePosition)) { // Если курсор над G1
     if (Time.fixedTime > G_timeLeft) {
      if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
       G_timeLeft = Time.fixedTime + 0.01f; 
       if (Main_G < 255) {
        Main_G = Main_G + 1;
        stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
        RGB1_Changed = true; // true - RGB1 изменен
       }
      } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
       G_timeLeft = Time.fixedTime + 0.01f;  
       if (Main_G > 0) {     
        Main_G = Main_G - 1;
        stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
        RGB1_Changed = true; // true - RGB1 изменен
       }
      }
     }
    }
    else
     if (boxOfGUI_Edit_B1.Contains (Event.current.mousePosition)) { // Если курсор над B1
      if (Time.fixedTime > B_timeLeft) {
       if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
        B_timeLeft = Time.fixedTime + 0.01f; 
        if (Main_B < 255) {
         Main_B = Main_B + 1;
         stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
         RGB1_Changed = true; // true - RGB1 изменен
        }
       } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
        B_timeLeft = Time.fixedTime + 0.01f;  
        if (Main_B > 0) {     
         Main_B = Main_B - 1;
         stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
         RGB1_Changed = true; // true - RGB1 изменен
        }
       }
      }
     }  
     else
      if (boxOfGUI_Edit_PlusShade.Contains (Event.current.mousePosition)) { // Если курсор над (+ Оттенок)
       if (Time.fixedTime > PS_timeLeft) {
        if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
         PS_timeLeft = Time.fixedTime + 0.01f; 
         int textnumber1;
         int.TryParse(stringToEdit_PlusShade, out textnumber1); // Строку в число
         if (textnumber1 < 1529) {
          textnumber1 = textnumber1 + 1;
          stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
         }
        } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
         PS_timeLeft = Time.fixedTime + 0.01f;  
         int textnumber1;
         int.TryParse(stringToEdit_PlusShade, out textnumber1); // Строку в число
         if (textnumber1 > -1529) {     
          textnumber1 = textnumber1 - 1;
          stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
         }
        }
       }
      }
   
   // Изображения /////////////////////////////////////////////

   GUI.Label (boxOfGUI_Image_1, "", styleColor_Image_1); // Изображение (Указываемый цвет)
   GUI.Label (boxOfGUI_Image_2, "", styleColor_Image_2); // Изображение (Результат)

   // Ползунки /////////////////////////////////////////////
   TrackBar_1 = GUI.HorizontalSlider (boxOfGUI_TrackBar_1, TrackBar_1, 0.0F, 508.0F); // Ползунок яркости (Указываемый цвет)
   TrackBar_2 = GUI.HorizontalSlider (boxOfGUI_TrackBar_2, TrackBar_2, 0.0F, 1531.0F); // Ползунок оттенка (Указываемый цвет)
   TrackBar_3 = GUI.HorizontalSlider (boxOfGUI_TrackBar_3, TrackBar_3, 0.0F, 127.0F); // Ползунок контрастности (Указываемый цвет)
   TrackBar_4 = GUI.HorizontalSlider (boxOfGUI_TrackBar_4, TrackBar_4, 0.0F, 508.0F); // Ползунок яркости (Результат)
   TrackBar_5 = GUI.HorizontalSlider (boxOfGUI_TrackBar_5, TrackBar_5, 0.0F, 1531.0F); // Ползунок оттенка (Результат)
   TrackBar_6 = GUI.HorizontalSlider (boxOfGUI_TrackBar_6, TrackBar_6, 0.0F, 127.0F); // Ползунок контрастности (Результат)


   if (boxOfGUI_TrackBar_1.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_1
    if (Time.fixedTime > TrackBar_1_timeLeft) {
     if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
      TrackBar_1_timeLeft = Time.fixedTime + 0.01f; 
      if (TrackBar_1 > 0) {     
       TrackBar_1 = TrackBar_1 - 1;
       TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
      }
     } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
      TrackBar_1_timeLeft = Time.fixedTime + 0.01f;  
      if (TrackBar_1 < 508) {
       TrackBar_1 = TrackBar_1 + 1;
       TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
      }
     }
    } 
   }
   else
    if (boxOfGUI_TrackBar_2.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_2
     if (Time.fixedTime > TrackBar_2_timeLeft) {
      if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
       TrackBar_2_timeLeft = Time.fixedTime + 0.01f; 
       if (TrackBar_2 > 0) {     
        TrackBar_2 = TrackBar_2 - 1;
        TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
       }
      }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
       TrackBar_2_timeLeft = Time.fixedTime + 0.01f;  
       if (TrackBar_2 < 1531) {
        TrackBar_2 = TrackBar_2 + 1;
        TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
       }
      }
     } 
    }
    else
     if (boxOfGUI_TrackBar_3.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_3
      if (Time.fixedTime > TrackBar_3_timeLeft) {
       if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
        TrackBar_3_timeLeft = Time.fixedTime + 0.01f; 
        if (TrackBar_3 > 0) {     
         TrackBar_3 = TrackBar_3 - 1;
         TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
        }
       }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
        TrackBar_3_timeLeft = Time.fixedTime + 0.01f;  
        if (TrackBar_3 < 127) {
         TrackBar_3 = TrackBar_3 + 1;
         TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
        }
       }
      } 
     }
     else
      if (boxOfGUI_TrackBar_4.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_4
       if (Time.fixedTime > TrackBar_4_timeLeft) {
        if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
         TrackBar_4_timeLeft = Time.fixedTime + 0.01f; 
         if (TrackBar_4 > 0) {     
          TrackBar_4 = TrackBar_4 - 1;
          TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
         }
        }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
         TrackBar_4_timeLeft = Time.fixedTime + 0.01f;  
         if (TrackBar_4 < 508) {
          TrackBar_4 = TrackBar_4 + 1;
          TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
         }
        }
       } 
      }
      else
       if (boxOfGUI_TrackBar_5.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_5
        if (Time.fixedTime > TrackBar_5_timeLeft) {
         if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
          TrackBar_5_timeLeft = Time.fixedTime + 0.01f; 
          if (TrackBar_5 > 0) {     
           TrackBar_5 = TrackBar_5 - 1;
           TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
          }
         }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
          TrackBar_5_timeLeft = Time.fixedTime + 0.01f;  
          if (TrackBar_5 < 1531) {
           TrackBar_5 = TrackBar_5 + 1;
           TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
          }
         }
        } 
       }
       else
        if (boxOfGUI_TrackBar_6.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_6
         if (Time.fixedTime > TrackBar_6_timeLeft) {
          if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
           TrackBar_6_timeLeft = Time.fixedTime + 0.01f; 
           if (TrackBar_6 > 0) {     
            TrackBar_6 = TrackBar_6 - 1;
            TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
           }
          }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
           TrackBar_6_timeLeft = Time.fixedTime + 0.01f;  
           if (TrackBar_6 < 127) {
            TrackBar_6 = TrackBar_6 + 1;
            TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
           }
          }
         } 
        } 


   if ((GUI.changed == true) | (TrackBar_WheelChanged)) { // Если были произведены изменения или TrackBar изменен колесиком мыши
    TrackBar_WheelChanged = false; // true - TrackBar изменен колесиком мыши

    if (sToEdit_Check_R1 != stringToEdit_R1) { // Если R1 изменен
     int.TryParse (stringToEdit_R1, out Main_R); // Перевести текст в число
     if (Main_R < 0)
      Main_R = 0;
     else if (Main_R > 255)
      Main_R = 255;
     stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
     sToEdit_Check_R1 = stringToEdit_R1;
     RGB1_Changed = true; // true - RGB1 изменен
    }

    if (sToEdit_Check_G1 != stringToEdit_G1) { // Если G1 изменен
     int.TryParse (stringToEdit_G1, out Main_G); // Перевести текст в число
     if (Main_G < 0)
      Main_G = 0;
     else if (Main_G > 255)
      Main_G = 255;
     stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
     sToEdit_Check_G1 = stringToEdit_G1;
     RGB1_Changed = true; // true - RGB1 изменен
    }

    if (sToEdit_Check_B1 != stringToEdit_B1) { // Если B1 изменен
     int.TryParse (stringToEdit_B1, out Main_B); // Перевести текст в число
     if (Main_B < 0)
      Main_B = 0;
     else if (Main_B > 255)
      Main_B = 255;
     stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
     sToEdit_Check_B1 = stringToEdit_B1;
     RGB1_Changed = true; // true - RGB1 изменен
    }



    if (TrackBar_1_Check != TrackBar_1) { 
     if (TrackBar_1 > TrackBar_1_Check)
      TrackBar_1 = Mathf.CeilToInt (TrackBar_1); // Получить целое число
     else TrackBar_1 = Mathf.FloorToInt (TrackBar_1);
     TrackBar_1_Check = TrackBar_1;

     if (TrackBar_1 != Main_NumOfBright) { // Выполнить процедуру только 1 раз   

      Main_NumOfBright = Mathf.FloorToInt(TrackBar_1); // Яркость
      Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
     }
    }

    if (TrackBar_2_Check != TrackBar_2) {
     if (TrackBar_2 > TrackBar_2_Check)
      TrackBar_2 = Mathf.CeilToInt (TrackBar_2); // Получить целое число
     else TrackBar_2 = Mathf.FloorToInt (TrackBar_2);
     TrackBar_2_Check = TrackBar_2;

     if (TrackBar_2 != Main_NumOfShade) { // Выполнить процедуру только 1 раз   

      Main_NumOfShade = Mathf.FloorToInt(TrackBar_2); // Оттенок
      Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
     }
    }

    if (TrackBar_3_Check != TrackBar_3) { 
     if (TrackBar_3 > TrackBar_3_Check)
      TrackBar_3 = Mathf.CeilToInt (TrackBar_3); // Получить целое число
     else TrackBar_3 = Mathf.FloorToInt (TrackBar_3);
     TrackBar_3_Check = TrackBar_3;

     if (TrackBar_3 != Main_NumOfContrast) { // Выполнить процедуру только 1 раз   

      Main_NumOfContrast = Mathf.FloorToInt(TrackBar_3); // Контрастность
      Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
     }
    }


    if (TrackBar_4_Check != TrackBar_4) {
     if (TrackBar_4 > TrackBar_4_Check)
      TrackBar_4 = Mathf.CeilToInt (TrackBar_4); // Получить целое число
     else TrackBar_4 = Mathf.FloorToInt (TrackBar_4);
     TrackBar_4_Check = TrackBar_4;

     if (TrackBar_4 != Main_NumOfBright2) // Выполнить процедуру только 1 раз   
     {
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
       Main_NumOfBright2, Mathf.FloorToInt(TrackBar_4),
       Main_NumOfShade3, Main_NumOfShade3,
       Main_NumOfContrast3,
       out Main_R2, out Main_G2, out Main_B2);

      Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_4); // Яркость
      // Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_5); // Оттенок
      // Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_6); // Контрастность

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     }

    }

    if (TrackBar_5_Check != TrackBar_5) { 
     if (TrackBar_5 > TrackBar_5_Check)
      TrackBar_5 = Mathf.CeilToInt (TrackBar_5); // Получить целое число
     else TrackBar_5 = Mathf.FloorToInt (TrackBar_5);
     TrackBar_5_Check = TrackBar_5;

     if (TrackBar_5 != Main_NumOfShade2) // Выполнить процедуру только 1 раз   
     {
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
       Main_NumOfBright2, Main_NumOfBright2,
       Main_NumOfShade2, Mathf.FloorToInt(TrackBar_5),
       Main_NumOfContrast2,
       out Main_R2, out Main_G2, out Main_B2);

      Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_5); // Оттенок

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     }

    }

    if (TrackBar_6_Check != TrackBar_6) { 
     if (TrackBar_6 > TrackBar_6_Check)
      TrackBar_6 = Mathf.CeilToInt (TrackBar_6); // Получить целое число
     else TrackBar_6 = Mathf.FloorToInt (TrackBar_6);
     TrackBar_6_Check = TrackBar_6;

     if (TrackBar_6 != Main_NumOfContrast2) // Выполнить процедуру только 1 раз   
     {
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
       Main_NumOfBright2, Main_NumOfBright2,
       Main_NumOfShade3, Main_NumOfShade3,
       Mathf.FloorToInt(TrackBar_6),
       out Main_R2, out Main_G2, out Main_B2);

      Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_6); // Контрастность

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     }

    }
   }

   if (RGB1_Changed) { // Если RGB1 изменен
    RGB1_Changed = false; // true - RGB1 изменен
    Find_BSC_AndMake_TheSameColor (); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
   }


   // Label /////////////////////////////////////////////

   GUI.Label (boxOfGUI_Label_1, "Яркость: "+TrackBar_1.ToString()+" ("+(TrackBar_1/2).ToString()+")", styleColor_Label); // Label - яркость RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_2, "Оттенок: "+(TrackBar_2-1).ToString(), styleColor_Label); // Label - оттенок RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_3, "Контрастность: "+TrackBar_3.ToString(), styleColor_Label); // Label - контрастность RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_4, "R                   G                    B", styleColor_Label_4); // Label - RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_5, "Яркость: "+TrackBar_4.ToString()+" ("+(TrackBar_4/2).ToString()+")", styleColor_Label); // Label - яркость RGB (Результат)
   GUI.Label (boxOfGUI_Label_6, "Оттенок: "+(TrackBar_5-1).ToString(), styleColor_Label); // Label - оттенок RGB (Результат)
   GUI.Label (boxOfGUI_Label_7, "Контрастность: "+TrackBar_6.ToString(), styleColor_Label); // Label - контрастность RGB (Результат)
   GUI.Label (boxOfGUI_Label_8, "R                   G                    B", styleColor_Label_4); // Label - RGB (Результат)

   // Чекбокс /////////////////////////////////////////////
   CheckBox_1 = GUI.Toggle (boxOfGUI_CheckBox_1, CheckBox_1, "<color=white><size=11>Не сохранять пропорции (яркость - контрастность)</size></color>");

   // Кнопка /////////////////////////////////////////////
   if ((GUI.Button (boxOfGUI_Button_1, "+ Оттенок")) | // Если нажата кнопка "+ Оттенок"
    (Event.current.keyCode == KeyCode.Return)) {     // Или нажата клавиша "Enter"
    if (Time.fixedTime > PS_timeLeft) {
     PS_timeLeft = Time.fixedTime + 0.01f; 

     int textnumber1;
     int.TryParse (stringToEdit_PlusShade, out textnumber1); // Строку в число
     if (textnumber1 < -1529) {
      textnumber1 = -1529;
      stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
     }
     if (textnumber1 > 1529) {
      textnumber1 = 1529;
      stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
     }

     // Поменять цвет RGB - Delphi
     Change_RGB (Main_R, Main_G, Main_B,
      Main_NumOfBright2, Main_NumOfBright2,
      Main_NumOfShade2, Mathf.FloorToInt (TrackBar_5 + textnumber1),
      Main_NumOfContrast2,
      out Main_R2, out Main_G2, out Main_B2);

     Main_NumOfShade2 = Mathf.FloorToInt (TrackBar_5); // Оттенок

     Show_Changed_Color (); // Установить значения нижних текстовых полей     
    }
   }

  }

  public bool Show_Changed_Color() // Установить значения нижних текстовых полей
  {
   stringToEdit_R1 = Main_R2.ToString();
   stringToEdit_G1 = Main_G2.ToString();
   stringToEdit_B1 = Main_B2.ToString();

   styleColor_Image_2.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
    new Color (Main_R2 / 255f, Main_G2 / 255f, Main_B2 / 255f)); // Заполнить изображение 2 цветом R,G,B

   return true;
  }


  public bool Find_BSC_AndMake_TheSameColor() // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
  {
   // Яркость, оттенок, контрастность, по RGB - C# Unity3D
   BSC_ByRGB(Main_R,Main_G,Main_B, out Main_NumOfBright, out Main_NumOfShade, out Main_NumOfContrast);
   TrackBar_1_Check = Main_NumOfBright;
   TrackBar_2_Check = Main_NumOfShade;
   TrackBar_3_Check = Main_NumOfContrast;
   TrackBar_1 = Main_NumOfBright;
   TrackBar_2 = Main_NumOfShade;
   TrackBar_3 = Main_NumOfContrast;

   styleColor_Image_1.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_1.width), Mathf.FloorToInt(boxOfGUI_Image_1.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B

   stringToEdit_R2 = Main_R.ToString();
   stringToEdit_G2 = Main_G.ToString();
   stringToEdit_B2 = Main_B.ToString();
   Main_R2 = Main_R;
   Main_G2 = Main_G;
   Main_B2 = Main_B;

   styleColor_Image_2.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 2 цветом R,G,B

   TrackBar_4_Check = TrackBar_1;
   TrackBar_5_Check = TrackBar_2;
   TrackBar_6_Check = TrackBar_3;
   TrackBar_4 = TrackBar_1;
   TrackBar_5 = TrackBar_2;
   TrackBar_6 = TrackBar_3;
   Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_1);
   Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfShade3 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_3);
   Main_NumOfContrast3 = Mathf.FloorToInt(TrackBar_3);
   return true;
  }

  public bool Find_RGB_AndMake_TheSameColor() // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
  {
   // Найти RGB по яркости, оттенку и контрастности - Delphi
   RGB_ByBSC(Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast, out Main_R, out Main_G, out Main_B);
   sToEdit_Check_R1 = Main_R.ToString();
   sToEdit_Check_G1 = Main_G.ToString();
   sToEdit_Check_B1 = Main_B.ToString();
   stringToEdit_R1 = Main_R.ToString();
   stringToEdit_G1 = Main_G.ToString();
   stringToEdit_B1 = Main_B.ToString();

   styleColor_Image_1.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_1.width), Mathf.FloorToInt(boxOfGUI_Image_1.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B

   stringToEdit_R2 = Main_R.ToString();
   stringToEdit_G2 = Main_G.ToString();
   stringToEdit_B2 = Main_B.ToString();
   Main_R2 = Main_R;
   Main_G2 = Main_G;
   Main_B2 = Main_B;

   styleColor_Image_2.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 2 цветом R,G,B

   TrackBar_4_Check = TrackBar_1;
   TrackBar_5_Check = TrackBar_2;
   TrackBar_6_Check = TrackBar_3;
   TrackBar_4 = TrackBar_1;
   TrackBar_5 = TrackBar_2;
   TrackBar_6 = TrackBar_3;
   Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_1);
   Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfShade3 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_3);
   Main_NumOfContrast3 = Mathf.FloorToInt(TrackBar_3);
   return true;
  }


  public bool BSC_ByRGB(int R, int G, int B,
   out int NumOfBright, out int NumOfShade, out int NumOfContrast) // Яркость, оттенок, контрастность, по RGB - Delphi
  {
   // Переменные
   //int NumOfBright1,NumOfContrast1,NumOfShade1;
   //int R, G, B;
   float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
   Light, BGW, D, E, Q, Zmax, Z, Qp,  LR, Y1, Xc, Xmain;

   //R = … ;  G = … ;  B = … ;
   // Найти максимальное, минимальное и среднее значение из заданных R,G,B
   RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmid=(R+G+B)-(RGBmax+RGBmin);
   // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
   Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
   Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
   Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
   BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
   D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
   Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета
   E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   // Номер треугольника
   Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;
   Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
   Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
   Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
   Qp = Q-Mathf.FloorToInt(Q/4f)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
   // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
   LR = (1-Mathf.Abs(Bm-1))*Mathf.FloorToInt((Qp-1)/2f)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
    (1-Mathf.Abs(Rm-1))*(1-Mathf.Abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
    (1-Mathf.Abs(Gm-1))*(1-Mathf.CeilToInt((Qp-1)/2f));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
   Xc = Mathf.Abs((Light-RGBmin)*(1-LR*2)-Mathf.Abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
   Xmain = ((127-Y1/2f)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

   NumOfBright = Mathf.FloorToInt((Light+D)*2); // Яркость, от 0 до 508
   NumOfContrast = Mathf.FloorToInt(Z); // Контрастность, от 0 до 127
   NumOfShade = Mathf.FloorToInt(Xmain+1); // Оттенок, от 0 до 1529 +1
   return true;   
  }

  public bool RGB_ByBSC(int NumOfBright, int NumOfShade, int NumOfContrast,
   out int R, out int G, out int B) // Найти RGB по яркости, оттенку и контрастности - Delphi
  {
   // Переменные:
   //int R, G, B;
   float Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
   Zero2, k, Y2, Xc2, Zcontrast, Yarkost, Lc, Zmax, NoRow254,
   RGBmax2, RGBmin2, RGBmid2, Xall, Xall2, Xx, Xx2, Xborder, Xout, 
   SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;

   Yarkost = NumOfBright/2f; // Яркость
   Zcontrast = NumOfContrast; // Контрастность

   BGW = 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
   D = Yarkost - Mathf.FloorToInt (Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
   Yarkost = Mathf.FloorToInt (Yarkost);
   Zmax = Mathf.FloorToInt (Mathf.Abs (127 - Mathf.Abs ((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
   Lc = 1 - Mathf.CeilToInt (((127 - Zcontrast) - Zmax) / 128f);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast = (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
   //------------------Поменять «Цвет» --------------------------------------
   Xall = NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X

   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout = Mathf.CeilToInt ((765 - Xall) / 766f) * ((1 - Mathf.CeilToInt (Xall / 1531f)) + Mathf.FloorToInt (Xall / 1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
   Q = Mathf.CeilToInt ((Xall2 + 1) / 255f);    // Номер выбранного треугольника
   E = 1 - (Q / 2f - Mathf.FloorToInt (Q / 2f)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   Y1 = (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
   Xborder = 127 - (Y1 / 2f); // Количество пустых ячеек, слева от треугольника
   Qa = (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
   Xc = Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR = Mathf.CeilToInt ((Xc / 254f) - 0.5f); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
   // КОРРЕКТИРОВКА
   // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
   Lc = 1 - Mathf.CeilToInt (Mathf.FloorToInt (Mathf.Abs ((Xall2 - Qa) - 127) / ((Y1 / 2f) + 1)) / 128f);
   Xc = (Xc - Xborder) * Lc + (Y1 * LR) * (1 - Lc); // Порядковый номер выбранной ячейки в треугольнике
   SkipRow1 = Mathf.FloorToInt ((127 - Zcontrast) / 126f) * (D * 2) * (1 - Lc); // При D=0,5 и Z=1, SkipRow1=1, иначе 0
   // Координата по оси X, на общей сетке координат
   Xx = Mathf.FloorToInt (((1530 * (1 - Mathf.CeilToInt ((Q - 1) / 6f)) + Qa - Xborder - 1 + (1 - 2 * E) * (D * 2)) * (1 - LR) +
    (Qa + 255 + Xborder - (1 - 2 * E) * (D * 2) - 1530 * Mathf.FloorToInt (Q / 6f)) * LR) *
    (1 - Lc - SkipRow1 + Mathf.Abs (Xout)) + (Xall - 1) * (Lc + SkipRow1 - Mathf.Abs (Xout)));
   //+++++++++++++++++++++++++++++++++++++++++++
   // = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
   Qrgbmax = Mathf.FloorToInt ((Q + ((1 - LR) * (-E) + LR * E) - (LR * Mathf.FloorToInt (Q / 6f) * 6)) / 2f);
   // = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
   Qrgbmin = ((Q + ((1 - LR) * (-(1 - E)) + LR * (1 - E)) + ((1 - LR) * ((1 - Mathf.CeilToInt ((Q - 1) / 6f)) * 6))) / 2f) - 1;
   Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   // = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
   Qrgbmid = (Qp + LR - (LR * Mathf.FloorToInt (Qp / 3f) * 3)) - 1;
   // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
   Rm = (1 - Mathf.CeilToInt (Qrgbmax / 2f)) * 2 + Mathf.FloorToInt (Qrgbmid / 2f);
   Gm = (1 - Mathf.Abs (Qrgbmax - 1)) * 2 + (1 - Mathf.Abs (Qrgbmid - 1));
   Bm = Mathf.FloorToInt (Qrgbmax / 2f) * 2 + (1 - Mathf.CeilToInt (Qrgbmid / 2f));

   //// Цвет RGB //////////////////////////////////////////////////////////////// 
   Zero2 = 1-Mathf.CeilToInt(Y1/254f);
   k = (1/(Y1+Zero2))*Xc;
   Y2 = ((127-Zcontrast)*2)+(D*4)*E;
   Xc2 = Mathf.Abs((Y2*LR)-Mathf.Round(Mathf.Abs(k-LR)*Y2));
   //Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

   // Поменять значение оттенка, контрастности (если за пределами) ******************************
   TrackBar_2_Check = Xx+1;
   TrackBar_3_Check = Zcontrast;

   TrackBar_2 = Xx+1; // Новый оттенок
   TrackBar_3 = Zcontrast; // Новая контрастность
   // ****************************************************************************

   // NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
   NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
   // Вычислить максимальное, минимальное и среднее значение
   RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
   RGBmin2 = Yarkost-(127-Zcontrast);
   RGBmid2 = Mathf.Abs(Mathf.Abs((Y2/2f)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

   // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R_main, G_main, B_main)
   R=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   G=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   B=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   return true;
  }

  public bool Change_RGB(int R, int G, int B,
   int NumOfBright_Before, int NumOfBright_New,
   int NumOfShade_Before, int NumOfShade_New,
   int NumOfContrast, out int R2, out int G2, out int B2) // Поменять цвет RGB - Delphi
  {
   // Переменные
   float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
   Light, BGW, D, E, Q, Qp, Qa, LR,
   Y1, Xc, Y2, Xc2, Zero, Zero2, k, Z, Xx2,
   Lc,  Zmax, NoRow254, Yarkost, Zcontrast, Zmax2,
   RGBmax2, RGBmin2, RGBmid2, Xmain,
   Xall, Xall2, Xx, Xborder, Xout,
   SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;

   RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmid=(R+G+B)-(RGBmax+RGBmin);
   // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
   Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
   Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
   Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
   BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
   D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
   Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета

   //-------------Поменять значения «Яркость» ------------------------------------------------
   // Чтобы оставить знач. яркости в прежнем состоянии, можно закомментировать 3 нижние строки и поменять 4-ую  "Zmax2 = Zmax;"
   Yarkost = NumOfBright_New / 2f; // Яркость
   D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D2=0) или нечетная (D2=0.5) яркость
   Yarkost = Mathf.FloorToInt(Yarkost);
   Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'

   E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   // Номер треугольника
   Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;

   if (!CheckBox_1) // Если нужно сохранять пропорции (яркость - контрастность)
   {
    Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
    Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
   }
   else
   {
    Zmax = (127-D*2)*BGW; // Максимальное количество рядов на яркости 'Light'
    Z = (127-Zmax)*BGW; // Контрастность (Номер ряда с цветом)
   }

   // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
   if (NumOfShade_New<0) Lc = 1; else Lc = 0;
   // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
   Xmain = NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
   Lc = Mathf.FloorToInt(Xmain/1530f); // Если Xmain>1529, то Lc=1, иначе Lc=0
   Xmain = Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall = Xmain+1;

   //--------------Поменять «Цвет» -----------------------------------------------------------------------
   Xall = Xmain; // Координата выбранной ячейки с цветом, по оси X
   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout =  Mathf.CeilToInt((765-Xall)/766f)*((1-Mathf.CeilToInt(Xall/1531f))+Mathf.FloorToInt(Xall/1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
   Q = Mathf.CeilToInt((Xall2+1)/255f);    // Номер выбранного треугольника
   E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
   Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
   Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc = Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
   Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
   Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

   //-------------Поменять значение «Контрастность» ------------------------------------------------
   // Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
   Zcontrast = NumOfContrast; // Контрастность

   Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast = Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax

   if (NumOfBright_Before != NumOfBright_New) // Если яркость меняется вручную
   {
    Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
    // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
    Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
    Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
   }
   else // Если яркость меняется программно
   {
    Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax2)/128f); // Если Zcontrast меньше или равен Zmax2 , то Lc=1, иначе Lc=0
    Zcontrast = Zcontrast*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контрастность, за пределами Zmax2, то Z=Zmax2

    Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
    // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
    Zero = 1-Mathf.CeilToInt(Zmax2/127f); // Переменная, для исключения деления на ноль
    Main_NumOfContrast3 = Mathf.FloorToInt(127 - (Mathf.RoundToInt((Zmax/(Zmax2+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc)));  // Ряд-Контрастность , при «Yarkost»
   }

   Zero2 = 1-Mathf.CeilToInt(Y1/254f); // Переменная, для исключения деления на ноль
   //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2f)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
   k = (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
   Y1 = ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
   Xc = Mathf.Abs((Y1*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y1)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
   Xx = (127-Y1/2f)+Xc+(Q-1)*255; // Цвет - на контрастности Zcontrast

   //------------------- Если оттенок меняется вручную ----------------------------------------------------------------
   if (NumOfShade_Before != NumOfShade_New)
   {
    // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
    if (NumOfShade_New<0) Lc = 1; else Lc = 0;
    // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
    Xmain = NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
    Lc = Mathf.FloorToInt(Xmain/1530f); // Если Xmain>1529, то Lc=1, иначе Lc=0
    Xmain = Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall = Xmain+1;

    Xall = Xmain; // Координата выбранной ячейки с цветом, по оси X
    // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
    Xout =  Mathf.CeilToInt((765-Xall)/766f)*((1-Mathf.CeilToInt(Xall/1531f))+Mathf.FloorToInt(Xall/1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
    Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
    Q = Mathf.CeilToInt((Xall2+1)/255f);    // Номер выбранного треугольника
    E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
    Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
    Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
    Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
    Xc = Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
    LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
    Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
    Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
    SkipRow1 = Mathf.FloorToInt((127-Zcontrast)/126f)*(D*2)*(1-Lc);  // При D=0,5 и Zcontrast=1, SkipRow1=1, иначе 0

    // Оттенок относительно контрастности Zcontrast
    Xx= Mathf.FloorToInt(((1530*(1-Mathf.CeilToInt((Q-1)/6f))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Mathf.FloorToInt(Q/6f))*
     LR)*(1-Lc-SkipRow1+Mathf.Abs(Xout))+ (Xall-1)*(Lc+SkipRow1-Mathf.Abs(Xout))); // Цвет - на контрастности Zcontrast

    Xx = (Mathf.Abs(Xx)+Xx)/2f; // Если Xx меньше 0, то Xx = 0, иначе оставить то же число
    if (Xx>1529) Xx = 0;

    Q = Mathf.CeilToInt((Xx+1)/255f);    // Номер выбранного треугольника
    E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
    Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
    Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
    Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
    Xc = Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
    LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
    Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xx-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
    Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

    // Оттенок относительно контрастности Zcontrast
    Zero2 = 1-Mathf.CeilToInt(Y1/254f); // Переменная, для исключения деления на ноль

    //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2f)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
    k = (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
    Y2 = ((127-Z)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
    Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
    Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast
    Main_NumOfShade3 = Mathf.FloorToInt(Xx2+1);
   }
   else // Если оттенок меняется программно
   {
    Q = Mathf.CeilToInt((Xx+1)/255f);    // Номер выбранного треугольника
    E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
    Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
    Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
    Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
    Xc = Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
    LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
    Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xx-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
    Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
   }

   Qrgbmax = Mathf.FloorToInt((Q+((1-LR)*(-E)+LR*E)-(LR*Mathf.FloorToInt(Q/6f)*6))/2f); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin = ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Mathf.CeilToInt((Q-1)/6f))*6)))/2f)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp = Q - Mathf.FloorToInt(Q/4f)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid = (Qp+LR-(LR*Mathf.FloorToInt(Qp/3f)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm = (1-Mathf.CeilToInt(Qrgbmax/2f))*2 + Mathf.FloorToInt(Qrgbmid/2f);
   Gm = (1-Mathf.Abs(Qrgbmax-1))*2 + (1-Mathf.Abs(Qrgbmid-1));
   Bm = Mathf.FloorToInt(Qrgbmax/2f)*2 + (1-Mathf.CeilToInt(Qrgbmid/2f));

   // NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
   NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
   // Вычислить максимальное, минимальное и среднее значение
   RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
   RGBmin2 = Yarkost-(127-Zcontrast);
   RGBmid2 = Mathf.Abs(Mathf.Abs((Y1/2f)-Xc)+(RGBmin2*(1-E)-RGBmax2*E));
   //---------------------------- Полученный цвет RGB -----------------------------------------------
   // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
   R2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   G2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   B2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));

   //---------------------------- Указать новый оттенок, контрастность -----------------------------------------------
   // Чтобы процедура выполнялась только один раз
   Main_NumOfShade2 = Mathf.FloorToInt(Xx*BGW+1);
   Main_NumOfContrast2 = Mathf.FloorToInt(Zcontrast*BGW);
   ///////////////////////////////////////////////
   TrackBar_5_Check = Mathf.FloorToInt(Xx*BGW+1);
   TrackBar_6_Check = Mathf.FloorToInt(Zcontrast*BGW);
   TrackBar_5 = Mathf.FloorToInt(Xx*BGW+1); // Новый оттенок (Xx=0..1529, +1 для переброса между значениями)
   TrackBar_6 = Mathf.FloorToInt(Zcontrast*BGW); // Новая контрастность
   return true;
  }

 }
20 дек 19, 10:45    [22044998]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Delphi:
+ Нарисовать цветовую палитру
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls,
  //Pngimage, // Для сохранения изображения в формате ".png"
  Math; // Для округления чисел

type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);
    // По нажатию на кнопку, открыть изменение основного цвета
    procedure Button_1Click(Sender: TObject);
    // По нажатию на кнопку, прибавить число к оттенку
    procedure Button_2Click(Sender: TObject);
    // По нажатию на изображение, установить новый цвет
    procedure Image_5MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

    procedure WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); message WM_MOUSEWHEEL; // Прокручено колесико мыши
    procedure Edit_1Change(Sender: TObject);
    procedure Edit_2Change(Sender: TObject);
    procedure Edit_3Change(Sender: TObject);

     // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
    procedure Find_BSC_AndMake_TheSameColor();

    procedure TrackBar_1Change(Sender: TObject);
    procedure TrackBar_2Change(Sender: TObject);
    procedure TrackBar_3Change(Sender: TObject);

     // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
    procedure Find_RGB_AndMake_TheSameColor();

    procedure TrackBar_4Change(Sender: TObject);
    procedure TrackBar_5Change(Sender: TObject);
    procedure TrackBar_6Change(Sender: TObject);

     // Установить значения нижних текстовых полей
    procedure Show_Changed_Color();

    // Найти RGB по яркости, оттенку и контрастности - Delphi
    procedure RGB_ByBSC(NumOfBright,NumOfShade,NumOfContrast:integer; out R,G,B:integer);
    // Яркость, оттенок, контрастность, по RGB - Delphi
    procedure BSC_ByRGB(R,G,B:integer; out NumOfBright,NumOfShade,NumOfContrast:integer);
    // Поменять цвет RGB - Delphi
    procedure Change_RGB(R,G,B,NumOfBright_Before,NumOfBright_New,
                               NumOfShade_Before,NumOfShade_New,
                               NumOfContrast:integer;
                               out R2,G2,B2:integer);
    // Нарисовать треугольник яркости
    procedure DrawBrightTriangle(NumOfBright_1,NumOfBright_2,NumOfShade,
                                 NumOfContrast_1,NumOfContrast_2:integer);
    procedure CreateBrightTriangles();
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TRGBARRAY=array [0..514] of TRGBQUAD; // 514 - ширина изображения (TRGBQUAD - массив с переменными rgbRed,rgbGreen,rgbBlue,rgbReserved)
  PRGBARRAY=^TRGBARRAY;


var
  Form3: TForm3;
  Button_1,           // Кнопка (Открыть изменение основного цвета)
  Button_2 : TButton; // Кнопка (+ Оттенок)
  Edit_1,Edit_2,Edit_3, // Текстовые поля "RGB" (Указываемый цвет)
  Edit_4,Edit_5,Edit_6, // Текстовые поля "RGB" (Результат)
  Edit_7: TEdit;        // Текстовое поле (+ Оттенок)
  Image_1,          // Изображение (Указываемый цвет)
  Image_2,          // Изображение (Результат)
  Image_3,          // Изображение (Цветные треугольники)
  Image_4,          // Изображение (Треугольник яркости)
  Image_5 : TImage; // Изображение (Линии)
  TrackBar_1,TrackBar_2,TrackBar_3,            // Ползунки яркости, оттенка, контрастности (Указываемый цвет)
  TrackBar_4,TrackBar_5,TrackBar_6: TTrackBar; // Ползунки яркости, оттенка, контрастности
  Label_1,Label_2,Label_3,Label_4,         // Label - яркость, оттенок, контрастность, RGB (Указываемый цвет)
  Label_5,Label_6,Label_7,Label_8: TLabel; // Label - яркость, оттенок, контрастность, RGB
  CheckBox_1,               // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции
  CheckBox_2,               // true - рисовать линию контрастности на треугольнике с яркостью
  CheckBox_3,               // true - рисовать точку на треугольнике яркости
  CheckBox_4,               // true - рисовать, ч/б линию яркости , под треугольником яркости
  CheckBox_5,               // true - рисовать линию контрастности на цветных треугольниках
  CheckBox_6,               // true - рисовать точку на цветных треугольниках
  CheckBox_7,               // true - заполнить квадрат с цветом
  CheckBox_Even,            // true - четная яркость
  CheckBox_Odd : TCheckBox; // true - нечетная яркость (если Even и Odd = false, то учитываются все виды яркости)

  Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, // Яркость, Оттенок, Контрастность
  Main_NumOfBright2, Main_NumOfShade2, Main_NumOfShade3, // Яркость2, Оттенок2, Контрастность2
  Main_NumOfContrast2, Main_NumOfContrast3, // Яркость2, Оттенок2, Контрастность2
  Main_R, Main_G, Main_B,
  Main_R2, Main_G2, Main_B2 : integer;
  EditProgramChange,               // true - RGB меняется программно, false - вручную
  TrackBarProgramChange : boolean; // true - Яркость, оттенок, контрастность меняются программно, false - вручную

  VirtualBrightTexture,          // Треугольник яркости
  VirtualDrawContrast : TBitmap; // Линии
  ScanVirtualBrightTexture,
  ScanVirtualDrawContrast : array [0..259] of PRGBARRAY; // Битмап в сканлайн формате (259 - высота изображения)
  VirtualTexture : array [0..509] of TBitmap; // копия изображений
  ScanVirtualTexture : array [0..259] of PRGBARRAY; // Битмап в сканлайн формате (259 - высота изображения)
  Mouse_InTriangle : integer; // 1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
  brush_R1,brush_G1,brush_B1 : integer; // цвет кисти

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var
i : integer;
begin
 Form3.Width := 550;
 Form3.Height := 590;
 Form3.Left := (Screen.Width div 2) - (Form3.Width div 2);
 Form3.Top := (Screen.Height div 2) - (Form3.Height div 2) - 20;
 Form3.DoubleBuffered := true;
 // Создать кнопку
 Button_1 := TButton.Create( Form3 );
  Button_2 := TButton.Create( Form3 );
 with Button_1 do
 begin
  Parent := Form3;
  Caption := '>';
  Width := 20;
  Height := 60;
  Top := 52;
  Left := 505;
  OnClick := Button_1Click; // По нажатию на кнопку, открыть изменение основного цвета
 end;
 with Button_2 do
 begin
  Parent := Form3;
  Caption := '+ Оттенок';
  Width := 75;
  Height := 25;
  Top := 192;
  Left := 424;
  OnClick := Button_2Click; // По нажатию на кнопку, прибавить число к оттенку
 end;
 // Создать компоненты с текстовыми полями R,G,B
 Edit_1 := TEdit.Create( Form3 );
   Edit_2 := TEdit.Create( Form3 );
     Edit_3 := TEdit.Create( Form3 );
 Edit_4 := TEdit.Create( Form3 );
   Edit_5 := TEdit.Create( Form3 );
     Edit_6 := TEdit.Create( Form3 );
 Edit_7 := TEdit.Create( Form3 );
 with Edit_1 do
 begin
  Parent := Form3;
  Text := '255';
  Width := 40;
  Height := 20;
  Top := 23;
  Left := 328;
  NumbersOnly := true;
  OnChange := Edit_1Change; // При изменении текста
 end;
 with Edit_2 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 23;
  Left := 392;
  NumbersOnly := true;
  OnChange := Edit_2Change; // При изменении текста
 end;
 with Edit_3 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 23;
  Left := 457;
  NumbersOnly := true;
  OnChange := Edit_3Change; // При изменении текста
 end;
 with Edit_4 do
 begin
  Parent := Form3;
  Text := '255';
  Width := 40;
  Height := 20;
  Top := 168;
  Left := 38;
  NumbersOnly := true;
 end;
 with Edit_5 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 168;
  Left := 102;
  NumbersOnly := true;
 end;
 with Edit_6 do
 begin
  Parent := Form3;
  Text := '0';
  Width := 40;
  Height := 20;
  Top := 168;
  Left := 167;
  NumbersOnly := true;
 end;
 with Edit_7 do
 begin
  Parent := Form3;
  Text := '1';
  Width := 40;
  Height := 20;
  Top := 194;
  Left := 378;
 end;
 // Изображения
 Image_1 := TImage.Create( Form3 );
  Image_2 := TImage.Create( Form3 );
   Image_3 := TImage.Create( Form3 );
    Image_4 := TImage.Create( Form3 );
     Image_5 := TImage.Create( Form3 );
 with Image_1 do
 begin
  Parent := Form3;
  Width := 169;
  Height := 70;
  Top := 53;
  Left := 328;
 end;
 with Image_2 do
 begin
  Parent := Form3;
  Width := 169;
  Height := 70;
  Top := 122;
  Left := 328;
 end;
 with Image_3 do
 begin
  Parent := Form3;
  Transparent := true; // Бесцветные пиксели
  Width := 514;
  Height := 259;
  Top := 220;
  Left := 10;
 end;
 with Image_4 do
 begin
  Parent := Form3;
  Transparent := true; // Бесцветные пиксели
  Width := 514;
  Height := 259;
  Top := 220;
  Left := 10;
 end;
 with Image_5 do
 begin
  Parent := Form3;
  Transparent := true; // Бесцветные пиксели
  Width := 514;
  Height := 259;
  Top := 220;
  Left := 10;
  OnMouseMove := Image_5MouseMove; // По нажатию на изображение, установить новый цвет
 end;
 // Создать ползунки яркости, оттенка, контрастности
 TrackBar_1 := TTrackBar.Create( Form3 );
   TrackBar_2 := TTrackBar.Create( Form3 );
     TrackBar_3 := TTrackBar.Create( Form3 );
 TrackBar_4 := TTrackBar.Create( Form3 );
   TrackBar_5 := TTrackBar.Create( Form3 );
     TrackBar_6 := TTrackBar.Create( Form3 );
 with TrackBar_1 do
 begin
  Parent := Form3;
  Max := 508;
  Position := 254;
  Width := 211;
  Height := 22;
  Top := 30;
  Left := 540;
  OnChange := Form3.TrackBar_1Change; // При изменении позиции ползунка
 end;
 with TrackBar_2 do
 begin
  Parent := Form3;
  Max := 1531;
  Position := 128;
  Width := 211;
  Height := 22;
  Top := 79;
  Left := 540;
  OnChange := Form3.TrackBar_2Change; // При изменении позиции ползунка
 end;
 with TrackBar_3 do
 begin
  Parent := Form3;
  Max := 127;
  Position := 0;
  Width := 211;
  Height := 22;
  Top := 121;
  Left := 540;
  OnChange := Form3.TrackBar_3Change; // При изменении позиции ползунка
 end;
 with TrackBar_4 do
 begin
  Parent := Form3;
  Max := 508;
  Position := 254;
  Width := 211;
  Height := 22;
  Top := 30;
  Left := 32;
  OnChange := Form3.TrackBar_4Change; // При изменении позиции ползунка
 end;
 with TrackBar_5 do
 begin
  Parent := Form3;
  Max := 1531;
  Position := 128;
  Width := 211;
  Height := 22;
  Top := 79;
  Left := 32;
  OnChange := Form3.TrackBar_5Change; // При изменении позиции ползунка
 end;
 with TrackBar_6 do
 begin
  Parent := Form3;
  Max := 127;
  Position := 0;
  Width := 211;
  Height := 22;
  Top := 121;
  Left := 32;
  OnChange := Form3.TrackBar_6Change; // При изменении позиции ползунка
 end;
 // Создать Label
 Label_1 := TLabel.Create( Form3 );
   Label_2 := TLabel.Create( Form3 );
     Label_3 := TLabel.Create( Form3 );
       Label_4 := TLabel.Create( Form3 );
 Label_5 := TLabel.Create( Form3 );
   Label_6 := TLabel.Create( Form3 );
     Label_7 := TLabel.Create( Form3 );
       Label_8 := TLabel.Create( Form3 );
 with Label_1 do
 begin
  Parent := Form3;
  Caption := 'Яркость: 254 (127,0)';
  Width := 106;
  Height := 13;
  Top := 14;
  Left := 546;
 end;
 with Label_2 do
 begin
  Parent := Form3;
  Caption := 'Оттенок: 127';
  Width := 69;
  Height := 13;
  Top := 62;
  Left := 546;
 end;
 with Label_3 do
 begin
  Parent := Form3;
  Caption := 'Контрастность: 0';
  Width := 90;
  Height := 13;
  Top := 107;
  Left := 546;
 end;
 with Label_4 do
 begin
  Parent := Form3;
  Caption := 'R                   G                    B';
  Width := 137;
  Height := 13;
  Top := 7;
  Left := 333;
 end;
 with Label_5 do
 begin
  Parent := Form3;
  Caption := 'Яркость: 254 (127,0)';
  Width := 106;
  Height := 13;
  Top := 14;
  Left := 38;
 end;
 with Label_6 do
 begin
  Parent := Form3;
  Caption := 'Оттенок: 127';
  Width := 69;
  Height := 13;
  Top := 62;
  Left := 38;
 end;
 with Label_7 do
 begin
  Parent := Form3;
  Caption := 'Контрастность: 0';
  Width := 90;
  Height := 13;
  Top := 107;
  Left := 38;
 end;
 with Label_8 do
 begin
  Parent := Form3;
  Caption := 'R                   G                    B';
  Width := 137;
  Height := 13;
  Top := 151;
  Left := 53;
 end;
 // Создать CheckBox
 CheckBox_1 := TCheckBox.Create( Form3 );
  CheckBox_2 := TCheckBox.Create( Form3 );
   CheckBox_3 := TCheckBox.Create( Form3 );
    CheckBox_4 := TCheckBox.Create( Form3 );
     CheckBox_5 := TCheckBox.Create( Form3 );
      CheckBox_6 := TCheckBox.Create( Form3 );
       CheckBox_7 := TCheckBox.Create( Form3 );
        CheckBox_Even := TCheckBox.Create( Form3 );
         CheckBox_Odd := TCheckBox.Create( Form3 );
 with CheckBox_1 do
 begin
  Parent := Form3;
  Caption := 'Не сохранять пропорции (яркость - контрастность)';
  Hint := 'Выключено - Контрастность вторичного цвета не может быть выше,'
  +#13#10+'чем максимальная контрастность на яркости основного цвета';
  Width := 280;
  Height := 13;
  Top := 200;
  Left := 38;
 end;
 CheckBox_1.Checked := false; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции
 with CheckBox_2 do
 begin
  Parent := Form3;
  Caption := 'Линия контрастности на треугольнике яркости';
  Width := 330;
  Height := 13;
  Top := 490;
  Left := 10;
 end;
 CheckBox_2.Checked := true; // true - рисовать линию контрастности на треугольнике с яркостью
 with CheckBox_3 do
 begin
  Parent := Form3;
  Caption := 'Точка на треугольнике яркости';
  Width := 330;
  Height := 13;
  Top := 510;
  Left := 10;
 end;
 CheckBox_3.Checked := true; // true - рисовать точку на треугольнике яркости
 with CheckBox_4 do
 begin
  Parent := Form3;
  Caption := 'Ч/б линия, под треугольником яркости';
  Width := 330;
  Height := 13;
  Top := 530;
  Left := 10;
 end;
 CheckBox_4.Checked := true; // true - рисовать, ч/б линию яркости , под треугольником яркости
 with CheckBox_5 do
 begin
  Parent := Form3;
  Caption := 'Линия контраст. на цветных треугольниках';
  Width := 330;
  Height := 13;
  Top := 490;
  Left := 280;
 end;
 CheckBox_5.Checked := true; // true - рисовать линию контрастности на цветных треугольниках
 with CheckBox_6 do
 begin
  Parent := Form3;
  Caption := 'Точка на цветных треугольниках';
  Width := 330;
  Height := 13;
  Top := 510;
  Left := 280;
 end;
 CheckBox_6.Checked := true; // true - рисовать точку на цветных треугольниках
 with CheckBox_7 do
 begin
  Parent := Form3;
  Caption := 'Заполнять квадрат с цветом';
  Width := 330;
  Height := 13;
  Top := 530;
  Left := 280;
 end;
 CheckBox_7.Checked := true; // true - заполнить квадрат с цветом
 with CheckBox_Even do
 begin
  Parent := Form3;
  Caption := 'Четное';
  Width := 70;
  Height := 13;
  Top := 14;
  Left := 250;
 end;
 CheckBox_Even.Checked := false; // true - четная яркость
 with CheckBox_Odd do
 begin
  Parent := Form3;
  Caption := 'Нечетное';
  Width := 70;
  Height := 13;
  Top := 39;
  Left := 250;
 end;
 CheckBox_Odd.Checked := false; // true - нечетная яркость (если Even и Odd = false, то учитываются все виды яркости)
 ShowHint := true; // показывать подсказки

 Main_NumOfBright := 254; // Яркость
 Main_NumOfShade := 128;  // Оттенок
 Main_NumOfContrast := 0; // Контрастность
  Main_NumOfBright2 := 254; // Яркость2
  Main_NumOfShade2 := 128;  // Оттенок2
  Main_NumOfContrast2 := 0; // Контрастность2
   Main_NumOfShade3 := 128;  // Оттенок2 (для контрастности)
   Main_NumOfContrast3 := 0; // Контрастность2 (для яркости)

 Main_R := 255;
 Main_G := 0;
 Main_B := 0;
  Main_R2 := 255;
  Main_G2 := 0;
  Main_B2 := 0;

 for i := 0 to 508 do
 begin
 // Создать битмап с изображением
  VirtualTexture[i]:= TBitmap.Create;
  VirtualTexture[i].Transparent := True; // Бесцветные пиксели
  VirtualTexture[i].TransparentMode:=tmFixed;
  VirtualTexture[i].TransparentColor:=RGB(255, 255, 255);
  VirtualTexture[i].Width:= 514;
  VirtualTexture[i].Height:= 259;
 // Для ScanLine
  VirtualTexture[i].PixelFormat:=pf32bit;
 //------------------- Очистить изображение -----------------------
  VirtualTexture[i].Canvas.Brush.Color := clWhite;
  VirtualTexture[i].Canvas.FillRect(Rect(0,0,VirtualTexture[i].Width,
                                             VirtualTexture[i].Height));
 //------------------------------------------------------------------------
 end;

 CreateBrightTriangles(); // Создать цветные треугольники

 // Создать битмап с "Треугольником яркости"
 VirtualBrightTexture:= TBitmap.Create;
 VirtualBrightTexture.Transparent := True; // Бесцветные пиксели
 VirtualBrightTexture.TransparentMode:=tmFixed;
 VirtualBrightTexture.TransparentColor:=RGB(255, 255, 255);
 VirtualBrightTexture.Width:= 514;
 VirtualBrightTexture.Height:= 259;
// Для ScanLine
 VirtualBrightTexture.PixelFormat:=pf32bit;
//------------------- Очистить изображение -----------------------
 VirtualBrightTexture.Canvas.Brush.Color := clWhite;
 VirtualBrightTexture.Canvas.FillRect(Rect(0,0,VirtualBrightTexture.Width,
                                               VirtualBrightTexture.Height));
//------------------------------------------------------------------------
 // Создать битмап с "Линиями"
 VirtualDrawContrast:= TBitmap.Create;
 VirtualDrawContrast.Transparent := True; // Бесцветные пиксели
 VirtualDrawContrast.TransparentMode:=tmFixed;
 VirtualDrawContrast.TransparentColor:=RGB(255, 255, 255);
 VirtualDrawContrast.Width:= 514;
 VirtualDrawContrast.Height:= 259;
// Для ScanLine
 VirtualDrawContrast.PixelFormat:=pf32bit;
//------------------- Очистить изображение -----------------------
 VirtualDrawContrast.Canvas.Brush.Color := clWhite;
 VirtualDrawContrast.Canvas.FillRect(Rect(0,0,VirtualDrawContrast.Width,
                                              VirtualDrawContrast.Height));
//------------------------------------------------------------------------

 // Нарисовать треугольник яркости
 DrawBrightTriangle(Main_NumOfBright2,Main_NumOfBright2,Main_NumOfShade2,
                    Main_NumOfContrast2,Main_NumOfContrast2);
end;

procedure TForm3.Button_1Click(Sender: TObject); // По нажатию на кнопку, открыть изменение основного цвета
begin
 if (Button_1.Caption='>') then
 begin
  Form3.Width := 775;
  Button_1.Caption := '<';
 end
 else
 begin
  Form3.Width := 550;
  Button_1.Caption := '>';
 end;
end;

procedure TForm3.Button_2Click(Sender: TObject); // По нажатию на кнопку, прибавить число к оттенку
var
i : integer;
begin
 i := strtointdef(Edit_7.Text,0); // от -1529 до 1529
 if i<-1529 then
 begin
  i := -1529;
  Edit_7.Text := '-1529';
 end;
 if i>1529 then
 begin
  i := 1529;
  Edit_7.Text := '1529';
 end;

 // Поменять цвет RGB - Delphi
 Change_RGB(Main_R,Main_G,Main_B,
            Main_NumOfBright2, Main_NumOfBright2,
            Main_NumOfShade2, TrackBar_5.Position + i,
            Main_NumOfContrast2,
            Main_R2,Main_G2,Main_B2);

 Main_NumOfShade2 := TrackBar_5.Position; // Оттенок

 Show_Changed_Color(); // Установить значения нижних текстовых полей
end;

procedure TForm3.Image_5MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer); // По нажатию на изображение, установить новый цвет
var
Color : TColor;
r,g,b,
Mouse_1,Zazor, NumOfBright1,NumOfShade1,NumOfContrast1: integer;
D, Yout, Lc: Extended;
begin
 if (ssLeft in shift) then // Если левая кнопка мыши зажата
 begin
  Mouse_1 := 1;
 end
 else
 if (ssRight in shift) then // Если правая кнопка мыши зажата
 begin
  Mouse_1 := 3;
 end
 else
 begin
  Mouse_1 := 0;
 end;

 if (Mouse_1>0) then
 begin
  if (Mouse_InTriangle=0) then
  begin
   NumOfBright1 := Main_NumOfBright2; // Яркость (от 0 до 508)

   Zazor := 1;  // Устанавливаем зазор
   D := ((NumOfBright1/2)-Trunc(NumOfBright1/2))*2; // Четная (D=0) или нечетная (D=1) яркость
   // ТРЕУГОЛЬНИК ЯРКОСТИ
   // Если Y>127 то Yout=0, если Y<=127 то Yout=1
   Yout := (1-Ceil(Trunc(y/128)/10));
   // Определяем положение треугольника, если Lc=1, то координаты в пределах
   // треугольника яркости, если Lc=0 - за пределами
   Lc := (1-Ceil(Trunc(abs((x-128-D*(2-Floor(x/257)*D)-Zazor)-127)/(y+1))/1530))*Yout;

   Mouse_InTriangle := trunc(Mouse_1+Lc); // 1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
  end;

  if (Mouse_1=1) then // Если левая кнопка мыши
  begin
   if (Mouse_InTriangle=1) then // Если цветные треугольники
   begin
    Color := ColorToRGB(Image_3.Canvas.Pixels[x,y]);
    r := GetRValue(Color);
    g := GetGValue(Color);
    b := GetBValue(Color);

    if ((r<>g) or (r<>b)) then // Исключить прозрачный цвет
    begin
     // Яркость, оттенок, контрастность, по RGB - Delphi
     BSC_ByRGB(r,g,b, NumOfBright1,NumOfShade1,NumOfContrast1);

     if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
       ((NumOfShade1<>Main_NumOfShade2) or
        (NumOfContrast1<>Main_NumOfContrast2))) // Выполнить процедуру только 1 раз
     then
     begin
      TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
       TrackBar_5.Position := NumOfShade1;
       TrackBar_6.Position := NumOfContrast1;
      TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
                 Main_NumOfBright2, Main_NumOfBright2,
                 Main_NumOfShade2, NumOfShade1,
                 Main_NumOfContrast2,
                 Main_R2,Main_G2,Main_B2);

      Main_NumOfShade2 := NumOfShade1; // Оттенок
      Main_NumOfContrast2 := NumOfContrast1; // Контрастность

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     end;
    end;

   end
   else if (Mouse_InTriangle=2) then // Если треугольник яркости
   begin
    D := ((Main_NumOfBright2/2)-Trunc(Main_NumOfBright2/2)); // Четная (D=0) или нечетная (D=1) яркость

    if (X<=(129+D*2)) then
     NumOfBright1 := trunc(0+D*2)
    else
    if (X>=(384+D*2)) then
     NumOfBright1 := trunc(508-D*2)
    else
    NumOfBright1 := trunc((abs(X-(129+D*2))-D)*2); // Яркость (от 0 до 508)

    if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
      (NumOfBright1<>Main_NumOfBright2)) // Выполнить процедуру только 1 раз
    then
    begin
     TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
      TrackBar_4.Position := NumOfBright1;
     TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
   // Поменять цвет RGB - Delphi
     Change_RGB(Main_R,Main_G,Main_B,
               Main_NumOfBright2, NumOfBright1,
               Main_NumOfShade3, Main_NumOfShade3,
               Main_NumOfContrast3,
               Main_R2,Main_G2,Main_B2);

     Main_NumOfBright2 := NumOfBright1; // Яркость

     Show_Changed_Color(); // Установить значения нижних текстовых полей
    end;
   end;
  end
  else // Если правая кнопка мыши
  begin
   if (Mouse_InTriangle=3) then // Если цветные треугольники
   begin
    Color := ColorToRGB(Image_3.Canvas.Pixels[x,y]);
    r := GetRValue(Color);
    g := GetGValue(Color);
    b := GetBValue(Color);

    if ((r<>g) or (r<>b)) then // Исключить прозрачный цвет
    begin
     EditProgramChange := true; // RGB меняется программно
     Main_R := r;
       Main_G := g;
         Main_B := b;
      Edit_1.Text := inttostr(Main_R);
       Edit_2.Text := inttostr(Main_G);
        Edit_3.Text := inttostr(Main_B);
     EditProgramChange := false; // RGB меняется вручную

     Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
    end;
   end
   else if (Mouse_InTriangle=4) then // Если треугольник яркости
   begin
    D := ((Main_NumOfBright2/2)-Trunc(Main_NumOfBright2/2)); // Четная (D=0) или нечетная (D=1) яркость

    if (X<=(129+D*2)) then
     NumOfBright1 := trunc(0+D*2)
    else
    if (X>=(384+D*2)) then
     NumOfBright1 := trunc(508-D*2)
    else
    NumOfBright1 := trunc((abs(X-(129+D*2))-D)*2); // Яркость (от 0 до 508)

    if Y>127 then
     NumOfContrast1 := 127
    else
    begin
     NumOfContrast1 := 127-(Floor(abs(127-abs((127-(NumOfBright1/2))-D)))); // Максимальное количество рядов, на заданной яркости 'NumOfBright1/2'
    end;

     // Найти RGB по яркости, оттенку и контрастности - Delphi
    RGB_ByBSC(NumOfBright1,Main_NumOfShade3,NumOfContrast1,Main_R,Main_G,Main_B);

    if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
      (NumOfBright1<>Main_NumOfBright2)) // Выполнить процедуру только 1 раз
    then
    begin
     TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
      TrackBar_1.Position := NumOfBright1;
      TrackBar_4.Position := NumOfBright1;
     TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную

    // Поменять цвет RGB - Delphi
     Change_RGB(Main_R,Main_G,Main_B,
               Main_NumOfBright2, NumOfBright1,
               Main_NumOfShade3, Main_NumOfShade3,
               NumOfContrast1,
               Main_R2,Main_G2,Main_B2);

     Main_NumOfBright2 := NumOfBright1; // Яркость

     EditProgramChange := true; // RGB меняется программно
     Main_R := Main_R2;
      Main_G := Main_G2;
       Main_B := Main_B2;
     Edit_1.Text := inttostr(Main_R2);
      Edit_2.Text := inttostr(Main_G2);
       Edit_3.Text := inttostr(Main_B2);
     Edit_4.Text := inttostr(Main_R2);
      Edit_5.Text := inttostr(Main_G2);
       Edit_6.Text := inttostr(Main_B2);
     EditProgramChange := false; // RGB меняется вручную

     Main_NumOfBright := Main_NumOfBright2;
      Main_NumOfShade := Main_NumOfShade2;
       Main_NumOfContrast := Main_NumOfContrast2;
     with Image_1 do
     begin
      Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
      Canvas.Rectangle(0,0,width,height);
     end;

     Show_Changed_Color(); // Установить значения нижних текстовых полей
    end;
   end;
  end;
 end
 else Mouse_InTriangle := 0; // 1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
end;

procedure TForm3.WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); // Прокручено колесико мыши
var
MP: TPoint;
EditScrL,EditScrT : integer;
begin
 GetCursorPos(MP); // Получить координаты курсора, относительно экрана

 // Если колесо прокручено над Edit_1
 EditScrL:=Form3.Left+10+Edit_1.Left;
 EditScrT:=Form3.Top+32+Edit_1.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_1.Width) and (MP.Y<=EditScrT+Edit_1.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_1.Text,0)+1)<256 then
    Edit_1.Text:=inttostr(strtointdef(Edit_1.Text,0)+1);
   end
   else
   if (strtointdef(Edit_1.Text,0)-1)>-1 then
   Edit_1.Text:=inttostr(strtointdef(Edit_1.Text,0)-1);
  exit;
 end;

 // Если колесо прокручено над Edit_2
 EditScrL:=Form3.Left+10+Edit_2.Left;
 EditScrT:=Form3.Top+32+Edit_2.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_2.Width) and (MP.Y<=EditScrT+Edit_2.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_2.Text,0)+1)<256 then
    Edit_2.Text:=inttostr(strtointdef(Edit_2.Text,0)+1);
   end
   else
   if (strtointdef(Edit_2.Text,0)-1)>-1 then
   Edit_2.Text:=inttostr(strtointdef(Edit_2.Text,0)-1);
  exit;
 end;

 // Если колесо прокручено над Edit_3
 EditScrL:=Form3.Left+10+Edit_3.Left;
 EditScrT:=Form3.Top+32+Edit_3.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_3.Width) and (MP.Y<=EditScrT+Edit_3.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_3.Text,0)+1)<256 then
    Edit_3.Text:=inttostr(strtointdef(Edit_3.Text,0)+1);
   end
   else
   if (strtointdef(Edit_3.Text,0)-1)>-1 then
   Edit_3.Text:=inttostr(strtointdef(Edit_3.Text,0)-1);
  exit;
 end;

 // Если колесо прокручено над Edit_7
 EditScrL:=Form3.Left+10+Edit_7.Left;
 EditScrT:=Form3.Top+32+Edit_7.Top;

 if (MP.X>=EditScrL) and (MP.Y>=EditScrT) and
    (MP.X<=EditScrL+Edit_7.Width) and (MP.Y<=EditScrT+Edit_7.Height)
 then
 begin
   if Msg.WheelDelta>0 then
   begin
    if (strtointdef(Edit_7.Text,0)+1)<1530 then
    Edit_7.Text:=inttostr(strtointdef(Edit_7.Text,0)+1);
   end
   else
   if (strtointdef(Edit_7.Text,0)-1)>-1530 then
   Edit_7.Text:=inttostr(strtointdef(Edit_7.Text,0)-1);
  exit;
 end;
end;

procedure TForm3.Edit_1Change(Sender: TObject);
begin
 if (EditProgramChange = false) then // Если RGB меняется вручную
 begin
  if strtointdef(Edit_1.Text,0)<0 then
  begin
   Edit_1.Text := '0';
  end;
  if strtointdef(Edit_1.Text,0)>255 then
  begin
   Edit_1.Text := '255';
  end;
  Main_R := strtointdef(Edit_1.Text,0);

  Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Edit_2Change(Sender: TObject);
begin
 if (EditProgramChange = false) then // Если RGB меняется вручную
 begin
  if strtointdef(Edit_2.Text,0)<0 then
  begin
   Edit_2.Text := '0';
  end;
  if strtointdef(Edit_2.Text,0)>255 then
  begin
   Edit_2.Text := '255';
  end;
  Main_G := strtointdef(Edit_2.Text,0);

  Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Edit_3Change(Sender: TObject);
begin
 if (EditProgramChange = false) then // Если RGB меняется вручную
 begin
  if strtointdef(Edit_3.Text,0)<0 then
  begin
   Edit_3.Text := '0';
  end;
  if strtointdef(Edit_3.Text,0)>255 then
  begin
   Edit_3.Text := '255';
  end;
  Main_B := strtointdef(Edit_3.Text,0);

  Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Find_BSC_AndMake_TheSameColor(); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
begin
  TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно

  // Яркость, оттенок, контрастность, по RGB - Delphi
  BSC_ByRGB(Main_R,Main_G,Main_B, Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast);
  TrackBar_1.Position := Main_NumOfBright;
   TrackBar_2.Position := Main_NumOfShade;
    TrackBar_3.Position := Main_NumOfContrast;
  Main_NumOfBright2 := Main_NumOfBright;
   Main_NumOfShade2 := Main_NumOfShade;
    Main_NumOfContrast2 := Main_NumOfContrast;
  TrackBar_4.Position := Main_NumOfBright2;
   TrackBar_5.Position := Main_NumOfShade2;
    TrackBar_6.Position := Main_NumOfContrast2;

  TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
  with Image_1 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;

  EditProgramChange := true; // RGB меняется программно
  Edit_4.Text := inttostr(Main_R);
   Edit_5.Text := inttostr(Main_G);
    Edit_6.Text := inttostr(Main_B);
  Main_R2 := Main_R;
   Main_G2 := Main_G;
    Main_B2 := Main_B;
  EditProgramChange := false; // RGB меняется вручную
  with Image_2 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;
  TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
  Main_NumOfBright2 := TrackBar_4.Position;
   Main_NumOfShade2 := TrackBar_5.Position;
   Main_NumOfShade3 := TrackBar_5.Position;
    Main_NumOfContrast2 := TrackBar_6.Position;
    Main_NumOfContrast3 := TrackBar_6.Position;
  TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную

  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, Main_NumOfBright2,
             Main_NumOfShade2, Main_NumOfShade2,
             Main_NumOfContrast2,
             Main_R2,Main_G2,Main_B2);
end;


procedure TForm3.TrackBar_1Change(Sender: TObject);
begin
 if Odd(TrackBar_1.Position)=false then  // Четное
  Label_1.Caption := 'Яркость: '+inttostr(TrackBar_1.Position)
                   +' ('+Floattostr(TrackBar_1.Position/2)+',0)'
 else // Нечетное
 Label_1.Caption := 'Яркость: '+inttostr(TrackBar_1.Position)
                   +' ('+Floattostr(TrackBar_1.Position/2)+')';

 if ((TrackBarProgramChange = false)   and // Если Яркость, оттенок, контрастность меняются вручную
  (TrackBar_1.Position<>Main_NumOfBright)) // Выполнить процедуру только 1 раз
 then
 begin
	if ((CheckBox_Even.Checked = true) or (CheckBox_Odd.Checked = true)) then  // Если нужна только четная или нечетная яркость
  begin
   TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
	  if (CheckBox_Even.Checked = true) then // Если нужна только четная яркость
    begin
     if Odd(TrackBar_1.Position)=true then // Если нечетное число
     if (TrackBar_1.Position-Main_NumOfBright<0) then // Если ползунок смещается влево
     begin
      TrackBar_1.Position := TrackBar_1.Position - 1
     end
     else TrackBar_1.Position := TrackBar_1.Position + 1;
    end
	  else if (CheckBox_Odd.Checked = true) then // Если нужна только нечетная яркость
    begin
     if Odd(TrackBar_1.Position)=false then // Если четное число
     if (TrackBar_1.Position-Main_NumOfBright<0) then // Если ползунок смещается влево
     begin
      if (TrackBar_1.Position>0) then
       TrackBar_1.Position := TrackBar_1.Position - 1
      else
      begin
       TrackBar_1.Position := 1;
       TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
       exit;
      end;
     end
     else
     if (TrackBar_1.Position<508) then
      TrackBar_1.Position := TrackBar_1.Position + 1
     else
     begin
      TrackBar_1.Position := 507;
      TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
      exit;
     end;
 	  end;
   TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
  end;

  Main_NumOfBright := TrackBar_1.Position; // Яркость

  Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;
procedure TForm3.TrackBar_2Change(Sender: TObject);
begin
 Label_2.Caption := 'Оттенок: '+inttostr(TrackBar_2.Position - 1);

 if ((TrackBarProgramChange = false)  and // Если Яркость, оттенок, контрастность меняются вручную
  (TrackBar_2.Position<>Main_NumOfShade)) // Выполнить процедуру только 1 раз
 then
 begin
  Main_NumOfShade := TrackBar_2.Position; // Оттенок

  Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.TrackBar_3Change(Sender: TObject);
begin
 Label_3.Caption := 'Контрастность: '+inttostr(TrackBar_3.Position);

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
  (TrackBar_3.Position<>Main_NumOfContrast)) // Выполнить процедуру только 1 раз
 then
 begin
  Main_NumOfContrast := TrackBar_3.Position; // Контрастность

  Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
 end;
end;

procedure TForm3.Find_RGB_AndMake_TheSameColor(); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
begin
  // Найти RGB по яркости, оттенку и контрастности - Delphi
  RGB_ByBSC(Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast, Main_R,Main_G,Main_B);
  EditProgramChange := true; // RGB меняется программно
  Edit_1.Text := inttostr(Main_R);
  Edit_2.Text := inttostr(Main_G);
  Edit_3.Text := inttostr(Main_B);
  EditProgramChange := false; // RGB меняется вручную
  with Image_1 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;

  EditProgramChange := true; // RGB меняется программно
  Edit_4.Text := inttostr(Main_R);
   Edit_5.Text := inttostr(Main_G);
    Edit_6.Text := inttostr(Main_B);
  Main_R2 := Main_R;
   Main_G2 := Main_G;
    Main_B2 := Main_B;
  EditProgramChange := false; // RGB меняется вручную
  with Image_2 do
  begin
   Canvas.Brush.Color:=RGB(Main_R,Main_G,Main_B);
   Canvas.Rectangle(0,0,width,height);
  end;
  TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
  //Main_NumOfBright := TrackBar_1.Position;
  // Main_NumOfShade := TrackBar_2.Position;
  //  Main_NumOfContrast := TrackBar_3.Position;

  TrackBar_4.Position := TrackBar_1.Position;
   TrackBar_5.Position := TrackBar_2.Position;
    TrackBar_6.Position := TrackBar_3.Position;

  Main_NumOfBright2 := TrackBar_1.Position;
   Main_NumOfShade2 := TrackBar_2.Position;
   Main_NumOfShade3 := TrackBar_2.Position;
    Main_NumOfContrast2 := TrackBar_3.Position;
    Main_NumOfContrast3 := TrackBar_3.Position;
  TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную

  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, Main_NumOfBright2,
             Main_NumOfShade2, Main_NumOfShade2,
             Main_NumOfContrast2,
             Main_R2,Main_G2,Main_B2);
end;

procedure TForm3.TrackBar_4Change(Sender: TObject);
begin
 if Odd(TrackBar_4.Position)=false then  // Четное
  Label_5.Caption := 'Яркость: '+inttostr(TrackBar_4.Position)
                   +' ('+Floattostr(TrackBar_4.Position/2)+',0)'
 else // Нечетное
 Label_5.Caption := 'Яркость: '+inttostr(TrackBar_4.Position)
                   +' ('+Floattostr(TrackBar_4.Position/2)+')';

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
   (TrackBar_4.Position<>Main_NumOfBright2)) // Выполнить процедуру только 1 раз
 then
 begin
	if ((CheckBox_Even.Checked = true) or (CheckBox_Odd.Checked = true)) then  // Если нужна только четная или нечетная яркость
  begin
   TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно
	  if (CheckBox_Even.Checked = true) then // Если нужна только четная яркость
    begin
     if Odd(TrackBar_4.Position)=true then // Если нечетное число
     if (TrackBar_4.Position-Main_NumOfBright2<0) then // Если ползунок смещается влево
     begin
      TrackBar_4.Position := TrackBar_4.Position - 1
     end
     else TrackBar_4.Position := TrackBar_4.Position + 1;
    end
	  else if (CheckBox_Odd.Checked = true) then // Если нужна только нечетная яркость
    begin
     if Odd(TrackBar_4.Position)=false then // Если четное число
     if (TrackBar_4.Position-Main_NumOfBright2<0) then // Если ползунок смещается влево
     begin
      if (TrackBar_4.Position>0) then
       TrackBar_4.Position := TrackBar_4.Position - 1
      else
      begin
       TrackBar_4.Position := 1;
       TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
       exit;
      end;
     end
     else
     if (TrackBar_4.Position<508) then
      TrackBar_4.Position := TrackBar_4.Position + 1
     else
     begin
      TrackBar_4.Position := 507;
      TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
      exit;
     end;
 	  end;
   TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
  end;

  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, TrackBar_4.Position,
             Main_NumOfShade3, Main_NumOfShade3,
             Main_NumOfContrast3,
             Main_R2,Main_G2,Main_B2);

  Main_NumOfBright2 := TrackBar_4.Position; // Яркость
 // Main_NumOfShade2 := TrackBar_5.Position; // Оттенок
 // Main_NumOfContrast2 := TrackBar_6.Position; // Контрастность

  Show_Changed_Color(); // Установить значения нижних текстовых полей
 end;
end;

procedure TForm3.TrackBar_5Change(Sender: TObject);
begin
 Label_6.Caption := 'Оттенок: '+inttostr(TrackBar_5.Position - 1);

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
   (TrackBar_5.Position<>Main_NumOfShade2)) // Выполнить процедуру только 1 раз
 then
 begin
  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, Main_NumOfBright2,
             Main_NumOfShade2, TrackBar_5.Position,
             Main_NumOfContrast2,
             Main_R2,Main_G2,Main_B2);

  Main_NumOfShade2 := TrackBar_5.Position; // Оттенок

  Show_Changed_Color(); // Установить значения нижних текстовых полей
 end;
end;

procedure TForm3.TrackBar_6Change(Sender: TObject);
begin
 Label_7.Caption := 'Контрастность: '+inttostr(TrackBar_6.Position);

 if ((TrackBarProgramChange = false) and // Если Яркость, оттенок, контрастность меняются вручную
   (TrackBar_6.Position<>Main_NumOfContrast2)) // Выполнить процедуру только 1 раз
 then
 begin
  // Поменять цвет RGB - Delphi
  Change_RGB(Main_R,Main_G,Main_B,
             Main_NumOfBright2, Main_NumOfBright2,
             Main_NumOfShade3, Main_NumOfShade3,
             TrackBar_6.Position,
             Main_R2,Main_G2,Main_B2);

  Main_NumOfContrast2 := TrackBar_6.Position; // Контрастность

  Show_Changed_Color(); // Установить значения нижних текстовых полей
 end;
end;

procedure TForm3.Show_Changed_Color(); // Установить значения нижних текстовых полей
begin
  EditProgramChange := true; // RGB меняется программно
  Edit_4.Text := inttostr(Main_R2);
  Edit_5.Text := inttostr(Main_G2);
  Edit_6.Text := inttostr(Main_B2);
  EditProgramChange := false; // RGB меняется вручную
  with Image_2 do
  begin
   Canvas.Brush.Color:=RGB(Main_R2,Main_G2,Main_B2);
   Canvas.Rectangle(0,0,width,height);
  end;
end;


procedure TForm3.BSC_ByRGB(R,G,B:integer;
                    out NumOfBright,NumOfShade,NumOfContrast:integer); // Яркость, оттенок, контрастность, по RGB - Delphi
var
//NumOfBright1,NumOfContrast1,NumOfShade1 : integer;
//R, G, B : byte;
RGBmax,RGBmin,RGBmid,Rm,Gm,Bm,
Light,BGW,D,E,Q,Zmax,Z,Qp,LR,Y1,Xc,Xmain: Extended;
begin
// R := … ;  G := … ;  B := … ;
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета
E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;
Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
          (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
          (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

NumOfBright := Trunc((Light+D)*2); // Яркость, от 0 до 508
NumOfContrast := Trunc(Z); // Контрастность, от 0 до 127
NumOfShade := Trunc(Xmain+1); // Оттенок, от 0 до 1529 +1
end;


procedure TForm3.RGB_ByBSC(NumOfBright,NumOfShade,NumOfContrast:integer;
                    out R,G,B:integer); // Найти RGB по яркости, оттенку и контрастности - Delphi
var
// Переменные
Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
Zero2, k, Y2, Xc2, Zcontrast,
Yarkost, Lc, Zmax2, NoRow254,
RGBmax2, RGBmin2, RGBmid2,
Xall, Xall2, Xx, Xx2, Xborder, Xout, SkipRow1,
Qrgbmax, Qrgbmin, Qrgbmid : Extended;
begin
BGW := 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
//------------------------------------------------Поменять значения «Яркость» - «Контрастность» ----------------------------------------------
Yarkost := NumOfBright/2; // Яркость
Zcontrast := NumOfContrast; // Контрастность
D := Yarkost-Trunc(Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
Yarkost := trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'

Lc := 1-Ceil(((127-Zcontrast)-Zmax2)/128);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := (Zcontrast)*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контраст., за пределами Zmax2, то Zcontrast=Zmax2
//-----------------------------------------------------------------------Поменять «Цвет» --------------------------------------------------------------------
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
  //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
  Xall := NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
  Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
  Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
 SkipRow1 := Trunc((127-Zcontrast)/126)*(D*2)*(1-Lc);  // При D=0,5 и Z=1, SkipRow1=1, иначе 0

Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет (Координата по оси X, на общей сетке коорд.)

   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));
   Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));

//---------------Ниже, можно использовать формулы, по отдельности для - «Яркость-Контрастность» или «Цвет»-----------

Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Z)
 Y2 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)

 Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)

 //Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Коорд. по оси X, на общей сетке координат (Если не исп. формулы цвета)

 // Поменять значение оттенка, контрастности (если за пределами) ******************************
 TrackBarProgramChange := true; // Яркость, оттенок, контрастность меняются программно

 TrackBar_2.Position := trunc(Xx+1); // Новый оттенок
 TrackBar_3.Position := trunc(Zcontrast); // Новая контрастность
 TrackBar_5.Position := trunc(Xx+1); // Новый оттенок
 TrackBar_6.Position := trunc(Zcontrast); // Новая контрастность

 TrackBarProgramChange := false; // Яркость, оттенок, контрастность меняются вручную
 // ****************************************************************************

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254);
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y2/2)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
end;

procedure TForm3.Change_RGB(R,G,B,
     NumOfBright_Before,NumOfBright_New,
     NumOfShade_Before,NumOfShade_New,
     NumOfContrast:integer;out R2,G2,B2:integer); // Поменять цвет RGB - Delphi
var
// Переменные
RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
Light, BGW, D, D2, E, Q, Qp, Qa, LR,
Y1, Xc, Y2, Xc2, Zero, Zero2, k, Z, Xx2,
Lc,  Zmax, NoRow254, Yarkost, Zcontrast, Zmax2,
RGBmax2, RGBmin2, RGBmid2, Xmain,
Xall, Xall2, Xx, Xborder, Xout,
SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid : Extended;
begin
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета

//-------------Поменять значения «Яркость» ------------------------------------------------
 // Чтобы оставить знач. яркости в прежнем состоянии, можно закомментировать 3 нижние строки и поменять 4-ую  "Zmax2 := Zmax;"
Yarkost := NumOfBright_New / 2; // Яркость
D := Yarkost-Trunc(Yarkost); // Четная (D2=0) или нечетная (D2=0.5) яркость
Yarkost := Trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
//-------------------------------------------------------------------------------------------------------------

E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;

 if (CheckBox_1.Checked=false) then // Если нужно сохранять пропорции (яркость - контрастность)
 begin
  Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
  Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
 end
 else
 begin
  Zmax := (127-D*2)*BGW; // Максимальное количество рядов на яркости 'Light'
  Z := (127-Zmax)*BGW; // Контрастность (Номер ряда с цветом)
 end;

 // ^ 1.^ - Раскомментировать 5 переменных ниже, если нужно оставить оттенок в прежнем состоянии
//Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
//Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
//LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
//          (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
//          (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
//Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
//Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

  // ^ 2.^ - Противоположное значение цвета -------------------------------------------------------------
   if NumOfShade_New<0 then Lc := 1 else Lc := 0;
  // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
   Xmain := NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
   Lc := Trunc(Xmain/1530); // Если Xmain>1529, то Lc=1, иначе Lc=0
   Xmain := Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall := Xmain+1;

//--------------Поменять «Цвет» -----------------------------------------------------------------------
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
  //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
 // Чтобы оставить знач. Цвета в прежнем состоянии, можно поставить переменную (Xmain+1) и выполнить шаг ^ 1.^
     Xall := Xmain; // Координата выбранной ячейки с цветом, по оси X
 // Xall := NumOfShade_New; // Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
 Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
 Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

//-------------Поменять значение «Контрастность» ------------------------------------------------
 // Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
Zcontrast := NumOfContrast; // Контрастность

 Lc := 1-Ceil(((127-Zcontrast)-Zmax)/128); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax

 if (NumOfBright_Before <> NumOfBright_New) then // Если яркость меняется вручную
 begin
  Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
  // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
  Zero := 1-Ceil(Zmax/127); // Переменная, для исключения деления на ноль
  Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
 end
 else // Если яркость меняется программно
 begin
  Lc := 1-Ceil(((127-Zcontrast)-Zmax2)/128); // Если Zcontrast меньше или равен Zmax2 , то Lc=1, иначе Lc=0
  Zcontrast := Zcontrast*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контрастность, за пределами Zmax2, то Z=Zmax2

  Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
  // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
  Zero := 1-Ceil(Zmax2/127); // Переменная, для исключения деления на ноль
  Main_NumOfContrast3 := trunc(127 - (Round((Zmax/(Zmax2+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc)));  // Ряд-Контрастность , при «Yarkost»
 end;
//-------------------------------------------------------------------------------------------------------------

 Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
 k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
 Y1 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
 Xc := abs((Y1*LR)-Round(abs(k-LR)*Y1)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
 Xx := (127-Y1/2)+Xc+(Q-1)*255; // Цвет - на контрастности Zcontrast

//------------------- Если оттенок меняется вручную ----------------------------------------------------------------
  if (NumOfShade_Before <> NumOfShade_New) then
  begin
  // ^ 2.^ - Противоположное значение цвета -------------------------------------------------------------
   if NumOfShade_New<0 then Lc := 1 else Lc := 0;
  // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
   Xmain := NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
   Lc := Trunc(Xmain/1530); // Если Xmain>1529, то Lc=1, иначе Lc=0
   Xmain := Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall := Xmain+1;

     Xall := Xmain; // Координата выбранной ячейки с цветом, по оси X
     //Xall := NumOfShade_New; // Координата выбранной ячейки с цветом, по оси X
   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
      Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
      Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
     Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
     E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
     Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
      Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
      Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
      Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
      LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
     Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
     Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
    // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
    SkipRow1 := Trunc((127-Zcontrast)/126)*(D*2)*(1-Lc);  // При D=0,5 и Zcontrast=1, SkipRow1=1, иначе 0

   // Оттенок относительно контрастности Zcontrast
   Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
   LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет - на контрастности Zcontrast

   Xx := (abs(Xx)+Xx)/2; // Если Xx меньше 0, то Xx = 0, иначе оставить то же число
   if Xx>1529 then Xx := 0;

     Q := Ceil((Xx+1)/255);    // Номер выбранного треугольника
     E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
     Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
      Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
      Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
      Xc := Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
      LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
     Lc := 1-Ceil(Trunc(abs((Xx-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
     Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

   // Оттенок относительно контрастности Zcontrast
   Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль

  //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
   k := (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
   Y2 := ((127-Z)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
   Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
   Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast
   Main_NumOfShade3 := trunc(Xx2+1);
  end
  else // Если оттенок меняется программно
  begin
     Q := Ceil((Xx+1)/255);    // Номер выбранного треугольника
     E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
     Y1 := (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
      Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
      Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
      Xc := Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
      LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
     Lc := 1-Ceil(Trunc(abs((Xx-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
     Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
  end;
//---------------------------------------------------------------------------------------------------------------------

   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));
   Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254);
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y1/2)-Xc)+(RGBmin2*(1-E)-RGBmax2*E));
//---------------------------- Полученный цвет RGB -----------------------------------------------
// Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
 R2:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 G2:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
 B2:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+
                     (Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));

//---------------------------- Указать новый оттенок, контрастность -----------------------------------------------
 TrackBarProgramChange := true; // Программное изменение оттенка, контрастности
  // Чтобы процедура выполнялась только один раз
  Main_NumOfShade2 := trunc(Xx*BGW+1);
  Main_NumOfContrast2 := trunc(Zcontrast*BGW);
  ///////////////////////////////////////////////
  TrackBar_5.Position := trunc(Xx*BGW+1); // Новый оттенок (Xx=0..1529, +1 для переброса между значениями)
  TrackBar_6.Position := trunc(Zcontrast*BGW); // Новая контрастность
 TrackBarProgramChange := false; // Ручное изменение оттенка, контрастности

 if (CheckBox_1.Checked=false) then // Если нужно сохранять пропорции (яркость - контрастность)
 begin
  DrawBrightTriangle(trunc((Light+D)*2),trunc((Yarkost+D)*2),
                     trunc(Main_NumOfShade3*BGW),trunc(Z),trunc(Main_NumOfContrast3*BGW)) // Нарисовать треугольник яркости
 end
 else DrawBrightTriangle(trunc(254+D*2),trunc((Yarkost+D)*2),
                         trunc(Main_NumOfShade3*BGW),trunc(Z),trunc(Main_NumOfContrast3*BGW)); // Нарисовать треугольник яркости
end;


procedure TForm3.DrawBrightTriangle(NumOfBright_1,NumOfBright_2,NumOfShade,
                                    NumOfContrast_1,NumOfContrast_2:integer); // Нарисовать треугольник яркости
var
// Переменные:
//NumOfBright,NumOfShade,NumOfContrast,
X,Y,i,j,Zazor,Zmax,Zmax2,R,G,B,
Zero,Zero2,Q,Qa,BGW,Lc,NoRow254 : integer;
RGBmin2,RGBmax2,RGBmid2,Rm,Gm,Bm,
D,Xout,Xall2,Xx,k,Y1,Y2,Xc,Xc2,SkipRow1,Qrgbmax,Qrgbmin,Qrgbmid,Qp,
E,Yarkost,Zcontrast,Xall,Xborder,LR : extended;
Xdraw, Ydraw : integer;
X2, Z : extended;
begin
//NumOfBright := ...; // яркость (от 0 до 508)
//NumOfShade := ...; // оттенок (от 0 до 1529) либо (от 0 до 1531 - поменять формулу «Xall := NumOfShade;»)
//NumOfContrast := ...; // контрастность (от 0 до 127)

//------------------- Очистить изображение -----------------------
 VirtualBrightTexture.Canvas.FillRect(Rect(0,0,VirtualBrightTexture.Width,
                                               VirtualBrightTexture.Height));
 VirtualDrawContrast.Canvas.FillRect(Rect(0,0,VirtualDrawContrast.Width,
                                              VirtualDrawContrast.Height));
//------------------------------------------------------------------------

 // Копируем изображение в массив Сканлайн
 // Нужно делать этот цикл каждый раз, когда "VirtualBrightTexture" теряет связь с массивом "ScanVirtualBrightTexture"
 for i := 0 to VirtualBrightTexture.Height-1 do
 begin
  ScanVirtualBrightTexture[i] := VirtualBrightTexture.ScanLine[i]; // Привязываем массив Сканлайн к битмапу "VirtualBrightTexture"
  ScanVirtualDrawContrast[i] := VirtualDrawContrast.ScanLine[i]; // Привязываем массив Сканлайн к битмапу "VirtualDrawContrast"
 end;

 // Поменять цветные треугольники
 Image_3.Picture.Bitmap.Assign(VirtualTexture[NumOfBright_2]);

 if (NumOfBright_2 > 199) then
 begin
  // цвет кисти для линий
	brush_R1 := 0;
  	brush_G1 := 0;
    	brush_B1 := 0;
 end
 else // Поменять цвет кисти
 begin
	brush_R1 := 255;
  	brush_G1 := 254;
    	brush_B1 := 253;
 end;

Yarkost := NumOfBright_1 /2; // Яркость (От 0 до 254)
Zcontrast := NumOfContrast_1; // Контрастность

BGW := 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
D := Yarkost-trunc(Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
Yarkost := trunc(Yarkost);
Zmax := trunc(abs (127 - abs ((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
Lc := 1 - Ceil (((127 - Zcontrast) - Zmax) / 128);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
Zcontrast := (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
//------------------Поменять «Цвет» --------------------------------------
// Xall := (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
// а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
Xall := NumOfShade; // Координата выбранной ячейки с цветом, по оси X
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
Xout := Ceil ((765 - Xall) / 766) * ((1 - Ceil (Xall / 1531)) + Floor (Xall / 1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
Q := Ceil ((Xall2 + 1) / 255);    // Номер выбранного треугольника
E := 1 - (Q / 2 - Floor (Q / 2)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
Y1 := (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
Xborder := 127 - (Y1 / 2); // Количество пустых ячеек, слева от треугольника
Qa := (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
Xc := Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
LR := Ceil ((Xc / 254) - 0.5); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
Zero := 1 - Ceil (Zmax / 127); // Переменная, для исключения деления на ноль
 // КОРРЕКТИРОВКА
 // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
  Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128);
  Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc); // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то стандартный переброс
 // между ячейками невозможен, поэтому следует сделать сплошной переход (включая в рассчеты пустую ячейку)
 SkipRow1 := Trunc((127-Zcontrast)/126)*(D*2)*(1-Lc); // При D=0,5 и Z=1, SkipRow1=1, иначе 0
 // Координата по оси X, на общей сетке координат
  Xx := trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+
          (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*LR)*
           (1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout)));
   //        = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2);
   //        = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   //        = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;
   // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));
   Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));

 Zazor := 1;  // Зазор между треугольниками
 for j := 0 to (254-trunc(D*2)) do // Яркость от 0 до 254
 begin
 // Яркость
  Yarkost := j;
  Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)));

  for i := 0 to trunc(Zmax2) do // Контрастность
  begin
  // Контрастность
   Zcontrast := 127-i;

   Zero2 := 1-Ceil(Y1/254);
   k := (1/(Y1+Zero2))*Xc;
   Y2 := ((127-Zcontrast)*2)+(D*4)*E;
   Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2));

  // нужно т.к. на 254 яркости, при D=0.5, нет ячеек с цветом
   NoRow254 := 1-Trunc(Yarkost/254); // 0 если TheYarkost=254, иначе 1

   RGBmin2 := Yarkost-(127-Zcontrast);
   RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
   RGBmid2 := abs(abs((Y2/2)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

  // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
   R:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   G:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   B:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));

   // Нарисовать точку с цветом по координатам: X = (j+128)+trunc(D*4+Zazor) , Y = trunc(127-i);
   ScanVirtualBrightTexture[trunc(127-i), (j+128)+trunc(D*4+Zazor)].rgbRed   := trunc(R);
   ScanVirtualBrightTexture[trunc(127-i), (j+128)+trunc(D*4+Zazor)].rgbGreen := trunc(G);
   ScanVirtualBrightTexture[trunc(127-i), (j+128)+trunc(D*4+Zazor)].rgbBlue  := trunc(B);
  end;

///////////////////////////////////////////////////////////////////////////////
  if (CheckBox_2.Checked = true) then // Если нужно рисовать линию контрастности на треугольнике с яркостью
  begin
   // Линия контрастности на треугольнике с яркостью
   Zcontrast := NumOfContrast_2; // Контрастность

   Lc := 1-Ceil(((127-Zcontrast)-Zmax)/128); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast := (127-Zcontrast)*Lc + Zmax*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
   Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zero := 1-Ceil(Zmax/127); // Переменная, для исключения деления на ноль
   Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»

   // Нарисовать точку по координатам: X = (j+128)+trunc(D*4+Zazor) , Y = trunc(Zcontrast);
   ScanVirtualDrawContrast[trunc(Zcontrast), (j+128)+trunc(D*4+Zazor)].rgbRed   := brush_R1;
   ScanVirtualDrawContrast[trunc(Zcontrast), (j+128)+trunc(D*4+Zazor)].rgbGreen := brush_G1;
   ScanVirtualDrawContrast[trunc(Zcontrast), (j+128)+trunc(D*4+Zazor)].rgbBlue  := brush_B1;
  end;
///////////////////////////////////////////////////////////////////////////////

  if (CheckBox_4.Checked = true) then // Если нужно рисовать, ч/б линию яркости , под треугольником яркости
  begin
   // Рисуем ч/б линию яркости, по координатам: X = (j+128)+trunc(D*4+Zazor) , Y = 129;
   ScanVirtualBrightTexture[ 129, (j+128)+trunc(D*4+Zazor)].rgbRed   := j;
   ScanVirtualBrightTexture[ 129, (j+128)+trunc(D*4+Zazor)].rgbGreen := j;
   ScanVirtualBrightTexture[ 129, (j+128)+trunc(D*4+Zazor)].rgbBlue  := j;
  end
  else // Иначе закрасить линию белым
  begin
   ScanVirtualBrightTexture[ 129, (j+128)+trunc(D*4+Zazor)].rgbRed   := 255;
   ScanVirtualBrightTexture[ 129, (j+128)+trunc(D*4+Zazor)].rgbGreen := 255;
   ScanVirtualBrightTexture[ 129, (j+128)+trunc(D*4+Zazor)].rgbBlue  := 255;
  end;

 end;
////////////////////////////////////////////////////////////////////////
 // Точка на треугольнике с Яркостью
  Yarkost := NumOfBright_2 /2; // Яркость (От 0 до 254)
  D := Yarkost-Trunc(Yarkost); // Четная (D2=0) или нечетная (D2=0.5) яркость
  Yarkost := Trunc(Yarkost);
  Zcontrast := NumOfContrast_2; // Контрастность

  Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW;

  Lc := 1-Ceil(((127-Zcontrast)-Zmax)/128); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
  Zcontrast := Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
   Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zero := 1-Ceil(Zmax/127); // Переменная, для исключения деления на ноль
   // Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
    Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»

  X := trunc((Yarkost+128)+trunc(D*4+Zazor));
  Y := trunc(Zcontrast);

 if (CheckBox_3.Checked = true) then // Если нужно рисовать точку на треугольнике яркости
 begin
  for i := 0 to 2 do
  begin
   for j := 0 to 2 do
   if ((Y-1)+i>=0) and ((Y-1)+i<=258) then
   if ((X-1)+j>=0) and ((X-1)+j<=1529) then
   if ((X-1)+j<>X) or ((Y-1)+i<>Y) then
   begin
   // Нарисовать точку по координатам: X = (X-1)+j , Y = (Y-1)+i;
    ScanVirtualDrawContrast[(Y-1)+i,(X-1)+j].rgbRed   := brush_R1;
    ScanVirtualDrawContrast[(Y-1)+i,(X-1)+j].rgbGreen := brush_G1;
    ScanVirtualDrawContrast[(Y-1)+i,(X-1)+j].rgbBlue  := brush_B1;
   end;
  end;

  // Создать прозрачный пиксель, по центру созданного квадрата
  ScanVirtualDrawContrast[Y,X].rgbRed   := 255;
  ScanVirtualDrawContrast[Y,X].rgbGreen := 255;
  ScanVirtualDrawContrast[Y,X].rgbBlue  := 255;
 end;

////////////////////////////////////////////////////////////////////////
 // Линия контрастности на цветных треугольниках
  Zmax2 := Zmax;
  Zazor := 1;


 if (CheckBox_5.Checked = true) then // Если нужно рисовать линию контрастности на цветных треугольниках
 begin
  Zero2 := 1 - Ceil (Y1 / 254);
  k := (1 / (Y1 + Zero2)) * Xc;

  for i := 0 to trunc(Zmax) do
  begin
   Z := 127 - i;

   Lc := 1 - Ceil (((127 - Z) - Zmax) / 128); // Если Z<=Zmax , то Lc=1, Если Z>Zmax, то Lc=0
   Z := (127 - Z) * Lc + Zmax * (1 - Lc); // Если выбранная контрастность, за пределами Zmax, то Z=Zmax
   Lc := 1 - Ceil ((Zmax2 - Zmax) / 128); // Если Zmax2<=Zmax , то Lc=1, Если Zmax2>Zmax, то Lc=0
   Z := 127 - (Round ((Zmax2 / (Zmax + Zero)) * Z) * Lc + Z * (1 - Lc));

   Y2 := ((127 - Z) * 2) + (D * 4) * E;
   Xc2 := Abs ((Y2 * LR) - Round (Abs (k - LR) * Y2));
   //X2 := Qq + Z - (D * 2) * E + Xc2; // Положение относительно реальной сетки координат
   X2 := (127-Y2/2)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

   if (Q = 1) then
   begin
    Xdraw := Trunc (Z);    // Координата для отрисовки на картинку, по оси X
    Ydraw := Trunc (254 - X2 + 1) + Zazor; // Координата для отрисовки на картинку, по оси Y
   end
   else if (Q = 2) then
   begin
    Xdraw := Trunc (X2 - 255 + D * 2); // Координата для отрисовки на картинку, по оси X
    Ydraw := Trunc (Z);    // Координата для отрисовки на картинку, по оси Y
   end
   else if (Q = 3) then
   begin
    Xdraw := Trunc (X2 - 255 + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
    Ydraw := Trunc (Z);    // Координата для отрисовки на картинку, по оси Y
   end
   else if (Q = 4) then
   begin
    Xdraw := Trunc (127 - Z + 382 + D * 2 + 1 + Zazor * 2 + D * 2);    // Координата для отрисовки на картинку, по оси X
    Ydraw := Trunc (X2 - ((Q - 1) * 255 - 1)) + Zazor; // Координата для отрисовки на картинку, по оси Y
   end
   else if (Q = 5) then
   begin
    Xdraw := Trunc (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
    Ydraw := Trunc (127 - Z + 129) + Zazor * 2;    // Координата для отрисовки на картинку, по оси Y
   end
   else
   begin
    Xdraw := Trunc (254 - (X2 - 1275) + (D * 2)); // Координата для отрисовки на картинку, по оси X
    Ydraw := Trunc (127 - Z + 129) + Zazor * 2;    // Координата для отрисовки на картинку, по оси Y
   end;

   // Линия контрастности
   ScanVirtualDrawContrast[Ydraw, Xdraw].rgbRed   := brush_R1;
   ScanVirtualDrawContrast[Ydraw, Xdraw].rgbGreen := brush_G1;
   ScanVirtualDrawContrast[Ydraw, Xdraw].rgbBlue  := brush_B1;
  end;
 end;
  //+++++++++++++++++++++++++++++++++++++++++++

 if (CheckBox_6.Checked = true) then // Если нужно рисовать точку на цветных треугольниках
 begin
  // Нарисовать точку контрастности на цветных треугольниках +++++++++++++++++++++++++
  Zero2 := 1 - Ceil (Y1 / 254);
  k := (1 / (Y1 + Zero2)) * Xc;
  Y2 := ((127 - Zcontrast) * 2) + (D * 4) * E;
  Xc2 := Abs ((Y2 * LR) - Round (Abs (k - LR) * Y2));
  //Qq := 255 * (Q - 1); // Отступ, от координат первого треугольника (127+255)=382 'Центр 2 треугольника
  //X2 := Qq + Zcontrast - (D * 2) * E + Xc2; // Положение относительно реальной сетки координат
  X2 := (127-Y2/2)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

  Zazor := 1;

  if (Q = 1) then
  begin
   Xdraw := Trunc (Zcontrast);    // Координата для отрисовки на картинку, по оси X
   Ydraw := Trunc (254 - X2 + 1) + Zazor; // Координата для отрисовки на картинку, по оси Y
  end
  else if (Q = 2) then
  begin
   Xdraw := Trunc (X2 - 255 + D * 2); // Координата для отрисовки на картинку, по оси X
   Ydraw := Trunc (Zcontrast);    // Координата для отрисовки на картинку, по оси Y
  end
  else if (Q = 3) then
  begin
   Xdraw := Trunc (X2 - 255 + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
   Ydraw := Trunc (Zcontrast);    // Координата для отрисовки на картинку, по оси Y
  end
  else if (Q = 4) then
  begin
   Xdraw := Trunc (127 - Zcontrast + 382 + D * 2 + 1 + Zazor * 2 + D * 2);    // Координата для отрисовки на картинку, по оси X
   Ydraw := Trunc (X2 - ((Q - 1) * 255 - 1)) + Zazor; // Координата для отрисовки на картинку, по оси Y
  end
  else if (Q = 5) then
  begin
   Xdraw := Trunc (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
   Ydraw := Trunc (127 - Zcontrast + 129) + Zazor * 2;    // Координата для отрисовки на картинку, по оси Y
  end
  else
  begin
   Xdraw := Trunc (254 - (X2 - 1275) + (D * 2)); // Координата для отрисовки на картинку, по оси X
   Ydraw := Trunc (127 - Zcontrast + 129) + Zazor * 2;    // Координата для отрисовки на картинку, по оси Y
  end;

  for i := 0 to 2 do
  begin
   for j := 0 to 2 do
   begin
    if (((Ydraw - 1) + i >= 0) and ((Ydraw - 1) + i <= 258)) then
    if (((Xdraw - 1) + j >= 0) and ((Xdraw - 1) + j <= 1529)) then
    if (((Xdraw - 1) + j <> Xdraw) or ((Ydraw - 1) + i <> Ydraw)) then
    begin
     // Нарисовать точку по координатам: Xdraw , Ydraw;
     ScanVirtualDrawContrast[((Ydraw - 1) + i), (Xdraw - 1) + j].rgbRed   := brush_R1;
     ScanVirtualDrawContrast[((Ydraw - 1) + i), (Xdraw - 1) + j].rgbGreen := brush_G1;
     ScanVirtualDrawContrast[((Ydraw - 1) + i), (Xdraw - 1) + j].rgbBlue  := brush_B1;
    end
    else
    begin // Создать прозрачный пиксель, по центру созданного квадрата
     ScanVirtualDrawContrast[((Ydraw - 1) + i), (Xdraw - 1) + j].rgbRed   := 255;
     ScanVirtualDrawContrast[((Ydraw - 1) + i), (Xdraw - 1) + j].rgbGreen := 255;
     ScanVirtualDrawContrast[((Ydraw - 1) + i), (Xdraw - 1) + j].rgbBlue  := 255;
    end;
   end;
  end;
 end;

 if (CheckBox_7.Checked = true) then // Если нужно заполнять квадрат с цветом
 begin
  // Заполняем КВАДРАТ с выбранным цветом
  for j := 215+Floor(D*2) to 296+Floor(D*2) do
  begin // Яркость от 0 до 254
   for i := 131 to 212 do
   begin // Контрастность
    if ((j > 215+Floor(D*2)) and (j < 255+Floor(D*2)) and (i > 131) and (i < 212)) then
    begin // Цвет
     // Нарисовать точку с цветом по координатам: X := j , Y := i;
     ScanVirtualBrightTexture[i,j].rgbRed   := Main_R;
     ScanVirtualBrightTexture[i,j].rgbGreen := Main_G;
     ScanVirtualBrightTexture[i,j].rgbBlue  := Main_B;
    end
    else
    if ((j > 255+Floor(D*2)) and (j < 296+Floor(D*2)) and (i > 131) and (i < 212)) then
    begin // Цвет
     // Нарисовать точку с цветом по координатам: X := j , Y := i;
     ScanVirtualBrightTexture[i,j].rgbRed   := Main_R2;
     ScanVirtualBrightTexture[i,j].rgbGreen := Main_G2;
     ScanVirtualBrightTexture[i,j].rgbBlue  := Main_B2;
    end
    else // Черная рамка
    begin
     // Нарисовать точку с цветом по координатам: X := j , Y := i;
     ScanVirtualBrightTexture[i,j].rgbRed   := 0;
     ScanVirtualBrightTexture[i,j].rgbGreen := 0;
     ScanVirtualBrightTexture[i,j].rgbBlue  := 0;
    end;
   end;
  end;
 end;

 Image_4.Picture.Bitmap.Assign(VirtualBrightTexture); // Показать треугольник яркости
 Image_5.Picture.Bitmap.Assign(VirtualDrawContrast); // Показать линии
end;

procedure TForm3.CreateBrightTriangles(); // Создать цветные треугольники
var
//png : TPngImage;
w2,h2,D0,StepLight,StepLight2,Q,i,j,Zazor,Xdraw,Ydraw : integer;
R,G,B,A,Zmax,E,E2,L2,D,D2,X2,RGBmax, RGBmin, RGBmid,Light,Light1,cW,
Qt,Qq,Qp,Qrgbmax, Qrgbmin, Qrgbmid : extended;
begin
 w2 := 514; // Ширина текстуры
 h2 := 259; // Высота текстуры

 for D0 := 0 to 1 do // 0-Четные, 1-Нечетные треугольники
 begin
  for StepLight := 0 to 254 do // Яркость от 0 до 254
  begin
   if D0+StepLight<255 then // Пропустить нечетный треугольник 254 яркости
   begin

    StepLight2 := trunc((StepLight+(D0/2))*2); // Яркость от 0 до 508 (Поделить на 2, чтобы определить значение яркости в пределах от 0 до 254)
    // Копируем изображение в массив Сканлайн
    // Нужно делать этот цикл каждый раз, когда "VirtualTexture" теряет связь с массивом "ScanVirtualTexture"
    for i := 0 to h2-1 do
    begin
     ScanVirtualTexture[i] := VirtualTexture[StepLight2].ScanLine[i]; // Привязываем массив Сканлайн к битмапу "VirtualTexture"
    end;

     for Q := 1 to 6 do // № Треугольника (от 1 до 6)
     begin
      // Построить цветной треугольник ------------------------------------------------------------------
      Light1 := (StepLight * 2 + D0) / 2; // Яркость
      D := Light1-trunc(Light1); // Если число дробное, то D=0.5, иначе D=0
      Light := Light1-D;
      D2 := Trunc(Light/254);  // Исключается 254 и 255 яркость (D=0)
      A := Trunc(Light/127) - D2;  // Если яркость «Light» >=128, то A=1 , иначе A=0
      Zmax := (127-abs(Light-127)-((D*2)*A))* (1-D2);  // Максимальное кол-во рядов на заданной яркости «Light»
      cW := (127-(127-Zmax))*2 +(D*2)+1;  // Количество ячеек в самом верхнем ряду «Zmax»
      Qq := 255*(Q-1);  // Отступ, от координат первого треугольника
      E := (Q/2);  // Целое или дробное число, для подсчета ниже
      E := (E-Trunc(E))*4 - 1;  // Если выбран цвет типа 255 255 0, то E=-1 , если 255 0 0 , то E=1
      E2 := abs(E-1)/2;  // Если выбран цвет типа 255 255 0, то E2=1 , если 255 0 0 , то E2=0
     // Начать цикл
      for i := 127 downto trunc(127-Zmax) do // Снизу вверх, (от 127 до 0), где вместо 0 ставится макс. кол-во рядов Zmax
      begin
       cW := (127-i)*2; // Кол-во ячеек в ряду - i ((-1), т.к. 0 считается за единицу)
       for j := trunc(i- (D*2)*E2) to trunc((i+cW)+ (D*2)*E2) do // Цикл от i ячейки , до макс. количества ячеек в ряду (-1)
       begin
        // Найти максимальное, минимальное и среднее значение (R,G,B)
        RGBmax:=Light+1+(D*2)+(127-i);
        RGBmid:=abs(Light-(127-i)*E + abs(127-j)*E) + E2*(1+D*2)+(Ceil(abs(127-j)/130))*(1-Ceil(Light/256))*E*(D*4);
        RGBmin:=Light-(127-i);
        L2 := Ceil((j/254)-0.5) ; // Если ячейка находится левее центра, то L2=0 , иначе L2=1
        Qt := 1-(Q/2-Trunc(Q/2))*2; // Если треугольник = четному числу, то E = 1 иначе E = 0
        Qrgbmax := Trunc((Q+((1-L2)*(-Qt)+L2*Qt)-(L2*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
        Qrgbmin := ((Q+((1-L2)*(-(1-Qt))+L2*(1-Qt))+((1-L2)*((1-Ceil((Q-1)/6))*6)))/2)-1; // = 0- B, 1- R, 2- G .                            - RGBmin
        Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
        Qrgbmid := (Qp+L2-(L2*Trunc(Qp/3)*3))-1; //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
        // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
        R := (1-Ceil(Qrgbmax/2))*RGBmax+(1-abs(Qrgbmin-1))*RGBmin + Trunc(Qrgbmid/2)*RGBmid;
        G := (1-abs(Qrgbmax-1))*RGBmax+Trunc(Qrgbmin/2)*RGBmin + (1-abs(Qrgbmid-1))*RGBmid;
        B := Trunc(Qrgbmax/2)*RGBmax+(1-Ceil(Qrgbmin/2))*RGBmin+(1-Ceil(Qrgbmid/2))*RGBmid;
        X2 := j+Qq; // Основная координата ячейки по оси X

        Zazor := 1;  // Если нужен зазор между треугольниками
        if Q=1 then // Для 1 треугольника
        begin // Координаты цвета на картинке, по оси X, Y
         Xdraw := trunc(i);     Ydraw := trunc(254-X2+1) +Zazor;
           end
        else  if Q=2 then  // Для 2 треугольника
        begin // Координаты цвета на картинке, по оси X, Y
         Xdraw := trunc(X2-255+D*2);      Ydraw := trunc(i);
        end
        else  if Q=3 then // Для 3 треугольника
        begin // Координаты цвета на картинке, по оси X, Y
         Xdraw := trunc(X2-255+1+Zazor*2+D*2) ;     Ydraw := trunc(i);
        end
        else  if Q=4 then // Для 4 треугольника
        begin // Координаты цвета на картинке, по оси X, Y
         Xdraw := trunc(127-i+382+D*2+1+Zazor*2+D*2) ;          Ydraw := trunc(X2-((Q-1)*255-1)) +Zazor;
        end
        else  if Q=5 then // Для 5 треугольника
        begin // Координаты цвета на картинке, по оси X, Y
         Xdraw := trunc(509-(X2-1020)+1+Zazor*2+D*2);     Ydraw := trunc(127-i+129) +Zazor*2;
        end
        else     // Для 6 треугольника
        begin // Координаты цвета на картинке, по оси X, Y
         Xdraw := trunc(254-(X2-1275)+(D*2));       Ydraw := trunc(127-i+129) +Zazor*2;
        end;
       // begin // Если объединять треугольники не нужно (Ширина изображения ±1530 пикселей)
       // Xdraw = trunc(X2);    Ydraw = trunc(i);  // Координаты цвета на картинке, по оси X, Y
       // end;

        // Отрисовать цвет (RGB), по координатам - X=Xdraw; Y=Ydraw
        ScanVirtualTexture[Ydraw,Xdraw].rgbRed   := trunc(R);
        ScanVirtualTexture[Ydraw,Xdraw].rgbGreen := trunc(G);
        ScanVirtualTexture[Ydraw,Xdraw].rgbBlue  := trunc(B);
       end;
      end;
     end;

	 	// Сохранить текстуру в памяти
   // png:= TPNGObject.Create;
   // png.Assign(VirtualTexture[StepLight2]);
   // png.SaveToFile(GetCurrentDir+'\'+inttostr(StepLight2)+'.png');
   // png.Free;
   end;
  end;
 end;
end;

end.
20 дек 19, 10:46    [22044999]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12762
Такими темпами, глядишь, лет через десять и до СIE LAB доберемся.
20 дек 19, 10:49    [22045003]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
C# Unity3D:
+ Нарисовать цветовую палитру
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using System.IO; // Используем библиотеку ввода вывода

public class Draw_ColorPalette : MonoBehaviour {

  [HideInInspector]
  public Texture2D VirtualBrightTexture; // Треугольник яркости
  [HideInInspector]
  public Texture2D VirtualDrawContrast; // Линии
  private Color[] ClearPixels1; // Для быстрой очистки изображений
  private Color brushColor,brushColor2; // цвет кисти

  private int Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, // Яркость, Оттенок, Контрастность
  Main_NumOfBright2, Main_NumOfShade2, Main_NumOfShade3,
  Main_NumOfContrast2, Main_NumOfContrast3, // Яркость2, Оттенок2, Контрастность2
  Main_R, Main_G, Main_B, Main_R2, Main_G2, Main_B2;

  // Переменные для отрисовки цветных треугольников ------------------------------------------------------------------  
  [HideInInspector]
  public Texture2D[] VirtualTexture = new Texture2D[509]; // копия изображений
  private int Q,i,j,Zazor,Xdraw,Ydraw;
  private float R,G,B,A,Zmax,E,E2,L2,D,D2,X2,RGBmax, RGBmin, RGBmid,Light,Light1,cW, Qt,Qq, Qp,Qrgbmax, Qrgbmin, Qrgbmid;
  // ------------------------------------------------------------------------------------------------------

  // Для выбора цвета на изображении
  private Color Mouse_Color;
  private int Mouse_X, Mouse_Y, Mouse_InvertImageTop, Mouse_R, Mouse_G, Mouse_B,
  Mouse_InTriangle, // 1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
  Mouse_1,Mouse_Zazor, Mouse_Bright1, Mouse_Shade1, Mouse_Contrast1;
  private float Mouse_D, Mouse_Yout, Mouse_Lc;


  void Start () {
   Mouse_InvertImageTop = Mathf.FloorToInt(Screen.height - boxOfGUI_Image_3.yMin)+2; // "Y" позиция изображения с треугольниками, относительно верхней части экрана

   CreateBrightTriangles (); // Создать цветные треугольники

   VirtualBrightTexture = new Texture2D(514, 259); // Треугольник яркости
   VirtualBrightTexture.filterMode = FilterMode.Point; // Для четкой отрисовки 
   VirtualDrawContrast = new Texture2D(514, 259); // Линии
   VirtualDrawContrast.filterMode = FilterMode.Point;
   // Очистить изображения
   VirtualBrightTexture = MakeTex(514, 259, new Color(1, 1, 1, 0));
   VirtualDrawContrast = MakeTex(514, 259, new Color(1, 1, 1, 0));

   ClearPixels1 = VirtualBrightTexture.GetPixels (0, 0, 514, 259); // Для быстрой очистки изображений

   CheckBox_1 = false; // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции
   CheckBox_2 = true; // true - рисовать линию контрастности на треугольнике с яркостью
   CheckBox_3 = true; // true - рисовать точку на треугольнике яркости
   CheckBox_4 = true; // true - рисовать, ч/б линию яркости , под треугольником яркости
   CheckBox_5 = true; // true - рисовать линию контрастности на цветных треугольниках
   CheckBox_6 = true; // true - рисовать точку на цветных треугольниках
   CheckBox_7 = true; // true - заполнить квадрат с цветом
   CheckBox_Even = false; // true - четная яркость
   CheckBox_Odd = false; // true - нечетная яркость (если Even и Odd = false, то учитываются все виды яркости)

   Main_NumOfBright = 254; // Яркость
   Main_NumOfShade = 128;  // Оттенок
   Main_NumOfContrast = 0; // Контрастность
   Main_NumOfBright2 = 254; // Яркость2
   Main_NumOfShade2 = 128;  // Оттенок2
   Main_NumOfContrast2 = 0; // Контрастность2
   Main_NumOfShade3 = 128;  // Оттенок2 (для контрастности)
   Main_NumOfContrast3 = 0; // Контрастность2 (для яркости)

   Main_R = 255;
   Main_G = 0;
   Main_B = 0;
   Main_R2 = 255;
   Main_G2 = 0;
   Main_B2 = 0;

   TrackBar_1 = 254; // Яркость
   TrackBar_2 = 128;  // Оттенок
   TrackBar_3 = 0; // Контрастность
   TrackBar_4 = 254; // Яркость2
   TrackBar_5 = 128;  // Оттенок2
   TrackBar_6 = 0; // Контрастность2

   TrackBar_1_Check = TrackBar_1;
   TrackBar_2_Check = TrackBar_2;
   TrackBar_3_Check = TrackBar_3;
   TrackBar_4_Check = TrackBar_4;
   TrackBar_5_Check = TrackBar_5;
   TrackBar_6_Check = TrackBar_6;

   // Стиль для текстовых полей 
   largeFont_RGB.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
   largeFont_RGB.fontSize = 14;
   largeFont_RGB.normal.textColor = Color.black;
   styleColor_Label.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
   styleColor_Label.fontSize = 14;
   styleColor_Label.normal.textColor = Color.black;
   styleColor_Label_4.normal.background = MakeTex(130, 70, new Color(1, 1, 1, 1));
   styleColor_Label_4.fontSize = 9;
   styleColor_Label_4.normal.textColor = Color.black;

   // Нарисовать треугольник яркости
   DrawBrightTriangle(Main_NumOfBright2,Main_NumOfBright2,Main_NumOfShade2,
    Main_NumOfContrast2,Main_NumOfContrast2);
  }

  private Texture2D MakeTex(int width, int height, Color col) // Создать текстуру определенного цвета
  {
   Color[] pix = new Color[width*height];
   for(int i = 0; i < pix.Length; i++)
    pix[i] = col;
   Texture2D result = new Texture2D(width, height);
   result.SetPixels(pix);
   result.Apply();
   return result;
  }

  // Кнопка /////////////////////////////////////////////
  private Rect boxOfGUI_Button_1 = new Rect (600, 160, 80, 30); // Положение кнопки (+ оттенок)
  // Текстовые поля
  private GUIStyle largeFont_RGB = new GUIStyle("textField"); // Стиль текстовых полей RGB
  private bool RGB1_Changed; // Если RGB1 изменен
  private string sToEdit_Check_R1,sToEdit_Check_G1,sToEdit_Check_B1; // Для проверки изменения текста
  private string stringToEdit_R1 = "127"; // Текст "R" (Указываемый цвет)
  private Rect boxOfGUI_Edit_R1 = new Rect (328, 23, 40, 20); // Положение текстового поля "R" (Указываемый цвет)
  private string stringToEdit_G1 = "0"; // Текст "G" (Указываемый цвет)
  private Rect boxOfGUI_Edit_G1 = new Rect (392, 23, 40, 20); // Положение текстового поля "G" (Указываемый цвет)
  private string stringToEdit_B1 = "0"; // Текст "B" (Указываемый цвет)
  private Rect boxOfGUI_Edit_B1 = new Rect (457, 23, 40, 20); // Положение текстового поля "B" (Указываемый цвет)
  private string stringToEdit_R2 = "127"; // Текст "R" (Результат)
  private Rect boxOfGUI_Edit_R2 = new Rect (38, 168, 40, 20); // Положение текстового поля "R" (Результат)
  private string stringToEdit_G2 = "0"; // Текст "G" (Результат)
  private Rect boxOfGUI_Edit_G2 = new Rect (102, 168, 40, 20); // Положение текстового поля "G" (Результат)
  private string stringToEdit_B2 = "0"; // Текст "B" (Результат)
  private Rect boxOfGUI_Edit_B2 = new Rect (167, 168, 40, 20); // Положение текстового поля "B" (Результат)
  private string stringToEdit_PlusShade = "1"; // Текст (+ Оттенок)
  private Rect boxOfGUI_Edit_PlusShade = new Rect (540, 165, 50, 20); // Положение текстового поля  (+ Оттенок)
  private float R_timeLeft, G_timeLeft, B_timeLeft, PS_timeLeft; // Таймер чтобы не прокручивать значения слишком быстро
  // Изображения
  private GUIStyle styleColor_Image_1 = new GUIStyle("textField"); // Изображение (Указываемый цвет)
  private GUIStyle styleColor_Image_2 = new GUIStyle("textField"); // Изображение (Результат)
  private Rect boxOfGUI_Image_1 = new Rect (328, 53, 169, 70); // Положение изображения (Указываемый цвет)
  private Rect boxOfGUI_Image_2 = new Rect (328, 122, 169, 70); // Положение изображения (Результат)
  private GUIStyle Color_Image_1 = new GUIStyle("textField"); // Изображение (цветные треугольники)
  private GUIStyle Color_Image_2 = new GUIStyle("textField"); // Изображение (треугольник яркости)
  private GUIStyle Color_Image_3 = new GUIStyle("textField"); // Изображение (линии)
  private Rect boxOfGUI_Image_3 = new Rect (10, 220, 514, 259); // Положение изображений с треугольниками
  // Ползунки
  private Rect boxOfGUI_TrackBar_1 = new Rect (540, 40, 211, 22); // Положение ползунка яркости (Указываемый цвет)
  private Rect boxOfGUI_TrackBar_2 = new Rect (540, 89, 211, 22); // Положение ползунка оттенка (Указываемый цвет)
  private Rect boxOfGUI_TrackBar_3 = new Rect (540, 131, 211, 22); // Положение ползунка контрастности (Указываемый цвет)
  private Rect boxOfGUI_TrackBar_4 = new Rect (32, 40, 211, 22); // Положение ползунка яркости (Результат)
  private Rect boxOfGUI_TrackBar_5 = new Rect (32, 89, 211, 22); // Положение ползунка оттенка (Результат)
  private Rect boxOfGUI_TrackBar_6 = new Rect (32, 131, 211, 22); // Положение ползунка контрастности (Результат)
  float TrackBar_1, TrackBar_2, TrackBar_3, // Ползунки яркости, оттенка, контрастности (Указываемый цвет)
  TrackBar_4, TrackBar_5, TrackBar_6,       // Ползунки яркости, оттенка, контрастности (Результат)
  TrackBar_1_Check, TrackBar_2_Check, TrackBar_3_Check, // Для проверки изменения позиций (указать TrackBar_1_Check перед изменением TrackBar_1, чтобы не применять изменения)
  TrackBar_4_Check, TrackBar_5_Check, TrackBar_6_Check;
  private float TrackBar_1_timeLeft, TrackBar_2_timeLeft, TrackBar_3_timeLeft,
  TrackBar_4_timeLeft, TrackBar_5_timeLeft, TrackBar_6_timeLeft; // Таймер чтобы не прокручивать значения слишком быстро
  private bool TrackBar_WheelChanged; // true - TrackBar изменен колесиком мыши
  // Label
  private GUIStyle styleColor_Label = new GUIStyle("textField"); // Стиль
  private GUIStyle styleColor_Label_4 = new GUIStyle("textField"); // Стиль
  private Rect boxOfGUI_Label_1 = new Rect (540, 14, 156, 23); // Положение Label - яркость RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_2 = new Rect (540, 62, 119, 23); // Положение Label - оттенок RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_3 = new Rect (540, 107, 140, 23); // Положение Label - контрастность RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_4 = new Rect (340, 7, 145, 13); // Положение Label - RGB (Указываемый цвет)
  private Rect boxOfGUI_Label_5 = new Rect (32, 14, 156, 23); // Положение Label - яркость RGB (Результат)
  private Rect boxOfGUI_Label_6 = new Rect (32, 62, 119, 23); // Положение Label - оттенок RGB (Результат)
  private Rect boxOfGUI_Label_7 = new Rect (32, 107, 140, 23); // Положение Label - контрастность RGB (Результат)
  private Rect boxOfGUI_Label_8 = new Rect (50, 151, 145, 13); // Положение Label - RGB (Результат)
  // Чекбоксы
  private bool CheckBox_1, // true - не сохранять пропорции (яркость - контрастность) , false - сохранять пропорции        
  CheckBox_2, // true - рисовать линию контрастности на треугольнике с яркостью
  CheckBox_3, // true - рисовать точку на треугольнике яркости
  CheckBox_4, // true - рисовать, ч/б линию яркости , под треугольником яркости
  CheckBox_5, // true - рисовать линию контрастности на цветных треугольниках
  CheckBox_6, // true - рисовать точку на цветных треугольниках
  CheckBox_7, // true - заполнить квадрат с цветом
  CheckBox_Even, // true - четная яркость
  CheckBox_Odd; // true - нечетная яркость (если Even и Odd = false, то учитываются все виды яркости)
  private Rect boxOfGUI_CheckBox_1 = new Rect (38, 200, 280, 25); // Положение чекбокса - Не сохранять пропорции (яркость - контрастность)
  private Rect boxOfGUI_CheckBox_2 = new Rect (10, 490, 260, 25); // Положение чекбокса - Линия контрастности на треугольнике яркости
  private Rect boxOfGUI_CheckBox_3 = new Rect (10, 510, 260, 25); // Положение чекбокса - Точка на треугольнике яркости
  private Rect boxOfGUI_CheckBox_4 = new Rect (10, 530, 260, 25); // Положение чекбокса - Ч/б линия, под треугольником яркости
  private Rect boxOfGUI_CheckBox_5 = new Rect (280, 490, 260, 25); // Положение чекбокса - Линия контраст. на цветных треугольниках
  private Rect boxOfGUI_CheckBox_6 = new Rect (280, 510, 260, 25); // Положение чекбокса - Точка на цветных треугольниках
  private Rect boxOfGUI_CheckBox_7 = new Rect (280, 530, 260, 25); // Положение чекбокса - Заполнять квадрат с цветом
  private Rect boxOfGUI_CheckBox_Even = new Rect (250, 14, 100, 25); // Положение чекбокса - Четная яркость
  private Rect boxOfGUI_CheckBox_Odd = new Rect (250, 39, 100, 25); // Положение чекбокса - Нечетная яркость
  ///////////////////////////////////////////////////////////////

  void OnGUI () {
   // Текстовые поля /////////////////////////////////////////////

   // Текстовые поля "RGB" (Указываемый цвет)
   stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString(), 3, largeFont_RGB);  
   stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString(), 3, largeFont_RGB);  
   stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString(), 3, largeFont_RGB);  
   // Текстовые поля "RGB" (Результат)
   stringToEdit_R2 = GUI.TextField (boxOfGUI_Edit_R2, Main_R2.ToString(), 3, largeFont_RGB);  
   stringToEdit_G2 = GUI.TextField (boxOfGUI_Edit_G2, Main_G2.ToString(), 3, largeFont_RGB);  
   stringToEdit_B2 = GUI.TextField (boxOfGUI_Edit_B2, Main_B2.ToString(), 3, largeFont_RGB);  
   // Текстовое поле (+ Оттенок)
   stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, stringToEdit_PlusShade, 5, largeFont_RGB);  

   if (boxOfGUI_Edit_R1.Contains (Event.current.mousePosition)) { // Если курсор над R1
    if (Time.fixedTime > R_timeLeft) {
     if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
      R_timeLeft = Time.fixedTime + 0.01f; 
      if (Main_R < 255) {
       Main_R = Main_R + 1;
       stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
       RGB1_Changed = true; // true - RGB1 изменен
      }
     } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
      R_timeLeft = Time.fixedTime + 0.01f;  
      if (Main_R > 0) {     
       Main_R = Main_R - 1;
       stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
       RGB1_Changed = true; // true - RGB1 изменен
      }
     }
    }
   }
   else
    if (boxOfGUI_Edit_G1.Contains (Event.current.mousePosition)) { // Если курсор над G1
     if (Time.fixedTime > G_timeLeft) {
      if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
       G_timeLeft = Time.fixedTime + 0.01f; 
       if (Main_G < 255) {
        Main_G = Main_G + 1;
        stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
        RGB1_Changed = true; // true - RGB1 изменен
       }
      } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
       G_timeLeft = Time.fixedTime + 0.01f;  
       if (Main_G > 0) {     
        Main_G = Main_G - 1;
        stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
        RGB1_Changed = true; // true - RGB1 изменен
       }
      }
     }
    }
    else
     if (boxOfGUI_Edit_B1.Contains (Event.current.mousePosition)) { // Если курсор над B1
      if (Time.fixedTime > B_timeLeft) {
       if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
        B_timeLeft = Time.fixedTime + 0.01f; 
        if (Main_B < 255) {
         Main_B = Main_B + 1;
         stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
         RGB1_Changed = true; // true - RGB1 изменен
        }
       } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
        B_timeLeft = Time.fixedTime + 0.01f;  
        if (Main_B > 0) {     
         Main_B = Main_B - 1;
         stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
         RGB1_Changed = true; // true - RGB1 изменен
        }
       }
      }
     }    
     else
      if (boxOfGUI_Edit_PlusShade.Contains (Event.current.mousePosition)) { // Если курсор над (+ Оттенок)
       if (Time.fixedTime > PS_timeLeft) {
        if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
         PS_timeLeft = Time.fixedTime + 0.01f; 
         int textnumber1;
         int.TryParse(stringToEdit_PlusShade, out textnumber1); // Строку в число
         if (textnumber1 < 1529) {
          textnumber1 = textnumber1 + 1;
          stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
         }
        } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
         PS_timeLeft = Time.fixedTime + 0.01f;  
         int textnumber1;
         int.TryParse(stringToEdit_PlusShade, out textnumber1); // Строку в число
         if (textnumber1 > -1529) {     
          textnumber1 = textnumber1 - 1;
          stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
         }
        }
       }
      }

   // Изображения /////////////////////////////////////////////

   GUI.Label (boxOfGUI_Image_1, "", styleColor_Image_1); // Изображение (Указываемый цвет)
   GUI.Label (boxOfGUI_Image_2, "", styleColor_Image_2); // Изображение (Результат)
   // Изображения /////////////////////////////////////////////
   GUI.Label (boxOfGUI_Image_3, "", Color_Image_1); // Цветные треугольники
   GUI.Label (boxOfGUI_Image_3, "", Color_Image_2); // Треугольник яркости
   GUI.Label (boxOfGUI_Image_3, "", Color_Image_3); // Линии

   if (boxOfGUI_Image_3.Contains (Event.current.mousePosition)) { // Если курсор над Color_Image_3

    if (Input.GetMouseButton (0)) { // Если зажата левая кнопка мыши
     Mouse_1 = 1;
    } else if (Input.GetMouseButton (1)) { // Если зажата правая кнопка мыши
     Mouse_1 = 3;
    } else {
     Mouse_1 = 0;
    }

    if ((Mouse_1 > 0)) {
     Mouse_X = Mathf.FloorToInt (Input.mousePosition.x - boxOfGUI_Image_3.xMin); // X относительно изображения
     Mouse_Y = Mathf.FloorToInt (Mouse_InvertImageTop - Input.mousePosition.y); // Y относительно изображения
     if (Mouse_X < 0)
      Mouse_X = 0;
     if (Mouse_Y < 0)
      Mouse_Y = 0;
     if (Mouse_X > 513)
      Mouse_X = 513;
     if (Mouse_Y > 258)
      Mouse_X = 258;

     if (Mouse_InTriangle == 0) {
      Mouse_Bright1 = Main_NumOfBright2; // Яркость (от 0 до 508)

      Mouse_Zazor = 1;  // Устанавливаем зазор
      Mouse_D = ((Mouse_Bright1 / 2f) - Mathf.FloorToInt (Mouse_Bright1 / 2f)) * 2; // Четная (D=0) или нечетная (D=1) яркость
      // ТРЕУГОЛЬНИК ЯРКОСТИ
      // Если Mouse_Y>127 то Mouse_Yout=0, если Mouse_Y<=127 то Mouse_Yout=1
      Mouse_Yout = (1 - Mathf.CeilToInt (Mathf.FloorToInt (Mouse_Y / 128f) / 10f));
      // Определяем положение треугольника, если Mouse_Lc=1, то координаты в пределах
      // треугольника яркости, если Mouse_Lc=0 - за пределами
      Mouse_Lc = (1 - Mathf.CeilToInt (Mathf.FloorToInt (Mathf.Abs ((Mouse_X - 128 - Mouse_D * (2 - Mathf.FloorToInt (Mouse_X / 257f) * Mouse_D) - Mouse_Zazor) - 127) / (Mouse_Y + 1)) / 1530f)) * Mouse_Yout;

      Mouse_InTriangle = Mathf.FloorToInt (Mouse_1 + Mouse_Lc); //1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
     }

     if (Mouse_1 == 1) { // Если левая кнопка мыши
      if (Mouse_InTriangle == 1) { // Если цветные треугольники
       Mouse_Color = Color_Image_1.normal.background.GetPixel (Mouse_X, 258 - Mouse_Y); // цвет кисти  
       Mouse_R = Mathf.FloorToInt (Mouse_Color.r * 255);
       Mouse_G = Mathf.FloorToInt (Mouse_Color.g * 255);
       Mouse_B = Mathf.FloorToInt (Mouse_Color.b * 255);

       if ((Mouse_R != Mouse_G) | (Mouse_R != Mouse_B)) { // Исключить прозрачный цвет
        // Яркость, оттенок, контрастность, по RGB - Delphi
        BSC_ByRGB (Mouse_R, Mouse_G, Mouse_B, out Mouse_Bright1, out Mouse_Shade1, out Mouse_Contrast1);

        if (//((TrackBar_5_Check != TrackBar_5) | (TrackBar_6_Check != TrackBar_6)) & // Если Яркость, оттенок, контрастность меняются вручную
         ((Mouse_Shade1 != Main_NumOfShade2) |
          (Mouse_Contrast1 != Main_NumOfContrast2))) { // Выполнить процедуру только 1 раз        
         TrackBar_5_Check = Mouse_Shade1;
         TrackBar_6_Check = Mouse_Contrast1;
         TrackBar_5 = Mouse_Shade1;
         TrackBar_6 = Mouse_Contrast1;

         // Поменять цвет RGB - Delphi
         Change_RGB (Main_R, Main_G, Main_B,
          Main_NumOfBright2, Main_NumOfBright2,
          Main_NumOfShade2, Mouse_Shade1,
          Main_NumOfContrast2,
          out Main_R2, out Main_G2, out Main_B2);

         Main_NumOfShade2 = Mouse_Shade1; // Оттенок
         Main_NumOfContrast2 = Mouse_Contrast1; // Контрастность

         Show_Changed_Color (); // Установить значения нижних текстовых полей
        }
       }

      } else if (Mouse_InTriangle == 2) { // Если треугольник яркости
       Mouse_D = ((Main_NumOfBright2 / 2f) - Mathf.FloorToInt (Main_NumOfBright2 / 2f)); // Четная (Mouse_D=0) или нечетная (Mouse_D=1) яркость

       if ((Mouse_X <= (129 + Mouse_D * 2)))
        Mouse_Bright1 = Mathf.FloorToInt (0 + Mouse_D * 2);
       else if ((Mouse_X >= (384 + Mouse_D * 2)))
        Mouse_Bright1 = Mathf.FloorToInt (508 - Mouse_D * 2);
       else
        Mouse_Bright1 = Mathf.FloorToInt ((Mathf.Abs (Mouse_X - (129 + Mouse_D * 2)) - Mouse_D) * 2); // Яркость (от 0 до 508)

       if (//(TrackBar_4_Check != TrackBar_4) & // Если Яркость, оттенок, контрастность меняются вручную
        (Mouse_Bright1 != Main_NumOfBright2)) { // Выполнить процедуру только 1 раз       
        TrackBar_4_Check = Mouse_Bright1;
        TrackBar_4 = Mouse_Bright1;

        // Поменять цвет RGB - Delphi
        Change_RGB (Main_R, Main_G, Main_B,
         Main_NumOfBright2, Mouse_Bright1,
         Main_NumOfShade3, Main_NumOfShade3,
         Main_NumOfContrast3,
         out Main_R2, out Main_G2, out Main_B2);

        Main_NumOfBright2 = Mouse_Bright1; // Яркость

        Show_Changed_Color (); // Установить значения нижних текстовых полей
       }
      }
     } else { // Если правая кнопка мыши
      if (Mouse_InTriangle == 3) { // Если цветные треугольники
       Mouse_Color = Color_Image_1.normal.background.GetPixel (Mouse_X, 258 - Mouse_Y); // цвет кисти  
       Mouse_R = Mathf.FloorToInt (Mouse_Color.r * 255);
       Mouse_G = Mathf.FloorToInt (Mouse_Color.g * 255);
       Mouse_B = Mathf.FloorToInt (Mouse_Color.b * 255);

       if ((Mouse_R != Mouse_G) | (Mouse_R != Mouse_B)) { // Исключить прозрачный цвет
        Main_R = Mouse_R;
        Main_G = Mouse_G;
        Main_B = Mouse_B;
        sToEdit_Check_R1 = Main_R.ToString ();
        sToEdit_Check_G1 = Main_G.ToString ();
        sToEdit_Check_B1 = Main_B.ToString ();
        stringToEdit_R1 = Main_R.ToString ();
        stringToEdit_G1 = Main_G.ToString ();
        stringToEdit_B1 = Main_B.ToString ();

        Find_BSC_AndMake_TheSameColor (); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
       }

      } else if (Mouse_InTriangle == 4) { // Если треугольник яркости

       Mouse_D = ((Main_NumOfBright2 / 2f) - Mathf.FloorToInt (Main_NumOfBright2 / 2f)); // Четная (Mouse_D=0) или нечетная (Mouse_D=1) яркость

       if (Mouse_X <= (129 + Mouse_D * 2))
        Mouse_Bright1 = Mathf.FloorToInt (0 + Mouse_D * 2);
       else if (Mouse_X >= (384 + Mouse_D * 2))
        Mouse_Bright1 = Mathf.FloorToInt (508 - Mouse_D * 2);
       else
        Mouse_Bright1 = Mathf.FloorToInt ((Mathf.Abs (Mouse_X - (129 + Mouse_D * 2)) - Mouse_D) * 2); // Яркость (от 0 до 508)

       if (Mouse_Y > 127)
        Mouse_Contrast1 = 127;
       else {
        Mouse_Contrast1 = 127 - (Mathf.FloorToInt (Mathf.Abs (127 - Mathf.Abs ((127 - (Mouse_Bright1 / 2f)) - Mouse_D)))); // Максимальное количество рядов, на заданной яркости 'Mouse_Bright1/2f'
       }

       // Найти RGB по яркости, оттенку и контрастности - Delphi
       RGB_ByBSC (Mouse_Bright1, Main_NumOfShade3, Mouse_Contrast1, out Main_R, out Main_G, out Main_B);

       if (//((TrackBar_1_Check != TrackBar_1) | (TrackBar_4_Check != TrackBar_4)) & // Если Яркость, оттенок, контрастность меняются вручную
        (Mouse_Bright1 != Main_NumOfBright2)) { // Выполнить процедуру только 1 раз       
        TrackBar_1_Check = Mouse_Bright1;
        TrackBar_4_Check = Mouse_Bright1;
        TrackBar_1 = Mouse_Bright1;
        TrackBar_4 = Mouse_Bright1;

        // Поменять цвет RGB - Delphi
        Change_RGB (Main_R, Main_G, Main_B,
         Main_NumOfBright2, Mouse_Bright1,
         Main_NumOfShade3, Main_NumOfShade3,
         Mouse_Contrast1,
         out Main_R2, out Main_G2, out Main_B2);

        Main_NumOfBright2 = Mouse_Bright1; // Яркость

        Main_R = Main_R2;
        Main_G = Main_G2;
        Main_B = Main_B2;
        sToEdit_Check_R1 = Main_R2.ToString ();
        sToEdit_Check_G1 = Main_G2.ToString ();
        sToEdit_Check_B1 = Main_B2.ToString ();
        stringToEdit_R1 = Main_R2.ToString ();
        stringToEdit_G1 = Main_G2.ToString ();
        stringToEdit_B1 = Main_B2.ToString ();
        stringToEdit_R2 = Main_R2.ToString ();
        stringToEdit_G2 = Main_G2.ToString ();
        stringToEdit_B2 = Main_B2.ToString ();

        Main_NumOfBright = Main_NumOfBright2;
        Main_NumOfShade = Main_NumOfShade2;
        Main_NumOfContrast = Main_NumOfContrast2;

        styleColor_Image_1.normal.background = MakeTex (
         Mathf.FloorToInt (boxOfGUI_Image_1.width), Mathf.FloorToInt (boxOfGUI_Image_1.height), 
         new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B

        Show_Changed_Color (); // Установить значения нижних текстовых полей
       }
      }
     }
    } else
     Mouse_InTriangle = 0; //1,3 - левая,правая кнопка была нажата на цветных треугольниках. 2,4 - левая,правая кнопка была нажата на треугольнике яркости. 0 - кнопка мыши не нажата
   }
   // Ползунки /////////////////////////////////////////////
   TrackBar_1 = GUI.HorizontalSlider (boxOfGUI_TrackBar_1, TrackBar_1, 0.0F, 508.0F); // Ползунок яркости (Указываемый цвет)
   TrackBar_2 = GUI.HorizontalSlider (boxOfGUI_TrackBar_2, TrackBar_2, 0.0F, 1531.0F); // Ползунок оттенка (Указываемый цвет)
   TrackBar_3 = GUI.HorizontalSlider (boxOfGUI_TrackBar_3, TrackBar_3, 0.0F, 127.0F); // Ползунок контрастности (Указываемый цвет)
   TrackBar_4 = GUI.HorizontalSlider (boxOfGUI_TrackBar_4, TrackBar_4, 0.0F, 508.0F); // Ползунок яркости (Результат)
   TrackBar_5 = GUI.HorizontalSlider (boxOfGUI_TrackBar_5, TrackBar_5, 0.0F, 1531.0F); // Ползунок оттенка (Результат)
   TrackBar_6 = GUI.HorizontalSlider (boxOfGUI_TrackBar_6, TrackBar_6, 0.0F, 127.0F); // Ползунок контрастности (Результат)


   if (boxOfGUI_TrackBar_1.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_1
    if (Time.fixedTime > TrackBar_1_timeLeft) {
     if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
      TrackBar_1_timeLeft = Time.fixedTime + 0.01f; 
      if (TrackBar_1 > 0) {     
       TrackBar_1 = TrackBar_1 - 1;
       if ((CheckBox_Even) | (CheckBox_Odd))   // Если нужна только четная или нечетная яркость       
        TrackBar_1 = TrackBar_1 - 1;
       TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
      }
     } else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
      TrackBar_1_timeLeft = Time.fixedTime + 0.01f;  
      if (TrackBar_1 < 508) {
       TrackBar_1 = TrackBar_1 + 1;
       if ((CheckBox_Even) | (CheckBox_Odd))  // Если нужна только четная или нечетная яркость       
        TrackBar_1 = TrackBar_1 + 1;
       TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
      }
     }
    } 
   }
   else
    if (boxOfGUI_TrackBar_2.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_2
     if (Time.fixedTime > TrackBar_2_timeLeft) {
      if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
       TrackBar_2_timeLeft = Time.fixedTime + 0.01f; 
       if (TrackBar_2 > 0) {     
        TrackBar_2 = TrackBar_2 - 1;
        TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
       }
      }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
       TrackBar_2_timeLeft = Time.fixedTime + 0.01f;  
       if (TrackBar_2 < 1531) {
        TrackBar_2 = TrackBar_2 + 1;
        TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
       }
      }
     } 
    }
    else
     if (boxOfGUI_TrackBar_3.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_3
      if (Time.fixedTime > TrackBar_3_timeLeft) {
       if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
        TrackBar_3_timeLeft = Time.fixedTime + 0.01f; 
        if (TrackBar_3 > 0) {     
         TrackBar_3 = TrackBar_3 - 1;
         TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
        }
       }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
        TrackBar_3_timeLeft = Time.fixedTime + 0.01f;  
        if (TrackBar_3 < 127) {
         TrackBar_3 = TrackBar_3 + 1;
         TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
        }
       }
      } 
     }
     else
      if (boxOfGUI_TrackBar_4.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_4
       if (Time.fixedTime > TrackBar_4_timeLeft) {
        if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
         TrackBar_4_timeLeft = Time.fixedTime + 0.01f; 
         if (TrackBar_4 > 0) {     
          TrackBar_4 = TrackBar_4 - 1;
          if ((CheckBox_Even) | (CheckBox_Odd))  // Если нужна только четная или нечетная яркость       
           TrackBar_4 = TrackBar_4 - 1;
          TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
         }
        }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
         TrackBar_4_timeLeft = Time.fixedTime + 0.01f;  
         if (TrackBar_4 < 508) {
          TrackBar_4 = TrackBar_4 + 1;
          if ((CheckBox_Even) | (CheckBox_Odd))  // Если нужна только четная или нечетная яркость       
           TrackBar_4 = TrackBar_4 + 1;
          TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
         }
        }
       } 
      }
      else
       if (boxOfGUI_TrackBar_5.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_5
        if (Time.fixedTime > TrackBar_5_timeLeft) {
         if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
          TrackBar_5_timeLeft = Time.fixedTime + 0.01f; 
          if (TrackBar_5 > 0) {     
           TrackBar_5 = TrackBar_5 - 1;
           TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
          }
         }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
          TrackBar_5_timeLeft = Time.fixedTime + 0.01f;  
          if (TrackBar_5 < 1531) {
           TrackBar_5 = TrackBar_5 + 1;
           TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
          }
         }
        } 
       }
       else
        if (boxOfGUI_TrackBar_6.Contains (Event.current.mousePosition)) { // Если курсор над TrackBar_6
         if (Time.fixedTime > TrackBar_6_timeLeft) {
          if (Input.GetAxis ("Mouse ScrollWheel") > 0) { // Если колесико мыши прокручено от себя (вверх)
           TrackBar_6_timeLeft = Time.fixedTime + 0.01f; 
           if (TrackBar_6 > 0) {     
            TrackBar_6 = TrackBar_6 - 1;
            TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
           }
          }  else if (Input.GetAxis ("Mouse ScrollWheel") < 0) { // Если колесико мыши прокручено на себя (вниз)
           TrackBar_6_timeLeft = Time.fixedTime + 0.01f;  
           if (TrackBar_6 < 127) {
            TrackBar_6 = TrackBar_6 + 1;
            TrackBar_WheelChanged = true; // true - TrackBar изменен колесиком мыши
           }
          }
         } 
        }
   if ((GUI.changed == true) | (TrackBar_WheelChanged)) { // Если были произведены изменения или TrackBar изменен колесиком мыши
    TrackBar_WheelChanged = false; // true - TrackBar изменен колесиком мыши

    if (sToEdit_Check_R1 != stringToEdit_R1) { // Если R1 изменен
     int.TryParse (stringToEdit_R1, out Main_R); // Перевести текст в число
     if (Main_R < 0)
      Main_R = 0;
     else if (Main_R > 255)
      Main_R = 255;
     stringToEdit_R1 = GUI.TextField (boxOfGUI_Edit_R1, Main_R.ToString (), 15, largeFont_RGB);  
     sToEdit_Check_R1 = stringToEdit_R1;
     RGB1_Changed = true; // true - RGB1 изменен
    }

    if (sToEdit_Check_G1 != stringToEdit_G1) { // Если G1 изменен
     int.TryParse (stringToEdit_G1, out Main_G); // Перевести текст в число
     if (Main_G < 0)
      Main_G = 0;
     else if (Main_G > 255)
      Main_G = 255;
     stringToEdit_G1 = GUI.TextField (boxOfGUI_Edit_G1, Main_G.ToString (), 15, largeFont_RGB);  
     sToEdit_Check_G1 = stringToEdit_G1;
     RGB1_Changed = true; // true - RGB1 изменен
    }

    if (sToEdit_Check_B1 != stringToEdit_B1) { // Если B1 изменен
     int.TryParse (stringToEdit_B1, out Main_B); // Перевести текст в число
     if (Main_B < 0)
      Main_B = 0;
     else if (Main_B > 255)
      Main_B = 255;
     stringToEdit_B1 = GUI.TextField (boxOfGUI_Edit_B1, Main_B.ToString (), 15, largeFont_RGB);  
     sToEdit_Check_B1 = stringToEdit_B1;
     RGB1_Changed = true; // true - RGB1 изменен
    }



    if (TrackBar_1_Check != TrackBar_1) { 
     if (TrackBar_1 > TrackBar_1_Check)
      TrackBar_1 = Mathf.CeilToInt (TrackBar_1); // Получить целое число
     else TrackBar_1 = Mathf.FloorToInt (TrackBar_1);

     if (CheckBox_Even) { // Если нужна только четная яркость
      if (TrackBar_1 % 2 != 0) // Если нечетное число
       TrackBar_1 = TrackBar_1 - 1;
     } else if (CheckBox_Odd) { // Если нужна только нечетная яркость
      if (TrackBar_1 % 2 == 0) // Если четное число
       TrackBar_1 = TrackBar_1 + 1;    
      if (TrackBar_1 < 0) TrackBar_1 = 1;
      else if (TrackBar_1 > 508) TrackBar_1 = 507;
     }

     TrackBar_1_Check = TrackBar_1;

     if (TrackBar_1 != Main_NumOfBright) { // Выполнить процедуру только 1 раз   

      Main_NumOfBright = Mathf.FloorToInt(TrackBar_1); // Яркость
      Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
     }
    }

    if (TrackBar_2_Check != TrackBar_2) {
     if (TrackBar_2 > TrackBar_2_Check)
      TrackBar_2 = Mathf.CeilToInt (TrackBar_2); // Получить целое число
     else TrackBar_2 = Mathf.FloorToInt (TrackBar_2);
     TrackBar_2_Check = TrackBar_2;

     if (TrackBar_2 != Main_NumOfShade) { // Выполнить процедуру только 1 раз   

      Main_NumOfShade = Mathf.FloorToInt(TrackBar_2); // Оттенок
      Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
     }
    }

    if (TrackBar_3_Check != TrackBar_3) { 
     if (TrackBar_3 > TrackBar_3_Check)
      TrackBar_3 = Mathf.CeilToInt (TrackBar_3); // Получить целое число
     else TrackBar_3 = Mathf.FloorToInt (TrackBar_3);
     TrackBar_3_Check = TrackBar_3;

     if (TrackBar_3 != Main_NumOfContrast) { // Выполнить процедуру только 1 раз   

      Main_NumOfContrast = Mathf.FloorToInt(TrackBar_3); // Контрастность
      Find_RGB_AndMake_TheSameColor (); // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
     }
    }


    if (TrackBar_4_Check != TrackBar_4) {
     if (TrackBar_4 > TrackBar_4_Check)
      TrackBar_4 = Mathf.CeilToInt (TrackBar_4); // Получить целое число
     else TrackBar_4 = Mathf.FloorToInt (TrackBar_4);

     if (CheckBox_Even) { // Если нужна только четная яркость
      if (TrackBar_4 % 2 != 0) // Если нечетное число
       TrackBar_4 = TrackBar_4 - 1;
     } else if (CheckBox_Odd) { // Если нужна только нечетная яркость
      if (TrackBar_4 % 2 == 0) // Если четное число
       TrackBar_4 = TrackBar_4 + 1;        
      if (TrackBar_4 < 0) TrackBar_4 = 1;
      else if (TrackBar_4 > 508) TrackBar_4 = 507;
     }

     TrackBar_4_Check = TrackBar_4;

     if (TrackBar_4 != Main_NumOfBright2) // Выполнить процедуру только 1 раз   
     {
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
       Main_NumOfBright2, Mathf.FloorToInt(TrackBar_4),
       Main_NumOfShade3, Main_NumOfShade3,
       Main_NumOfContrast3,
       out Main_R2, out Main_G2, out Main_B2);

      Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_4); // Яркость
      // Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_5); // Оттенок
      // Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_6); // Контрастность

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     }

    }

    if (TrackBar_5_Check != TrackBar_5) { 
     if (TrackBar_5 > TrackBar_5_Check)
      TrackBar_5 = Mathf.CeilToInt (TrackBar_5); // Получить целое число
     else TrackBar_5 = Mathf.FloorToInt (TrackBar_5);
     TrackBar_5_Check = TrackBar_5;

     if (TrackBar_5 != Main_NumOfShade2) // Выполнить процедуру только 1 раз   
     {
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
       Main_NumOfBright2, Main_NumOfBright2,
       Main_NumOfShade2, Mathf.FloorToInt(TrackBar_5),
       Main_NumOfContrast2,
       out Main_R2, out Main_G2, out Main_B2);

      Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_5); // Оттенок

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     }

    }

    if (TrackBar_6_Check != TrackBar_6) { 
     if (TrackBar_6 > TrackBar_6_Check)
      TrackBar_6 = Mathf.CeilToInt (TrackBar_6); // Получить целое число
     else TrackBar_6 = Mathf.FloorToInt (TrackBar_6);
     TrackBar_6_Check = TrackBar_6;

     if (TrackBar_6 != Main_NumOfContrast2) // Выполнить процедуру только 1 раз   
     {
      // Поменять цвет RGB - Delphi
      Change_RGB(Main_R,Main_G,Main_B,
       Main_NumOfBright2, Main_NumOfBright2,
       Main_NumOfShade3, Main_NumOfShade3,
       Mathf.FloorToInt(TrackBar_6),
       out Main_R2, out Main_G2, out Main_B2);

      Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_6); // Контрастность

      Show_Changed_Color(); // Установить значения нижних текстовых полей
     }

    }
   }

   if (RGB1_Changed) { // Если RGB1 изменен
    RGB1_Changed = false; // true - RGB1 изменен
    Find_BSC_AndMake_TheSameColor (); // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
   }


   // Label /////////////////////////////////////////////

   GUI.Label (boxOfGUI_Label_1, "Яркость: "+TrackBar_1.ToString()+" ("+(TrackBar_1/2).ToString()+")", styleColor_Label); // Label - яркость RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_2, "Оттенок: "+(TrackBar_2-1).ToString(), styleColor_Label); // Label - оттенок RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_3, "Контрастность: "+TrackBar_3.ToString(), styleColor_Label); // Label - контрастность RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_4, "R                   G                    B", styleColor_Label_4); // Label - RGB (Указываемый цвет)
   GUI.Label (boxOfGUI_Label_5, "Яркость: "+TrackBar_4.ToString()+" ("+(TrackBar_4/2).ToString()+")", styleColor_Label); // Label - яркость RGB (Результат)
   GUI.Label (boxOfGUI_Label_6, "Оттенок: "+(TrackBar_5-1).ToString(), styleColor_Label); // Label - оттенок RGB (Результат)
   GUI.Label (boxOfGUI_Label_7, "Контрастность: "+TrackBar_6.ToString(), styleColor_Label); // Label - контрастность RGB (Результат)
   GUI.Label (boxOfGUI_Label_8, "R                   G                    B", styleColor_Label_4); // Label - RGB (Результат)

   // Чекбокс /////////////////////////////////////////////
   CheckBox_1 = GUI.Toggle (boxOfGUI_CheckBox_1, CheckBox_1, "<color=white><size=11>Не сохранять пропорции (яркость - контрастность)</size></color>");
   CheckBox_2 = GUI.Toggle (boxOfGUI_CheckBox_2, CheckBox_2, "<color=white><size=11>Линия контрастности на треугольнике яркости</size></color>");
   CheckBox_3 = GUI.Toggle (boxOfGUI_CheckBox_3, CheckBox_3, "<color=white><size=11>Точка на треугольнике яркости</size></color>");
   CheckBox_4 = GUI.Toggle (boxOfGUI_CheckBox_4, CheckBox_4, "<color=white><size=11>Ч/б линия, под треугольником яркости</size></color>");
   CheckBox_5 = GUI.Toggle (boxOfGUI_CheckBox_5, CheckBox_5, "<color=white><size=11>Линия контраст. на цветных треугольниках</size></color>");
   CheckBox_6 = GUI.Toggle (boxOfGUI_CheckBox_6, CheckBox_6, "<color=white><size=11>Точка на цветных треугольниках</size></color>");
   CheckBox_7 = GUI.Toggle (boxOfGUI_CheckBox_7, CheckBox_7, "<color=white><size=11>Заполнять квадрат с цветом</size></color>");

   CheckBox_Even = GUI.Toggle (boxOfGUI_CheckBox_Even, CheckBox_Even, "<color=white><size=11>Четное</size></color>");
   CheckBox_Odd = GUI.Toggle (boxOfGUI_CheckBox_Odd, CheckBox_Odd, "<color=white><size=11>Нечетное</size></color>");


   // Кнопка /////////////////////////////////////////////
   if ((GUI.Button (boxOfGUI_Button_1, "+ Оттенок")) |  // Если нажата кнопка "+ Оттенок"
    (Event.current.keyCode == KeyCode.Return)) {     // Или нажата клавиша "Enter"
    if (Time.fixedTime > PS_timeLeft) {
     PS_timeLeft = Time.fixedTime + 0.01f; 

     int textnumber1;
     int.TryParse (stringToEdit_PlusShade, out textnumber1); // Строку в число
     if (textnumber1 < -1529) {
      textnumber1 = -1529;
      stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
     }
     if (textnumber1 > 1529) {
      textnumber1 = 1529;
      stringToEdit_PlusShade = GUI.TextField (boxOfGUI_Edit_PlusShade, textnumber1.ToString (), 5, largeFont_RGB);  
     }

     // Поменять цвет RGB - Delphi
     Change_RGB (Main_R, Main_G, Main_B,
      Main_NumOfBright2, Main_NumOfBright2,
      Main_NumOfShade2, Mathf.FloorToInt (TrackBar_5 + textnumber1),
      Main_NumOfContrast2,
      out Main_R2, out Main_G2, out Main_B2);

     Main_NumOfShade2 = Mathf.FloorToInt (TrackBar_5); // Оттенок

     Show_Changed_Color (); // Установить значения нижних текстовых полей     
    }
   }
  }


  public bool Show_Changed_Color() // Установить значения нижних текстовых полей
  {
   stringToEdit_R1 = Main_R2.ToString();
   stringToEdit_G1 = Main_G2.ToString();
   stringToEdit_B1 = Main_B2.ToString();

   styleColor_Image_2.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
    new Color (Main_R2 / 255f, Main_G2 / 255f, Main_B2 / 255f)); // Заполнить изображение 2 цветом R,G,B

   return true;
  }


  public bool Find_BSC_AndMake_TheSameColor() // Найти яркость, оттенок, контрастность и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
  {
   // Яркость, оттенок, контрастность, по RGB - C# Unity3D
   BSC_ByRGB(Main_R,Main_G,Main_B, out Main_NumOfBright, out Main_NumOfShade, out Main_NumOfContrast);
   TrackBar_1_Check = Main_NumOfBright;
   TrackBar_2_Check = Main_NumOfShade;
   TrackBar_3_Check = Main_NumOfContrast;
   TrackBar_1 = Main_NumOfBright;
   TrackBar_2 = Main_NumOfShade;
   TrackBar_3 = Main_NumOfContrast;

   styleColor_Image_1.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_1.width), Mathf.FloorToInt(boxOfGUI_Image_1.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B

   stringToEdit_R2 = Main_R.ToString();
   stringToEdit_G2 = Main_G.ToString();
   stringToEdit_B2 = Main_B.ToString();
   Main_R2 = Main_R;
   Main_G2 = Main_G;
   Main_B2 = Main_B;

   styleColor_Image_2.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 2 цветом R,G,B

   TrackBar_4_Check = TrackBar_1;
   TrackBar_5_Check = TrackBar_2;
   TrackBar_6_Check = TrackBar_3;
   TrackBar_4 = TrackBar_1;
   TrackBar_5 = TrackBar_2;
   TrackBar_6 = TrackBar_3;
   Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_1);
   Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfShade3 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_3);
   Main_NumOfContrast3 = Mathf.FloorToInt(TrackBar_3);

   // Поменять цвет RGB - Delphi
   Change_RGB(Main_R,Main_G,Main_B,
    Main_NumOfBright2, Main_NumOfBright2,
    Main_NumOfShade2, Main_NumOfShade2,
    Main_NumOfContrast2,
    out Main_R2, out Main_G2, out Main_B2);

   return true;
  }
  public bool Find_RGB_AndMake_TheSameColor() // Найти RGB и установить значения нижних ползунков и текстовых полей в те же позиции что и верхние
  {
   // Найти RGB по яркости, оттенку и контрастности - Delphi
   RGB_ByBSC(Main_NumOfBright,Main_NumOfShade,Main_NumOfContrast, out Main_R, out Main_G, out Main_B);
   sToEdit_Check_R1 = Main_R.ToString();
   sToEdit_Check_G1 = Main_G.ToString();
   sToEdit_Check_B1 = Main_B.ToString();
   stringToEdit_R1 = Main_R.ToString();
   stringToEdit_G1 = Main_G.ToString();
   stringToEdit_B1 = Main_B.ToString();

   styleColor_Image_1.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_1.width), Mathf.FloorToInt(boxOfGUI_Image_1.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 1 цветом R,G,B

   stringToEdit_R2 = Main_R.ToString();
   stringToEdit_G2 = Main_G.ToString();
   stringToEdit_B2 = Main_B.ToString();
   Main_R2 = Main_R;
   Main_G2 = Main_G;
   Main_B2 = Main_B;

   styleColor_Image_2.normal.background = MakeTex (
    Mathf.FloorToInt(boxOfGUI_Image_2.width), Mathf.FloorToInt(boxOfGUI_Image_2.height), 
    new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f)); // Заполнить изображение 2 цветом R,G,B

   TrackBar_4_Check = TrackBar_1;
   TrackBar_5_Check = TrackBar_2;
   TrackBar_6_Check = TrackBar_3;
   TrackBar_4 = TrackBar_1;
   TrackBar_5 = TrackBar_2;
   TrackBar_6 = TrackBar_3;
   Main_NumOfBright2 = Mathf.FloorToInt(TrackBar_1);
   Main_NumOfShade2 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfShade3 = Mathf.FloorToInt(TrackBar_2);
   Main_NumOfContrast2 = Mathf.FloorToInt(TrackBar_3);
   Main_NumOfContrast3 = Mathf.FloorToInt(TrackBar_3);

   // Поменять цвет RGB - Delphi
   Change_RGB(Main_R,Main_G,Main_B,
    Main_NumOfBright2, Main_NumOfBright2,
    Main_NumOfShade2, Main_NumOfShade2,
    Main_NumOfContrast2,
    out Main_R2, out Main_G2, out Main_B2);

   return true;
  }

  public bool BSC_ByRGB(int R, int G, int B,
   out int NumOfBright, out int NumOfShade, out int NumOfContrast) // Яркость, оттенок, контрастность, по RGB - Delphi
  {
   // Переменные
   //int NumOfBright1,NumOfContrast1,NumOfShade1;
   //int R, G, B;
   float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
   Light, BGW, D, E, Q, Zmax, Z, Qp,  LR, Y1, Xc, Xmain;

   //R = … ;  G = … ;  B = … ;
   // Найти максимальное, минимальное и среднее значение из заданных R,G,B
   RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmid=(R+G+B)-(RGBmax+RGBmin);
   // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
   Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
   Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
   Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
   BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
   D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
   Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета
   E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   // Номер треугольника
   Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;
   Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
   Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
   Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
   Qp = Q-Mathf.FloorToInt(Q/4f)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
   // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
   LR = (1-Mathf.Abs(Bm-1))*Mathf.FloorToInt((Qp-1)/2f)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1
    (1-Mathf.Abs(Rm-1))*(1-Mathf.Abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1
    (1-Mathf.Abs(Gm-1))*(1-Mathf.CeilToInt((Qp-1)/2f));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1
   Xc = Mathf.Abs((Light-RGBmin)*(1-LR*2)-Mathf.Abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки
   Xmain = ((127-Y1/2f)+Xc+(Q-1)*255)*BGW;// // Оттенок (Координата по оси X, на общей сетке координат)

   NumOfBright = Mathf.FloorToInt((Light+D)*2); // Яркость, от 0 до 508
   NumOfContrast = Mathf.FloorToInt(Z); // Контрастность, от 0 до 127
   NumOfShade = Mathf.FloorToInt(Xmain+1); // Оттенок, от 0 до 1529 +1
   return true;   
  }

  public bool RGB_ByBSC(int NumOfBright, int NumOfShade, int NumOfContrast,
   out int R, out int G, out int B) // Найти RGB по яркости, оттенку и контрастности - Delphi
  {
   // Переменные:
   //int R, G, B;
   float Rm, Gm, Bm, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
   Zero2, k, Y2, Xc2, Zcontrast, Yarkost, Lc, Zmax, NoRow254,
   RGBmax2, RGBmin2, RGBmid2, Xall, Xall2, Xx, Xx2, Xborder, Xout, 
   SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;

   Yarkost = NumOfBright/2f; // Яркость
   Zcontrast = NumOfContrast; // Контрастность

   BGW = 1; // 1- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
   D = Yarkost - Mathf.FloorToInt (Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
   Yarkost = Mathf.FloorToInt (Yarkost);
   Zmax = Mathf.FloorToInt (Mathf.Abs (127 - Mathf.Abs ((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
   Lc = 1 - Mathf.CeilToInt (((127 - Zcontrast) - Zmax) / 128f);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast = (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
   //------------------Поменять «Цвет» --------------------------------------
   // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
   // а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529

   Xall = NumOfShade; // Оттенок - Координата выбранной ячейки с цветом, по оси X

   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout = Mathf.CeilToInt ((765 - Xall) / 766f) * ((1 - Mathf.CeilToInt (Xall / 1531f)) + Mathf.FloorToInt (Xall / 1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
   Q = Mathf.CeilToInt ((Xall2 + 1) / 255f);    // Номер выбранного треугольника
   E = 1 - (Q / 2f - Mathf.FloorToInt (Q / 2f)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   Y1 = (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
   Xborder = 127 - (Y1 / 2f); // Количество пустых ячеек, слева от треугольника
   Qa = (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
   Xc = Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR = Mathf.CeilToInt ((Xc / 254f) - 0.5f); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
   // КОРРЕКТИРОВКА
   // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
   Lc = 1 - Mathf.CeilToInt (Mathf.FloorToInt (Mathf.Abs ((Xall2 - Qa) - 127) / ((Y1 / 2f) + 1)) / 128f);
   Xc = (Xc - Xborder) * Lc + (Y1 * LR) * (1 - Lc); // Порядковый номер выбранной ячейки в треугольнике
   // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то стандартный переброс
   // между ячейками невозможен, поэтому следует сделать сплошной переход (включая в рассчеты пустую ячейку)
   SkipRow1 = Mathf.FloorToInt ((127 - Zcontrast) / 126f) * (D * 2) * (1 - Lc); // При D=0,5 и Z=1, SkipRow1=1, иначе 0
   // Координата по оси X, на общей сетке координат
   Xx = Mathf.FloorToInt (((1530 * (1 - Mathf.CeilToInt ((Q - 1) / 6f)) + Qa - Xborder - 1 + (1 - 2 * E) * (D * 2)) * (1 - LR) +
    (Qa + 255 + Xborder - (1 - 2 * E) * (D * 2) - 1530 * Mathf.FloorToInt (Q / 6f)) * LR) *
    (1 - Lc - SkipRow1 + Mathf.Abs (Xout)) + (Xall - 1) * (Lc + SkipRow1 - Mathf.Abs (Xout)));
   //+++++++++++++++++++++++++++++++++++++++++++
   // = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
   Qrgbmax = Mathf.FloorToInt ((Q + ((1 - LR) * (-E) + LR * E) - (LR * Mathf.FloorToInt (Q / 6f) * 6)) / 2f);
   // = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
   Qrgbmin = ((Q + ((1 - LR) * (-(1 - E)) + LR * (1 - E)) + ((1 - LR) * ((1 - Mathf.CeilToInt ((Q - 1) / 6f)) * 6))) / 2f) - 1;
   Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   // = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
   Qrgbmid = (Qp + LR - (LR * Mathf.FloorToInt (Qp / 3f) * 3)) - 1;
   // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
   Rm = (1 - Mathf.CeilToInt (Qrgbmax / 2f)) * 2 + Mathf.FloorToInt (Qrgbmid / 2f);
   Gm = (1 - Mathf.Abs (Qrgbmax - 1)) * 2 + (1 - Mathf.Abs (Qrgbmid - 1));
   Bm = Mathf.FloorToInt (Qrgbmax / 2f) * 2 + (1 - Mathf.CeilToInt (Qrgbmid / 2f));

   //// Цвет RGB //////////////////////////////////////////////////////////////// 
   Zero2 = 1-Mathf.CeilToInt(Y1/254f);
   k = (1/(Y1+Zero2))*Xc;
   Y2 = ((127-Zcontrast)*2)+(D*4)*E;
   Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2));
   //Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

   // Поменять значение оттенка, контрастности (если за пределами) ******************************
   TrackBar_2_Check = Xx+1;
   TrackBar_3_Check = Zcontrast;
   TrackBar_5_Check = Xx+1;
   TrackBar_6_Check = Zcontrast;

   TrackBar_2 = Xx+1; // Новый оттенок
   TrackBar_3 = Zcontrast; // Новая контрастность
   TrackBar_5 = Xx+1; // Новый оттенок 2
   TrackBar_6 = Zcontrast; // Новая контрастность 2
   // ****************************************************************************

   // NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
   NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
   // Вычислить максимальное, минимальное и среднее значение
   RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
   RGBmin2 = Yarkost-(127-Zcontrast);
   RGBmid2 = Mathf.Abs(Mathf.Abs((Y2/2f)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

   // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R_main, G_main, B_main)
   R=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   G=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   B=Mathf.FloorToInt (Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   return true;
  }

  public bool Change_RGB(int R, int G, int B,
   int NumOfBright_Before, int NumOfBright_New,
   int NumOfShade_Before, int NumOfShade_New,
   int NumOfContrast, out int R2, out int G2, out int B2) // Поменять цвет RGB - Delphi
  {
   // Переменные
   float RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
   Light, BGW, D, E, Q, Qp, Qa, LR,
   Y1, Xc, Y2, Xc2, Zero, Zero2, k, Z, Xx2,
   Lc,  Zmax, NoRow254, Yarkost, Zcontrast, Zmax2,
   RGBmax2, RGBmin2, RGBmid2, Xmain,
   Xall, Xall2, Xx, Xborder, Xout,
   SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid;

   RGBmax=(((((R+G)/2f)+(Mathf.Abs(R-G)/2f))+B)/2f)+(Mathf.Abs((((R+G)/2f)+(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmin=(((((R+G)/2f)-(Mathf.Abs(R-G)/2f))+B)/2f)-(Mathf.Abs((((R+G)/2f)-(Mathf.Abs(R-G)/2f))-B)/2f);
   RGBmid=(R+G+B)-(RGBmax+RGBmin);
   // Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
   Rm=Mathf.Abs((Mathf.FloorToInt((R+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(R+1))-1);
   Gm=Mathf.Abs((Mathf.FloorToInt((G+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(G+1))-1);
   Bm=Mathf.Abs((Mathf.FloorToInt((B+1)/(RGBmax+1))*3)+Mathf.FloorToInt((RGBmin+1)/(B+1))-1);
   BGW=1-Mathf.FloorToInt((Rm+Gm+Bm)/9f);            // Если (R=G=B), то BGW=0, иначе BGW=1
   D=((RGBmax-RGBmin+1)/2f)-Mathf.FloorToInt((RGBmax-RGBmin+1)/2f); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
   Light=((253+((RGBmax-127)-(127-RGBmin)))/2f)-D+(1-BGW); // Яркость выбранного цвета

   //-------------Поменять значения «Яркость» ------------------------------------------------
   // Чтобы оставить знач. яркости в прежнем состоянии, можно закомментировать 3 нижние строки и поменять 4-ую  "Zmax2 = Zmax;"
   Yarkost = NumOfBright_New / 2f; // Яркость
   D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D2=0) или нечетная (D2=0.5) яркость
   Yarkost = Mathf.FloorToInt(Yarkost);
   Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
   //-------------------------------------------------------------------------------------------------------------

   E = Mathf.CeilToInt((RGBmid-Light)/129f); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   // Номер треугольника
   Q = ((1-E)*(Mathf.FloorToInt(Rm/2f)+Mathf.FloorToInt(Gm/2f)*3+Mathf.FloorToInt(Bm/2f)*5)+E*((1-Mathf.CeilToInt(Bm/2f))*2+(1-Mathf.CeilToInt(Rm/2f))*4+(1-Mathf.CeilToInt(Gm/2f))*6))*BGW;

   if (!CheckBox_1) // Если нужно сохранять пропорции (яркость - контрастность)
   {
    Zmax = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости 'Light'
    Z = (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
   }
   else
   {
    Zmax = (127-D*2)*BGW; // Максимальное количество рядов на яркости 'Light'
    Z = (127-Zmax)*BGW; // Контрастность (Номер ряда с цветом)
   }

   // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
   if (NumOfShade_New<0) Lc = 1; else Lc = 0;
   // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
   Xmain = NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
   Lc = Mathf.FloorToInt(Xmain/1530f); // Если Xmain>1529, то Lc=1, иначе Lc=0
   Xmain = Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall = Xmain+1;

   //--------------Поменять «Цвет» -----------------------------------------------------------------------
   // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
   //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
   // Чтобы оставить знач. Цвета в прежнем состоянии, можно поставить переменную (Xmain+1) и выполнить шаг ^ 1.^
   Xall = Xmain; // Координата выбранной ячейки с цветом, по оси X
   //Xall = NumOfShade_New; // Координата выбранной ячейки с цветом, по оси X
   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout =  Mathf.CeilToInt((765-Xall)/766f)*((1-Mathf.CeilToInt(Xall/1531f))+Mathf.FloorToInt(Xall/1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
   Q = Mathf.CeilToInt((Xall2+1)/255f);    // Номер выбранного треугольника
   E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   Y1 = (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Z'
   Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
   Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc = Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
   Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
   Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

   //-------------Поменять значение «Контрастность» ------------------------------------------------
   // Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
   Zcontrast = NumOfContrast; // Контрастность

   Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast = Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax

   if (NumOfBright_Before != NumOfBright_New) // Если яркость меняется вручную
   {
    Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
    // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
    Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
    Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
   }
   else // Если яркость меняется программно
   {
    Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax2)/128f); // Если Zcontrast меньше или равен Zmax2 , то Lc=1, иначе Lc=0
    Zcontrast = Zcontrast*Lc + (127-Zmax2)*(1-Lc); // Если выбранная контрастность, за пределами Zmax2, то Z=Zmax2

    Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
    // Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже
    Zero = 1-Mathf.CeilToInt(Zmax2/127f); // Переменная, для исключения деления на ноль
    Main_NumOfContrast3 = Mathf.FloorToInt(127 - (Mathf.RoundToInt((Zmax/(Zmax2+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc)));  // Ряд-Контрастность , при «Yarkost»
   }
   //-------------------------------------------------------------------------------------------------------------
   Zero2 = 1-Mathf.CeilToInt(Y1/254f); // Переменная, для исключения деления на ноль
   //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2f)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
   k = (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
   Y1 = ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
   Xc = Mathf.Abs((Y1*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y1)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
   Xx = (127-Y1/2f)+Xc+(Q-1)*255; // Цвет - на контрастности Zcontrast

   //------------------- Если оттенок меняется вручную ----------------------------------------------------------------
   if (NumOfShade_Before != NumOfShade_New)
   {
    // ^ 1.^ - Противоположное значение цвета -------------------------------------------------------------
    if (NumOfShade_New<0) Lc = 1; else Lc = 0;
    // 'не обязательно' Чтобы найти значение цвета через определенный промежуток - прибавить число от +-1 до +-1529
    Xmain = NumOfShade_Before + (Lc*1530)+ (NumOfShade_New-NumOfShade_Before);
    Lc = Mathf.FloorToInt(Xmain/1530f); // Если Xmain>1529, то Lc=1, иначе Lc=0
    Xmain = Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall = Xmain+1;

    Xall = Xmain; // Координата выбранной ячейки с цветом, по оси X
    // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
    Xout =  Mathf.CeilToInt((765-Xall)/766f)*((1-Mathf.CeilToInt(Xall/1531f))+Mathf.FloorToInt(Xall/1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
    Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
    Q = Mathf.CeilToInt((Xall2+1)/255f);    // Номер выбранного треугольника
    E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
    Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
    Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
    Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
    Xc = Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
    LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
    Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
    Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
    // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
    SkipRow1 = Mathf.FloorToInt((127-Zcontrast)/126f)*(D*2)*(1-Lc);  // При D=0,5 и Zcontrast=1, SkipRow1=1, иначе 0

    // Оттенок относительно контрастности Zcontrast
    Xx= Mathf.FloorToInt(((1530*(1-Mathf.CeilToInt((Q-1)/6f))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Mathf.FloorToInt(Q/6f))*
     LR)*(1-Lc-SkipRow1+Mathf.Abs(Xout))+ (Xall-1)*(Lc+SkipRow1-Mathf.Abs(Xout))); // Цвет - на контрастности Zcontrast

    Xx = (Mathf.Abs(Xx)+Xx)/2f; // Если Xx меньше 0, то Xx = 0, иначе оставить то же число
    if (Xx>1529) Xx = 0;

    Q = Mathf.CeilToInt((Xx+1)/255f);    // Номер выбранного треугольника
    E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
    Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
    Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
    Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
    Xc = Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
    LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
    Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xx-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
    Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике

    // Оттенок относительно контрастности Zcontrast
    Zero2 = 1-Mathf.CeilToInt(Y1/254f); // Переменная, для исключения деления на ноль

    //  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2f)- чтобы 'k' в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), 'k'=0
    k = (1/(Y1+Zero2))*(Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Zcontrast)
    Y2 = ((127-Z)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)
    Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)
    Xx2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast
    Main_NumOfShade3 = Mathf.FloorToInt(Xx2+1);
   }
   else // Если оттенок меняется программно
   {
    Q = Mathf.CeilToInt((Xx+1)/255f);    // Номер выбранного треугольника
    E = 1-(Q/2f-Mathf.FloorToInt(Q/2f))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
    Y1 = (((127-Zcontrast)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду 'Zcontrast'
    Xborder = 127-(Y1/2f); // Количество пустых ячеек, слева от треугольника
    Qa = (Q-1)*255;       // Координаты квадрата с выбранным треугольником
    Xc = Xx-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
    LR = Mathf.CeilToInt((Xc/254f)-0.5f) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
    Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xx-Qa)-127)/((Y1/2f)+1))/128f); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
    Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
   }
   //---------------------------------------------------------------------------------------------------------------------

   Qrgbmax = Mathf.FloorToInt((Q+((1-LR)*(-E)+LR*E)-(LR*Mathf.FloorToInt(Q/6f)*6))/2f); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin = ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Mathf.CeilToInt((Q-1)/6f))*6)))/2f)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp = Q - Mathf.FloorToInt(Q/4f)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid = (Qp+LR-(LR*Mathf.FloorToInt(Qp/3f)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm = (1-Mathf.CeilToInt(Qrgbmax/2f))*2 + Mathf.FloorToInt(Qrgbmid/2f);
   Gm = (1-Mathf.Abs(Qrgbmax-1))*2 + (1-Mathf.Abs(Qrgbmid-1));
   Bm = Mathf.FloorToInt(Qrgbmax/2f)*2 + (1-Mathf.CeilToInt(Qrgbmid/2f));

   // NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
   NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f);
   // Вычислить максимальное, минимальное и среднее значение
   RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
   RGBmin2 = Yarkost-(127-Zcontrast);
   RGBmid2 = Mathf.Abs(Mathf.Abs((Y1/2f)-Xc)+(RGBmin2*(1-E)-RGBmax2*E));
   //---------------------------- Полученный цвет RGB -----------------------------------------------
   // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
   R2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   G2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
   B2=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+
    (Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));

   //---------------------------- Указать новый оттенок, контрастность -----------------------------------------------
   // Чтобы процедура выполнялась только один раз
   Main_NumOfShade2 = Mathf.FloorToInt(Xx*BGW+1);
   Main_NumOfContrast2 = Mathf.FloorToInt(Zcontrast*BGW);
   ///////////////////////////////////////////////
   TrackBar_5_Check = Mathf.FloorToInt(Xx*BGW+1);
   TrackBar_6_Check = Mathf.FloorToInt(Zcontrast*BGW);
   TrackBar_5 = Mathf.FloorToInt(Xx*BGW+1); // Новый оттенок (Xx=0..1529, +1 для переброса между значениями)
   TrackBar_6 = Mathf.FloorToInt(Zcontrast*BGW); // Новая контрастность

   if (!CheckBox_1) // Если нужно сохранять пропорции (яркость - контрастность)
   {
    DrawBrightTriangle(Mathf.FloorToInt((Light+D)*2),Mathf.FloorToInt((Yarkost+D)*2),
     Mathf.FloorToInt(Main_NumOfShade3*BGW),Mathf.FloorToInt(Z),Mathf.FloorToInt(Main_NumOfContrast3*BGW)); // Нарисовать треугольник яркости
   }
   else DrawBrightTriangle(Mathf.FloorToInt(254+D*2),Mathf.FloorToInt((Yarkost+D)*2),
    Mathf.FloorToInt(Main_NumOfShade3*BGW),Mathf.FloorToInt(Z),Mathf.FloorToInt(Main_NumOfContrast3*BGW)); // Нарисовать треугольник яркости

   return true;
  }



  public bool DrawBrightTriangle(int NumOfBright_1, int NumOfBright_2, int NumOfShade, 
   int NumOfContrast_1, int NumOfContrast_2) // Нарисовать треугольник яркости
  {
   // Очистить изображения 
   VirtualBrightTexture.SetPixels (ClearPixels1);
   VirtualDrawContrast.SetPixels (ClearPixels1);

   // Переменные:
   //NumOfBright,NumOfShade,NumOfContrast,
   int i,j,X,Y,R,G,B;
   float RGBmin2,RGBmax2,RGBmid2,Rm,Gm,Bm,
   D,Xout,Xall2,Xx,k,Y1,Y2,Xc,Xc2,SkipRow1,Qrgbmax,Qrgbmin,Qrgbmid,Qp,
   E,Yarkost,Zcontrast,Xall,Xborder,LR,Zmax,Zmax2,Zero,Zero2,Q,Qa,BGW,Zazor,Lc,NoRow254;
   int Xdraw, Ydraw;
   float X2, Z;

   //NumOfBright = ...; // яркость (от 0 до 508)
   //NumOfShade = ...; // оттенок (от 0 до 1529) либо (от 0 до 1531 - поменять формулу «Xall = NumOfShade;»)
   //NumOfContrast = ...; // контрастность (от 0 до 127)

   // Поменять цветные треугольники
   Color_Image_1.normal.background = VirtualTexture[NumOfBright_2];

   if (NumOfBright_2 > 199)
    brushColor2 = new Color (0, 0, 0); // цвет кисти для линий 
   else // Поменять цвет кисти
    brushColor2 = new Color (0.9f,0.9f,0.9f,1);

   Yarkost = NumOfBright_1 /2f; // Яркость (От 0 до 254)
   Zcontrast = NumOfContrast_1; // Контрастность

   BGW = 1; //1f- Все цвета, кроме Ч/Б.  0 - Только Ч/Б цвета
   D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D=0) или нечетная (D=0.5f) яркость
   Yarkost = Mathf.FloorToInt(Yarkost);
   Zmax = Mathf.FloorToInt(Mathf.Abs(127 - Mathf.Abs((127 - Yarkost) - D))) * BGW; // Максимальное количество рядов, на заданной яркости 'Yarkost'
   Lc = 1 - Mathf.CeilToInt(((127 - Zcontrast) - Zmax) /128f);  // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast = (Zcontrast) * Lc + (127 - Zmax) * (1 - Lc); // Если выбранная контраст., за пределами Zmax, то Zcontrast=Zmax
   //------------------Поменять «Цвет» --------------------------------------
   // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
   // а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529
   Xall = NumOfShade; // Координата выбранной ячейки с цветом, по оси X
   // Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout = Mathf.CeilToInt((765 - Xall) /766f) * ((1 - Mathf.CeilToInt(Xall /1531f)) + Mathf.FloorToInt(Xall /1531f)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 = Xall + Xout - 1; // Выравниваем значение координаты Xall
   Q = Mathf.CeilToInt((Xall2 + 1) /255f);    // Номер выбранного треугольника
   E = 1 - (Q /2f - Mathf.FloorToInt(Q /2f)) * 2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
   Y1 = (((127 - Zcontrast) * 2) + (D * 4) * E) * BGW; // Количество ячеек в ряду 'Zcontrast'
   Xborder = 127 - (Y1 /2f); // Количество пустых ячеек, слева от треугольника
   Qa = (Q - 1) * 255;       // Координаты квадрата с выбранным треугольником
   Xc = Xall2 - Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR = Mathf.CeilToInt((Xc /254f) - 0.5f); // Если ячейка находится левее центра, то LR=0 , иначе LR=1
   Zero = 1 - Mathf.CeilToInt(Zmax /127f); // Переменная, для исключения деления на ноль
   // КОРРЕКТИРОВКА
   // Если координата в пределах треугольника, то Lc=1, если за пределами, то Lc=0
   Lc = 1-Mathf.CeilToInt(Mathf.FloorToInt(Mathf.Abs((Xall2-Qa)-127)/((Y1/2f)+1))/128f);
   Xc = (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc); // Порядковый номер выбранной ячейки в треугольнике
   // т.к. в 1 ряду, при D=0,5f, только 1 пустая ячейка, то стандартный переброс
   // между ячейками невозможен, поэтому следует сделать сплошной переход (включая в рассчеты пустую ячейку)
   SkipRow1 = Mathf.FloorToInt((127-Zcontrast)/126f)*(D*2)*(1-Lc); // При D=0,5f и Z=1, SkipRow1=1, иначе 0
   // Координата по оси X, на общей сетке координат
   Xx = Mathf.FloorToInt(((1530*(1-Mathf.CeilToInt((Q-1)/6f))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+
    (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Mathf.FloorToInt(Q/6f))*LR)*
    (1-Lc-SkipRow1+Mathf.Abs(Xout))+ (Xall-1)*(Lc+SkipRow1-Mathf.Abs(Xout)));
   //        = 0- R, 1- G, 2- B,  К какому из цветов отнести максимальное значение RGBmax
   Qrgbmax = Mathf.FloorToInt((Q+((1-LR)*(-E)+LR*E)-(LR*Mathf.FloorToInt(Q/6f)*6))/2f);
   //        = 0- B, 1- R, 2- G,  К какому из цветов отнести минимальное значение RGBmin
   Qrgbmin = ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Mathf.CeilToInt((Q-1)/6f))*6)))/2f)-1;
   Qp = Q - Mathf.FloorToInt(Q/4f)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   //        = 0- B, 1- G, 2- R ,  К какому из цветов отнести среднее значение RGBmid
   Qrgbmid = (Qp+LR-(LR*Mathf.FloorToInt(Qp/3f)*3))-1;
   // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
   Rm = (1-Mathf.CeilToInt(Qrgbmax/2f))*2 + Mathf.FloorToInt(Qrgbmid/2f);
   Gm = (1-Mathf.Abs(Qrgbmax-1))*2 + (1-Mathf.Abs(Qrgbmid-1));
   Bm = Mathf.FloorToInt(Qrgbmax/2f)*2 + (1-Mathf.CeilToInt(Qrgbmid/2f));

   Zazor = 1;  // Зазор между треугольниками
   for (j = 0; j <=(254-Mathf.FloorToInt(D*2)); j++) // Яркость от 0 до 254
   {
    // Яркость
    Yarkost = j;
    Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)));

    for (i = 0; i <=Mathf.FloorToInt(Zmax2); i++) // Контрастность
    {
     // Контрастность
     Zcontrast = 127-i;

     Zero2 = 1-Mathf.CeilToInt(Y1/254f);
     k = (1/(Y1+Zero2))*Xc;
     Y2 = ((127-Zcontrast)*2)+(D*4)*E;
     Xc2 = Mathf.Abs((Y2*LR)-Mathf.RoundToInt(Mathf.Abs(k-LR)*Y2));

     // нужно т.к. на 254 яркости, при D=0.5f, нет ячеек с цветом
     NoRow254 = 1-Mathf.FloorToInt(Yarkost/254f); //0f если TheYarkost=254, иначе 1

     RGBmin2 = Yarkost-(127-Zcontrast);
     RGBmax2 = Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;
     RGBmid2 = Mathf.Abs(Mathf.Abs((Y2/2f)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

     // Сопоставить полученные результаты  (RGBmid, RGBmin, RGBmax) с (R, G, B)
     R=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Rm/2f)*(RGBmax2+RGBmid2))+(Mathf.FloorToInt(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
     G=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Gm/2f)*(RGBmax2+RGBmid2))+(Mathf.FloorToInt(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
     B=Mathf.FloorToInt(Mathf.Abs((Mathf.FloorToInt(Bm/2f)*(RGBmax2+RGBmid2))+(Mathf.FloorToInt(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));

     // Нарисовать точку с цветом по координатам: X = (j+128)+Mathf.FloorToInt(D*4+Zazor) , Y = Mathf.FloorToInt(127-i);
     brushColor = new Color (R / 255f, G / 255f, B / 255f); // цвет кисти  
     VirtualBrightTexture.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - Mathf.FloorToInt(127-i), brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
    }

    ///////////////////////////////////////////////////////////////////////////////
    if (CheckBox_2) // Если нужно рисовать линию контрастности на треугольнике с яркостью
    {
     // Линия контрастности на треугольнике с яркостью
     Zcontrast = NumOfContrast_2; // Контрастность

     Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
     Zcontrast = (127-Zcontrast)*Lc + Zmax*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
     Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
     Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
     Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»

     // Нарисовать точку по координатам: X = (j+128)+Mathf.FloorToInt(D*4+Zazor) , Y = Mathf.FloorToInt(Zcontrast);         
     VirtualDrawContrast.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - Mathf.FloorToInt(Zcontrast), brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
    }
    ///////////////////////////////////////////////////////////////////////////////

    if (CheckBox_4) // Если нужно рисовать, ч/б линию яркости , под треугольником яркости
    {
     // Рисуем ч/б линию яркости, по координатам: X = (j+128)+Mathf.FloorToInt(D*4+Zazor) , Y = 129;
     brushColor = new Color (j / 255f, j / 255f, j / 255f); // цвет кисти  
     VirtualBrightTexture.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - 129, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
    }
    else // Иначе закрасить линию белым
    {
     brushColor = new Color (1, 1, 1, 0); // цвет кисти  
     VirtualBrightTexture.SetPixel ((j+128)+Mathf.FloorToInt(D*4+Zazor), 258 - 129, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
    }

   }
   ////////////////////////////////////////////////////////////////////////
   // Точка на треугольнике с Яркостью
   Yarkost = NumOfBright_2 /2f; // Яркость (От 0 до 254)
   D = Yarkost-Mathf.FloorToInt(Yarkost); // Четная (D2=0) или нечетная (D2=0.5f) яркость
   Yarkost = Mathf.FloorToInt(Yarkost);
   Zcontrast = NumOfContrast_2; // Контрастность

   Zmax2 = Mathf.FloorToInt(Mathf.Abs(127-Mathf.Abs((127-Yarkost)-D)))*BGW;

   Lc = 1-Mathf.CeilToInt(((127-Zcontrast)-Zmax)/128f); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zcontrast = Zcontrast*Lc + (127-Zmax)*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
   Lc = 1-Mathf.CeilToInt((Zmax2-Zmax)/128f); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0
   Zero = 1-Mathf.CeilToInt(Zmax/127f); // Переменная, для исключения деления на ноль
   // Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
   Zcontrast = 127 - (Mathf.RoundToInt((Zmax2/(Zmax+Zero))*(127-Zcontrast))*Lc + (127-Zcontrast)*(1-Lc));  // Ряд-Контрастность , при «Yarkost»

   X = Mathf.FloorToInt((Yarkost+128)+Mathf.FloorToInt(D*4+Zazor));
   Y = Mathf.FloorToInt(Zcontrast);

   if (CheckBox_3) // Если нужно рисовать точку на треугольнике яркости
   {
    for (i = 0; i <=2; i++)
    {
     for (j = 0; j <=2; j++)
      if (((Y-1)+i>=0) & ((Y-1)+i<=258))
      if (((X-1)+j>=0) & ((X-1)+j<=1529))
      if (((X-1)+j!=X) | ((Y-1)+i!=Y))
      {
       // Нарисовать точку по координатам: X = (X-1)+j , Y = (Y-1)+i;
       VirtualDrawContrast.SetPixel ((X-1)+j, 258 - ((Y-1)+i), brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
      }
    }
    // Создать прозрачный пиксель, по центру созданного квадрата
    brushColor = new Color (1, 1, 1, 0); // цвет кисти  
    VirtualDrawContrast.SetPixel (X, 258 - Y, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
   }
   ////////////////////////////////////////////////////////////////////////
   // Линия контрастности на цветных треугольниках
   Zmax2 = Zmax;
   Zazor = 1;

   if (CheckBox_5) // Если нужно рисовать линию контрастности на цветных треугольниках
   {
    Zero2 = 1 - Mathf.CeilToInt (Y1 / 254f);
    k = (1 / (Y1 + Zero2)) * Xc;

    for (i = 0; i <=Mathf.FloorToInt(Zmax); i++)
    {
     Z = 127 - i;

     Lc = 1 - Mathf.CeilToInt(((127 - Z) - Zmax) /128f); // Если Z<=Zmax , то Lc=1, Если Z>Zmax, то Lc=0
     Z = (127 - Z) * Lc + Zmax * (1 - Lc); // Если выбранная контрастность, за пределами Zmax, то Z=Zmax
     Lc = 1 - Mathf.CeilToInt((Zmax2 - Zmax) /128f); // Если Zmax2<=Zmax , то Lc=1, Если Zmax2>Zmax, то Lc=0
     Z = 127 - (Mathf.RoundToInt((Zmax2 / (Zmax + Zero)) * Z) * Lc + Z * (1 - Lc));

     Y2 = ((127 - Z) * 2) + (D * 4) * E;
     Xc2 = Mathf.Abs((Y2 * LR) - Mathf.RoundToInt(Mathf.Abs(k - LR) * Y2));
     //X2 = Qq + Z - (D * 2) * E + Xc2; // Положение относительно реальной сетки координат
     X2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

     if (Q == 1)
     {
      Xdraw = Mathf.CeilToInt (Z);    // Координата для отрисовки на картинку, по оси X
      Ydraw = Mathf.CeilToInt ((254 - X2 + 1) + Zazor); // Координата для отрисовки на картинку, по оси Y
     }
     else if (Q == 2)
     {
      Xdraw = Mathf.CeilToInt (X2 - 255 + D * 2); // Координата для отрисовки на картинку, по оси X
      Ydraw = Mathf.CeilToInt (Z);    // Координата для отрисовки на картинку, по оси Y
     }
     else if (Q == 3)
     {
      Xdraw = Mathf.CeilToInt (X2 - 255 + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
      Ydraw = Mathf.CeilToInt (Z);    // Координата для отрисовки на картинку, по оси Y
     }
     else if (Q == 4)
     {
      Xdraw = Mathf.CeilToInt (127 - Z + 382 + D * 2 + 1 + Zazor * 2 + D * 2);    // Координата для отрисовки на картинку, по оси X
      Ydraw = Mathf.CeilToInt ((X2 - ((Q - 1) * 255 - 1)) + Zazor); // Координата для отрисовки на картинку, по оси Y
     }
     else if (Q == 5)
     {
      Xdraw = Mathf.CeilToInt (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
      Ydraw = Mathf.CeilToInt ((127 - Z + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
     }
     else
     {
      Xdraw = Mathf.CeilToInt (254 - (X2 - 1275) + (D * 2)); // Координата для отрисовки на картинку, по оси X
      Ydraw = Mathf.CeilToInt ((127 - Z + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
     }

     // Линия контрастности
     VirtualDrawContrast.SetPixel (Xdraw, 258 - Ydraw, brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
    }
   }
   //+++++++++++++++++++++++++++++++++++++++++++

   if (CheckBox_6) // Если нужно рисовать точку на цветных треугольниках
   {
    // Нарисовать точку контрастности на цветных треугольниках +++++++++++++++++++++++++
    Zero2 = 1 - Mathf.CeilToInt(Y1 /254f);
    k = (1 / (Y1 + Zero2)) * Xc;
    Y2 = ((127 - Zcontrast) * 2) + (D * 4) * E;
    Xc2 = Mathf.Abs((Y2 * LR) - Mathf.RoundToInt(Mathf.Abs(k - LR) * Y2));
    X2 = (127-Y2/2f)+Xc2+(Q-1)*255; // Координата по оси X, на общей сетке координат (При измененной яркости-контр.)

    Zazor = 1;

    if (Q == 1)
    {
     Xdraw = Mathf.FloorToInt (Zcontrast);    // Координата для отрисовки на картинку, по оси X
     Ydraw = Mathf.FloorToInt ((254 - X2 + 1) + Zazor); // Координата для отрисовки на картинку, по оси Y
    }
    else if (Q == 2)
    {
     Xdraw = Mathf.CeilToInt (X2 - 255 + D * 2); // Координата для отрисовки на картинку, по оси X
     Ydraw = Mathf.CeilToInt (Zcontrast);    // Координата для отрисовки на картинку, по оси Y
    }
    else if (Q == 3)
    {
     Xdraw = Mathf.FloorToInt (X2 - 255 + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
     Ydraw = Mathf.FloorToInt (Zcontrast);    // Координата для отрисовки на картинку, по оси Y
    }
    else if (Q == 4)
    {
     Xdraw = Mathf.FloorToInt (127 - Zcontrast + 382 + D * 2 + 1 + Zazor * 2 + D * 2);    // Координата для отрисовки на картинку, по оси X
     Ydraw = Mathf.FloorToInt ((X2 - ((Q - 1) * 255 - 1)) + Zazor); // Координата для отрисовки на картинку, по оси Y
    }
    else if (Q == 5)
    {
     Xdraw = Mathf.FloorToInt (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2); // Координата для отрисовки на картинку, по оси X
     Ydraw = Mathf.FloorToInt ((127 - Zcontrast + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
    }
    else
    {
     Xdraw = Mathf.FloorToInt (254 - (X2 - 1275) + (D * 2)); // Координата для отрисовки на картинку, по оси X
     Ydraw = Mathf.FloorToInt ((127 - Zcontrast + 129) + Zazor * 2);    // Координата для отрисовки на картинку, по оси Y
    }

    for (i = 0; i <=2; i++)
    {
     for (j = 0; j <=2; j++)
     {
      if (((Ydraw - 1) + i >= 0) & ((Ydraw - 1) + i <= 258))
      if (((Xdraw - 1) + j >= 0) & ((Xdraw - 1) + j <= 1529))
      if (((Xdraw - 1) + j != Xdraw) | ((Ydraw - 1) + i != Ydraw))
      {
       // Нарисовать точку по координатам: Xdraw , Ydraw;
       VirtualDrawContrast.SetPixel ((Xdraw - 1) + j, 258 - ((Ydraw - 1) + i), brushColor2); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
      }
      else
      { // Создать прозрачный пиксель, по центру созданного квадрата
       brushColor = new Color (1, 1, 1, 0); // цвет кисти  
       VirtualDrawContrast.SetPixel ((Xdraw - 1) + j, 258 - ((Ydraw - 1) + i), brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
      }
     }
    }
   }

   if (CheckBox_7) // Если нужно заполнять квадрат с цветом
   {
    // Заполняем КВАДРАТ с выбранным цветом
    for (j = 215+Mathf.FloorToInt(D*2); j <=296+Mathf.FloorToInt(D*2); j++)
    { // Яркость от 0 до 254
     for (i = 131; i <=212; i++)
     { // Контрастность
      if ((j > 215+Mathf.FloorToInt(D*2)) & (j < 255+Mathf.FloorToInt(D*2)) & (i > 131) & (i < 212))
      { // Цвет
       // Нарисовать точку с цветом по координатам: X = j , Y = i;
       brushColor = new Color (Main_R / 255f, Main_G / 255f, Main_B / 255f); // цвет кисти  
       VirtualBrightTexture.SetPixel (j, 258 - i, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
      }
      else
       if ((j > 255+Mathf.FloorToInt(D*2)) & (j < 296+Mathf.FloorToInt(D*2)) & (i > 131) & (i < 212))
       { // Цвет
        // Нарисовать точку с цветом по координатам: X = j , Y = i;
        brushColor = new Color (Main_R2 / 255f, Main_G2 / 255f, Main_B2 / 255f); // цвет кисти  
        VirtualBrightTexture.SetPixel (j, 258 - i, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
       }
       else // Черная рамка
       {
        // Нарисовать точку с цветом по координатам: X = j , Y = i;
        brushColor = new Color (0, 0, 0); // цвет кисти  
        VirtualBrightTexture.SetPixel (j, 258 - i, brushColor); // '258', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'    
       }
     }
    }
   }

   // Для цветных треугольников 
   VirtualBrightTexture.Apply ();
   // Для линий и точек
   VirtualDrawContrast.Apply ();

   Color_Image_2.normal.background = VirtualBrightTexture; // Показать треугольник яркости
   Color_Image_3.normal.background = VirtualDrawContrast; // Показать линии

   return true;
  }

  public bool CreateBrightTriangles() // Создать цветные треугольники
  {
   int w2 = 514; // Ширина текстуры
   int h2 = 259; // Высота текстуры

   for (int D0 = 0; D0 < 2; D0++) {
    for (int StepLight = 0; StepLight < 255; StepLight++)
     if (D0 + StepLight < 255) { 
          Color[] pixels = new Color[w2*h2]; // Создать пустой массив для изображения

      for (Q = 1; Q < 7; Q++) {  // № Треугольника (от 1 до 6)
       // Построить цветной треугольник ------------------------------------------------------------------  
       Light1 = (StepLight * 2 + D0) / 2f; // Яркость
       D = Light1 - Mathf.FloorToInt (Light1); // Если число дробное, то D=0.5, иначе D=0
       Light = Light1 - D;
       D2 = Mathf.FloorToInt (Light / 254f);  // Исключается 254 и 255 яркость (D=0)
       A = Mathf.FloorToInt (Light / 127f) - D2;  // Если яркость «Light» >=128, то A=1 , иначе A=0
       Zmax = (127 - Mathf.Abs (Light - 127) - ((D * 2) * A)) * (1 - D2);  // Максимальное кол-во рядов на заданной яркости «Light»
       cW = (127 - (127 - Zmax)) * 2 + (D * 2) + 1;  // Количество ячеек в самом верхнем ряду «Zmax»
       Qq = 255 * (Q - 1);  // Отступ, от координат первого треугольника
       E = (Q / 2f);  // Целое или дробное число, для подсчета ниже
       E = (E - Mathf.FloorToInt (E)) * 4 - 1;  // Если выбран цвет типа 255 255 0, то E=-1 , если 255 0 0 , то E=1
       E2 = Mathf.Abs (E - 1) / 2;  // Если выбран цвет типа 255 255 0, то E2=1 , если 255 0 0 , то E2=0

       // Начать цикл
       for (i = 127; i > Mathf.FloorToInt (127 - Zmax) - 1; i--) { // Снизу вверх, (от 127 до 0), где вместо 0 ставится макс. кол-во рядов Zmax
        cW = (127 - i) * 2; // Кол-во ячеек в ряду - i ((-1), т.к. 0 считается за единицу)
        for (j = Mathf.FloorToInt (i - (D * 2) * E2); j < Mathf.FloorToInt ((i + cW) + (D * 2) * E2) + 1; j++) { // Цикл от i ячейки , до макс. количества ячеек в ряду (-1)
         // Найти максимальное, минимальное и среднее значение (R,G,B)
         RGBmax = Light + 1 + (D * 2) + (127 - i);
         RGBmid = Mathf.Abs (Light - (127 - i) * E + Mathf.Abs (127 - j) * E) + E2 * (1 + D * 2) + (Mathf.CeilToInt (Mathf.Abs (127 - j) / 130f)) * (1 - Mathf.CeilToInt (Light / 256f)) * E * (D * 4);
         RGBmin = Light - (127 - i);
         L2 = Mathf.CeilToInt ((j / 254f) - 0.5f); // Если ячейка находится левее центра, то L2=0 , иначе L2=1
         Qt = 1 - (Q / 2f - Mathf.FloorToInt (Q / 2f)) * 2; // Если треугольник = четному числу, то E = 1 иначе E = 0
         Qrgbmax = Mathf.FloorToInt ((Q + ((1 - L2) * (-Qt) + L2 * Qt) - (L2 * Mathf.FloorToInt (Q / 6f) * 6)) / 2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
         Qrgbmin = ((Q + ((1 - L2) * (-(1 - Qt)) + L2 * (1 - Qt)) + ((1 - L2) * ((1 - Mathf.CeilToInt ((Q - 1) / 6f)) * 6))) / 2) - 1; // = 0- B, 1- R, 2- G .                            - RGBmin
         Qp = Q - Mathf.FloorToInt (Q / 4f) * 3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
         Qrgbmid = (Qp + L2 - (L2 * Mathf.FloorToInt (Qp / 3f) * 3)) - 1; //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
         // Приравниваем RGB(min,max,mid) к соответствующим R, G, B
         R = (1 - Mathf.CeilToInt (Qrgbmax / 2f)) * RGBmax + (1 - Mathf.Abs (Qrgbmin - 1)) * RGBmin + Mathf.FloorToInt (Qrgbmid / 2f) * RGBmid;
         G = (1 - Mathf.Abs (Qrgbmax - 1)) * RGBmax + Mathf.FloorToInt (Qrgbmin / 2f) * RGBmin + (1 - Mathf.Abs (Qrgbmid - 1)) * RGBmid;
         B = Mathf.FloorToInt (Qrgbmax / 2f) * RGBmax + (1 - Mathf.CeilToInt (Qrgbmin / 2f)) * RGBmin + (1 - Mathf.CeilToInt (Qrgbmid / 2f)) * RGBmid;
         X2 = j + Qq; // Основная координата ячейки по оси X

         Zazor = 1;  // Если нужен зазор между треугольниками
         if (Q == 1) { // Для 1 треугольника// Координаты цвета на картинке, по оси X, Y
          Xdraw = Mathf.FloorToInt (i);
          Ydraw = Mathf.FloorToInt (254 - X2 + 1) + Zazor;
         } else if (Q == 2) {  // Для 2 треугольника// Координаты цвета на картинке, по оси X, Y
          Xdraw = Mathf.FloorToInt (X2 - 255 + D * 2);
          Ydraw = Mathf.FloorToInt (i);
         } else if (Q == 3) { // Для 3 треугольника// Координаты цвета на картинке, по оси X, Y
          Xdraw = Mathf.FloorToInt (X2 - 255 + 1 + Zazor * 2 + D * 2);
          Ydraw = Mathf.FloorToInt (i);
         } else if (Q == 4) { // Для 4 треугольника// Координаты цвета на картинке, по оси X, Y
          Xdraw = Mathf.FloorToInt (127 - i + 382 + D * 2 + 1 + Zazor * 2 + D * 2);
          Ydraw = Mathf.FloorToInt (X2 - ((Q - 1) * 255 - 1)) + Zazor;
         } else if (Q == 5) { // Для 5 треугольника// Координаты цвета на картинке, по оси X, Y
          Xdraw = Mathf.FloorToInt (509 - (X2 - 1020) + 1 + Zazor * 2 + D * 2);
          Ydraw = Mathf.FloorToInt (127 - i + 129) + Zazor * 2;
         } else {     // Для 6 треугольника// Координаты цвета на картинке, по оси X, Y
          Xdraw = Mathf.FloorToInt (254 - (X2 - 1275) + (D * 2));
          Ydraw = Mathf.FloorToInt (127 - i + 129) + Zazor * 2;
         }

            // Отрисовать цвет (RGB), по координатам - X=Xdraw; Y=Ydraw
             pixels[(h2-1-Ydraw)*w2+Xdraw] = new Color (R / 255f, G / 255f, B / 255f); // '(h2-1) = (высота текстуры-1)', в 'Unity3d' нужно чтобы перевернуть координаты по оси 'y'
        }
       }
      }

      // Сохранить текстуру в памяти
      int StepLight2 = Mathf.FloorToInt ((StepLight + (D0 / 2f)) * 2); // Яркость от 0 до 508 (Поделить на 2, чтобы определить значение яркости в пределах от 0 до 254)
      VirtualTexture [StepLight2] = new Texture2D (w2, h2);
      VirtualTexture [StepLight2].filterMode = FilterMode.Point; // Для четкой отрисовки
            VirtualTexture [StepLight2].SetPixels(pixels);
      VirtualTexture [StepLight2].Apply ();

      // Сохранить текстуру в папку
      //byte[] bytes = texture.EncodeToPNG();
      //string finalPath = StepLight2.ToString()+".png";
      //File.WriteAllBytes(finalPath, bytes);
     }  
   }
   return true;
  }

 }

Программы

К сообщению приложен файл. Размер - 127Kb
20 дек 19, 10:49    [22045004]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Соколинский Борис,

Бесконечность не предел))).....
20 дек 19, 10:59    [22045012]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
alekcvp
Member

Откуда:
Сообщений: 2235
Ученик_333,

Такие красивые картинки и сложные формулы, а пару секунд чтобы Form3 на что-то удобоваримое поменять, нету? :)
20 дек 19, 11:31    [22045047]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
alekcvp,

Это не принципиально).
20 дек 19, 12:55    [22045157]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
Переработал формулы, они по сути такие же громоздкие, но менять оттенок теперь проще, за счет добавленных промежутков между треугольниками.
Контрастность была задом наперед, сейчас 0 - черно белые оттенки, а 127,5 - максимальная контрастность.
+ Перевести RGB в яркость, оттенок, контрастность.
uses  Math;

function RGB_to_BSC (R,G,B:extended; out NumOfBright,NumOfShade,NumOfContrast:extended):boolean; 
// Перевести RGB в яркость, оттенок, контрастность
var
RGBmax,RGBmin,Rm,Gm,Bm,Qrm,Qgm,Qbm,Q: extended;
begin
 RGBmax := (((((R + G) / 2) + (Abs(R - G) / 2)) + B) / 2) + (Abs((((R + G) / 2) + (Abs(R - G) / 2)) - B) / 2);
 RGBmin := (((((R + G) / 2) - (Abs(R - G) / 2)) + B) / 2) - (Abs((((R + G) / 2) - (Abs(R - G) / 2)) - B) / 2);

 NumOfBright := (RGBmax + RGBmin) / 2; // Яркость от 0 до 255
 NumOfContrast := (RGBmax - RGBmin) / 2; // Контрастность от 0 до 127.5

 Rm := Floor((R-NumOfBright)/256); // -1= если R<Bright, 0= если R>=Bright
 Gm := Floor((G-NumOfBright)/256); // -1= если G<Bright, 0= если G>=Bright
 Bm := Floor((B-NumOfBright)/256); // -1= если B<Bright, 0= если B>=Bright
 Qrm := (Rm+1)*-Bm; // 1= если 1 или 2 треугольник, иначе 0
 Qgm := (Gm+1)*-Rm; // 1= если 3 или 4 треугольник, иначе 0
 Qbm := (Bm+1)*-Gm; // 1= если 5 или 6 треугольник, иначе 0

 Q := Qrm*(Gm+2)+Qgm*(3+(Bm+1))+Qbm*(5+(Rm+1)); // Номер треугольника "1..6"
 NumOfShade := (Q*257-129+Qrm*(G-(B*-Gm)-(R*(1+Gm)))+Qgm*(B-(R*-Bm)-(G*(1+Bm)))+Qbm*(R-(G*-Rm)-(B*(1+Rm))))*(Qrm+Qgm+Qbm); // Оттенок от 0 до 1540
end;


procedure TForm1.Button1Click(Sender: TObject); // По нажатию кнопки
var
R,G,B, Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast : extended;
begin
 R := 255; G := 0; B := 0; // от 0 до 255

 // Перевести RGB в яркость, оттенок, контрастность
 RGB_to_BSC(R,G,B,  Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast);

 Main_NumOfBright := Main_NumOfBright*2; // Поменять диапазон яркости от 0 до 510
 Main_NumOfContrast := Floor(Main_NumOfContrast+0.5); // Поменять диапазон контрастности от 0 до 128

 Form1.Caption := 'R: '+floattostr(R)+'  G: '+floattostr(G)+'  B: '+floattostr(B)
  +'  -  Яркость: '+floattostr(Main_NumOfBright)+'  Оттенок: '+floattostr(Main_NumOfShade)
  +'  Контрастность: '+floattostr(Main_NumOfContrast);
end;
+ Перевести яркость, оттенок, контрастность в RGB.
uses  Math;

function BSC_to_RGB (NumOfBright,NumOfShade,NumOfContrast:extended;  out R,G,B:extended):boolean; // Перевести яркость, оттенок, контрастность в RGB
var
Q,CellsCount,SideLR,E,Qmax,Qp,Qmid,Qmin,RGBmax,RGBmin,RGBmid: extended;
begin
 Q := Floor(NumOfShade/257)+1; // Номер треугольника "1..6"
 CellsCount := NumOfShade-(Q*257-129); // Количество ячеек от середины треугольника к краям, + вправо, - влево
 SideLR := -Floor(CellsCount/130); // 1= если "CellsCount < 0",  0= если "CellsCount >= 0"
 E := 1-(Q/2-Floor(Q/2))*2; // Если четный треугольник то E=1, иначе E=0

 Qmax := Ceil(Q/2)-1+E*(1-SideLR)-3*Floor(Q/6)*(1-SideLR); // (0-R, 1-G, 2-B) = RGBmax
 Qp := Q-Floor(Q/4)*3; // Приравнивание 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 Qmid := 2-(Qp-SideLR-Floor(Qp/3)*(1-SideLR)*3); // (0-R, 1-G, 2-B) = RGBmid
 Qmin := 3-(Qmax+Qmid); // (0-R, 1-G, 2-B) = RGBmin
 RGBmax := NumOfBright+NumOfContrast; // Максимальное значение из R,G,B
 RGBmin := NumOfBright-abs(NumOfContrast); // Минимальное значение из R,G,B
 RGBmid := abs(RGBmin+(abs(CellsCount)-(NumOfBright*2)*E)*Ceil(NumOfContrast/129)); // Среднее значение из R,G,B
 R := Round((abs(Qmax-2+0.5)-0.5)*RGBmax+(abs(Qmid-2+0.5)-0.5)*RGBmid+(abs(Qmin-2+0.5)-0.5)*RGBmin); // Если Qmax или Qmid или Qmin=0, то R = RGBmax или RGBmid или RGBmin соответственно
 G := Round((1-abs(Qmax-1))*RGBmax+(1-abs(Qmid-1))*RGBmid+(1-abs(Qmin-1))*RGBmin); // Если Qmax или Qmid или Qmin=1, то G = RGBmax или RGBmid или RGBmin соответственно
 B := Round((abs(Qmax-0.5)-0.5)*RGBmax+(abs(Qmid-0.5)-0.5)*RGBmid+(abs(Qmin-0.5)-0.5)*RGBmin); // Если Qmax или Qmid или Qmin=2, то B = RGBmax или RGBmid или RGBmin соответственно
end;

procedure TForm1.Button2Click(Sender: TObject); // По нажатию кнопки
var
R,G,B, Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast : extended;
begin
 Main_NumOfBright := 127.5; // Яркость, от 0 до 255
 Main_NumOfShade := 128; // Оттенок, от 1 до 1540
 Main_NumOfContrast := 127.5; // Контрастность, от 0 до 127.5 (0=черно-белые оттенки)

 BSC_to_RGB(Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast,   R,G,B); // Перевести яркость, оттенок, контрастность в RGB

 Main_NumOfBright := Main_NumOfBright*2; // Поменять диапазон яркости от 0 до 510
 Main_NumOfContrast := Floor(Main_NumOfContrast+0.5); // Поменять диапазон контрастности от 0 до 128

 Form1.Caption := 'Яркость: '+floattostr(Main_NumOfBright)+'  Оттенок: '+floattostr(Main_NumOfShade)
  +'  Контрастность: '+floattostr(Main_NumOfContrast)
  +'  -  R: '+floattostr(R)+'  G: '+floattostr(G)+'  B: '+floattostr(B);
end;
+ Перевести яркость, оттенок, контрастность в RGB (Цвет указывается вручную).
uses  Math;

function BSC_to_RGB_2 (NumOfBright,NumOfShade,NumOfContrast:extended; Move1:boolean;
    out ChangedBright,ChangedShade,ChangedContrast:extended; out R,G,B:extended):boolean; // Перевести яркость, оттенок, контрастность в RGB (Цвет указывается вручную)
var
Q,CellsCount,SideLR,E,Qmax,Qp,Qmid,Qmin,RGBmax,RGBmin,RGBmid: extended;
// Корректировка //////////////////////////////////////////////////////////////
Lp0,Lp1,MaxContrast,D,HalfSideCount,OutOfTriangle: extended;
begin
 // 0.Корректировка ///////////////////////////////////////////////////////////
 // 1.Проверка яркости --------------------------------------------------------
 NumOfBright := NumOfBright/2; // Перевести яркость "0...510" в формат с дробью "0.0 ... 255.0"
 //-----
 // Если "NumOfBright<0" или "NumOfBright>255", то поменять "NumOfBright" соответственно на 0 или 255
 Lp0 := 1-abs(Floor(NumOfBright/(abs(NumOfBright)+1))); // 1= если "NumOfBright>=0", иначе 0
 Lp1 := abs(Floor((255-abs(NumOfBright))/(abs(NumOfBright)+256)))*Lp0; // 1= если "abs(NumOfBright)>255", иначе 0
 NumOfBright := Lp0*(NumOfBright*(1-Lp1)+255*Lp1); // "NumOfBright" в пределах "0..255"

 // 2.Проверка контрастности --------------------------------------------------
 // Если "NumOfContrast<0" или "NumOfContrast>128", то поменять "NumOfContrast" соответственно на 0 или 128
 Lp0 := 1-abs(Floor(NumOfContrast/(abs(NumOfContrast)+1))); // 1= если "NumOfContrast>=0", иначе 0
 Lp1 := abs(Floor((128-abs(NumOfContrast))/(abs(NumOfContrast)+129)))*Lp0; // 1= если "abs(NumOfContrast)>128", иначе 0
 NumOfContrast := Lp0*(NumOfContrast*(1-Lp1)+128*Lp1); // "NumOfContrast" в пределах "0 ... 128"
 //----- (Проверить, выходит ли контрастность за пределы максимальной контрастности "MaxContrast" на заданной яркости "NumOfBright")
 NumOfContrast := Floor(NumOfContrast)-(NumOfBright-Floor(NumOfBright)); // Если яркость с дробью то добавить 0.5 к контрастности.
 MaxContrast := 127.5-abs(NumOfBright-127.5); // Определить максимальную контрастность на яркости "NumOfBright"
 Lp1 := abs(Floor((MaxContrast-abs(NumOfContrast))/(abs(NumOfContrast)+(MaxContrast+1)))); // 1= если "abs(NumOfContrast)>MaxContrast", иначе 0
 NumOfContrast := NumOfContrast*(1-Lp1)+MaxContrast*Lp1; // "NumOfContrast" в пределах "0..MaxContrast"

 // 3. (0..1541) Проверка оттенка ---------------------------------------------
 // Если "NumOfShade<0" или "NumOfShade>1541", то установить "NumOfShade" в пределах "0..1541"
 Lp0 := abs(Floor(NumOfShade/(abs(NumOfShade)+1))); // 1= если "NumOfShade<0", иначе 0
 Lp1 := Floor((abs(NumOfShade)-Lp0)/1542); // Во сколько раз "abs(NumOfShade)>1542"
 NumOfShade := abs(NumOfShade*(Lp0*-2+1)-1542*(Lp1+Lp0)); // "NumOfShade" в пределах "0..1541"
 //----------------------------------------------------------------------------

 // 4. (0..1541) Свойства оттенка (для 5 пункта) ------------------------------
 Q := Floor(NumOfShade/257)+1; // Номер треугольника "1..6"
 CellsCount := NumOfShade-(Q*257-129); // Количество ячеек от середины треугольника к краям, + вправо, - влево
 SideLR := -Floor(CellsCount/130); // 1= если "CellsCount < 0",  0= если "CellsCount >= 0"
 E := 1-(Q/2-Floor(Q/2))*2; // Если четный треугольник то E=1, иначе E=0
 //-----
 // 5. (0..1541) Проверить, находится ли оттенок в пределах одного из треугольников ------
 D := 1-2*(NumOfBright-Floor(NumOfBright)); // 1=если яркость с целым числом, иначе 0
 HalfSideCount := Ceil(NumOfContrast)+E*D-1; // Количество ячеек сбоку от треугольника, не учитывая центр
 OutOfTriangle := -Floor((HalfSideCount-abs(CellsCount))/130); // 1= если "NumOfShade" за пределами треугольника, иначе 0
 if (Move1 = true) then // Перейти к правому треугольнику если оттенок выходит за пределы с правой стороны от треугольника "Q" или к левому треугольнику если выходит за пределы слева от "Q", иначе оставить оттенок "NumOfShade" как есть
  NumOfShade := (OutOfTriangle*((Q*257-129)+(129+(128-(Ceil(NumOfContrast)-1))-(1-E)*D)*(SideLR*-2+1))
               +(1-OutOfTriangle)*NumOfShade)*Ceil(NumOfContrast/129)
 else // Оставить оттенок в "Q" треугольнике справа если оттенок выходит за пределы с правой стороны или в "Q" треугольнике слева если выходит за пределы слева от "Q", иначе оставить оттенок "NumOfShade" как есть
 NumOfShade := (OutOfTriangle*((Q*257-129)+HalfSideCount*(SideLR*-2+1))+(1-OutOfTriangle)*NumOfShade)*Ceil(NumOfContrast/129);
 //-----
 // Если "NumOfShade<0" или "NumOfShade>1541", то установить "NumOfShade" в пределах "0..1541"
 Lp0 := abs(Floor(NumOfShade/(abs(NumOfShade)+1))); // 1= если "NumOfShade<0", иначе 0
 Lp1 := Floor((abs(NumOfShade)-Lp0)/1542); // Во сколько раз "abs(NumOfShade)>1542"
 NumOfShade := abs(NumOfShade*(Lp0*-2+1)-1542*(Lp1+Lp0)); // "NumOfShade" в пределах "0..1541"

 
// 6. (0..1541)  Вывести за пределы функции измененные значения яркости, оттенка, контрастности ----
 ChangedBright := Floor(NumOfBright*2); // Новая яркость
 ChangedShade := Floor(NumOfShade); // Новый оттенок
 ChangedContrast := Floor(NumOfContrast+0.5); // Новая контрастность
 //////////////////////////////////////////////////////////////////////////////

 // Перевести яркость, оттенок, контрастность в RGB ///////////////////////////
 Q := Floor(NumOfShade/257)+1; // Номер треугольника "1..6"
 CellsCount := NumOfShade-(Q*257-129); // Количество ячеек от середины треугольника к краям, + вправо, - влево
 SideLR := -Floor(CellsCount/130); // 1= если "CellsCount < 0",  0= если "CellsCount >= 0"
 E := 1-(Q/2-Floor(Q/2))*2; // Если четный треугольник то E=1, иначе E=0

 Qmax := Ceil(Q/2)-1+E*(1-SideLR)-3*Floor(Q/6)*(1-SideLR); // (0-R, 1-G, 2-B) = RGBmax
 Qp := Q-Floor(Q/4)*3; // Приравнивание 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 Qmid := 2-(Qp-SideLR-Floor(Qp/3)*(1-SideLR)*3); // (0-R, 1-G, 2-B) = RGBmid
 Qmin := 3-(Qmax+Qmid); // (0-R, 1-G, 2-B) = RGBmin
 RGBmax := NumOfBright+NumOfContrast; // Максимальное значение из R,G,B
 RGBmin := NumOfBright-abs(NumOfContrast); // Минимальное значение из R,G,B
 RGBmid := abs(RGBmin+(abs(CellsCount)-(NumOfBright*2)*E)*Ceil(NumOfContrast/129)); // Среднее значение из R,G,B
 R := Round((abs(Qmax-2+0.5)-0.5)*RGBmax+(abs(Qmid-2+0.5)-0.5)*RGBmid+(abs(Qmin-2+0.5)-0.5)*RGBmin); // Если Qmax или Qmid или Qmin=0, то R = RGBmax или RGBmid или RGBmin соответственно
 G := Round((1-abs(Qmax-1))*RGBmax+(1-abs(Qmid-1))*RGBmid+(1-abs(Qmin-1))*RGBmin); // Если Qmax или Qmid или Qmin=1, то G = RGBmax или RGBmid или RGBmin соответственно
 B := Round((abs(Qmax-0.5)-0.5)*RGBmax+(abs(Qmid-0.5)-0.5)*RGBmid+(abs(Qmin-0.5)-0.5)*RGBmin); // Если Qmax или Qmid или Qmin=2, то B = RGBmax или RGBmid или RGBmin соответственно
 //////////////////////////////////////////////////////////////////////////////
end;


procedure TForm1.Button3Click(Sender: TObject); // По нажатию кнопки
var
R,G,B, Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast,
ChangedBright, ChangedShade, ChangedContrast : extended;
begin
 Main_NumOfBright := 255; // Яркость, от 0 до 510
 Main_NumOfShade := 1027; // Оттенок, от 0 до 1541 (0 и 1541 переходные значения между 1 и 6 треугольником)
 Main_NumOfContrast := 200; // Контрастность, от 0 до 128 (0=черно-белые оттенки)

 // Перевести яркость, оттенок, контрастность в RGB (Цвет указывается вручную) (true-переходить к следующим треугольникам если оттенок за пределами, false-оставаться в пределах указанного треугольника)
 BSC_to_RGB_2(Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, true,
            ChangedBright,ChangedShade,ChangedContrast, R,G,B);

 Form1.Caption := 'B: '+floattostr(Main_NumOfBright) +' S: '+floattostr(Main_NumOfShade)
  +' C: '+floattostr(Main_NumOfContrast) +'  |nB: '+floattostr(ChangedBright)
  +' nS: '+floattostr(ChangedShade)+' nC: '+floattostr(ChangedContrast)
  +'| R: '+floattostr(R)+' G: '+floattostr(G)+' B: '+floattostr(B);
end;
+ Поменять яркость RGB.
uses  Math;

function RGB_Bright (R,G,B, Max_Percent_Bright,Percent_Bright: extended;
    out R2,G2,B2:extended):boolean; // Поменять яркость RGB
var
Lc: extended;
begin
 Lc := Floor(Percent_Bright/(Abs(Percent_Bright)+1)); // -1 = уменьшить яркость, 0 = увеличить яркость
 // RGB в формат 0...1
 R := R/255;
 G := G/255;
 B := B/255;
 // Поменять яркость
 R := Abs (((((1 + Lc) + R * -(Lc * 2 + 1)) * Abs (Percent_Bright)) / Max_Percent_Bright) - R * -(Lc * 2 + 1));
 G := Abs (((((1 + Lc) + G * -(Lc * 2 + 1)) * Abs (Percent_Bright)) / Max_Percent_Bright) - G * -(Lc * 2 + 1));
 B := Abs (((((1 + Lc) + B * -(Lc * 2 + 1)) * Abs (Percent_Bright)) / Max_Percent_Bright) - B * -(Lc * 2 + 1));
 // RGB в формат 0...255
 R2 := Round(R * 255);
 G2 := Round(G * 255);
 B2 := Round(B * 255);
end;


procedure TForm1.Button4Click(Sender: TObject);
var
R,G,B,R2,G2,B2,Max_Percent_Bright,Percent_Bright: extended;
begin
 R := 255;  G := 0;   B := 0;

 Max_Percent_Bright := 255; // Максимально допустимое значение яркости (Максимальная яркость = 255)
 Percent_Bright := -127; // На сколько процентов поменять яркость

 // Поменять яркость RGB
 RGB_Bright (R,G,B, Max_Percent_Bright,Percent_Bright, R2,G2,B2);

 Form1.Caption := 'R: '+floattostr(R)+'  G: '+floattostr(G)+'  B: '+floattostr(B)
              +'  |Поменять яркость на '+floattostr(Percent_Bright)
              +'% из '+floattostr(Max_Percent_Bright)
              +'|   R2: '+floattostr(R2)+'  G2: '+floattostr(G2)+'  B2: '+floattostr(B2);
end;
+ Поменять оттенок RGB.
uses  Math;

function RGB_Shade (NumOfBright,NumOfShade,NumOfContrast,PlusShade:extended; RightColor:boolean;
    out ChangedBright,ChangedShade,ChangedContrast,ChangedShadeMin,ChangedShadeMax:extended;
    out R,G,B:extended):boolean; // Поменять оттенок RGB
var
Q,CellsCount,SideLR,E,Qmax,Qp,Qmid,Qmin,RGBmax,RGBmin,RGBmid: extended;
// Корректировка //////////////////////////////////////////////////////////////
Lp0,Lp1,MaxContrast,D,HalfSideCount,OutOfTriangle: extended;
CellsInRow,OnePercentStep,StepNumber,CellsInRowTriangle,Qb,Ql,Qn,Qlout: extended;
begin
 // 0.Корректировка ///////////////////////////////////////////////////////////
 if (RightColor = false) then // Цвет указывается вручную
 begin
  // 1.Проверка яркости --------------------------------------------------------
  NumOfBright := NumOfBright/2; // Перевести яркость "0...510" в формат с дробью "0.0 ... 255.0"
  //-----
  // Если "NumOfBright<0" или "NumOfBright>255", то поменять "NumOfBright" соответственно на 0 или 255
  Lp0 := 1-abs(Floor(NumOfBright/(abs(NumOfBright)+1))); // 1= если "NumOfBright>=0", иначе 0
  Lp1 := abs(Floor((255-abs(NumOfBright))/(abs(NumOfBright)+256)))*Lp0; // 1= если "abs(NumOfBright)>255", иначе 0
  NumOfBright := Lp0*(NumOfBright*(1-Lp1)+255*Lp1); // "NumOfBright" в пределах "0..255"

  // 2.Проверка контрастности --------------------------------------------------
  // Если "NumOfContrast<0" или "NumOfContrast>128", то поменять "NumOfContrast" соответственно на 0 или 128
  Lp0 := 1-abs(Floor(NumOfContrast/(abs(NumOfContrast)+1))); // 1= если "NumOfContrast>=0", иначе 0
  Lp1 := abs(Floor((128-abs(NumOfContrast))/(abs(NumOfContrast)+129)))*Lp0; // 1= если "abs(NumOfContrast)>128", иначе 0
  NumOfContrast := Lp0*(NumOfContrast*(1-Lp1)+128*Lp1); // "NumOfContrast" в пределах "0 ... 128"
  //----- (Проверить, выходит ли контрастность за пределы максимальной контрастности "MaxContrast" на заданной яркости "NumOfBright")
  NumOfContrast := Floor(NumOfContrast)-(NumOfBright-Floor(NumOfBright)); // Если яркость с дробью то добавить 0.5 к контрастности.
  MaxContrast := 127.5-abs(NumOfBright-127.5); // Определить максимальную контрастность на яркости "NumOfBright"
  Lp1 := abs(Floor((MaxContrast-abs(NumOfContrast))/(abs(NumOfContrast)+(MaxContrast+1)))); // 1= если "abs(NumOfContrast)>MaxContrast", иначе 0
  NumOfContrast := NumOfContrast*(1-Lp1)+MaxContrast*Lp1; // "NumOfContrast" в пределах "0..MaxContrast"

  // 3. (-1529..1529) Проверка оттенка -----------------------------------------
  // Если "PlusShade<-1529" или "PlusShade>1529", то поменять "PlusShade" соответственно на -1529 или 1529
  Lp0 := Floor(PlusShade/(abs(PlusShade)+1))*2+1; // 1= если "PlusShade>=0", иначе -1
  Lp1 := abs(Floor((1529-abs(PlusShade))/(abs(PlusShade)+1530))); // 1= если "abs(PlusShade)>1529", иначе 0
  PlusShade := Lp0*abs(PlusShade*(1-Lp1)+1529*Lp1); // "PlusShade" в пределах "-1529..1529"
  //----------------------------------------------------------------------------

  // 4. (0..1541) Свойства оттенка (для 5 пункта) ------------------------------
  Q := Floor(NumOfShade/257)+1; // Номер треугольника "1..6"
  CellsCount := NumOfShade-(Q*257-129); // Количество ячеек от середины треугольника к краям, + вправо, - влево
  SideLR := -Floor(CellsCount/130); // 1= если "CellsCount < 0",  0= если "CellsCount >= 0"
  E := 1-(Q/2-Floor(Q/2))*2; // Если четный треугольник то E=1, иначе E=0
  //-----
  // 5. (0..1541) Проверить, находится ли оттенок в пределах одного из треугольников ------
  D := 1-2*(NumOfBright-Floor(NumOfBright)); // 1=если яркость с целым числом, иначе 0
  HalfSideCount := Ceil(NumOfContrast)+E*D-1; // Количество ячеек сбоку от треугольника, не учитывая центр
  OutOfTriangle := -Floor((HalfSideCount-abs(CellsCount))/130); // 1= если "NumOfShade" за пределами треугольника, иначе 0
  // Оставить оттенок в "Q" треугольнике справа если оттенок выходит за пределы с правой стороны или в "Q" треугольнике слева если выходит за пределы слева от "Q", иначе оставить оттенок "NumOfShade" как есть
  NumOfShade := (OutOfTriangle*((Q*257-129)+HalfSideCount*(SideLR*-2+1))+(1-OutOfTriangle)*NumOfShade)*Ceil(NumOfContrast/129);
 end
 else // Цвет точно находится в треугольнике
 begin
  NumOfBright := NumOfBright/2; // Перевести яркость "0...510" в формат с дробью "0.0 ... 255.0"
  NumOfContrast := Floor(NumOfContrast)-(NumOfBright-Floor(NumOfBright)); // Если яркость с дробью то добавить 0.5 к контрастности.
 end;

 // 4. (-1529..1529) Свойства оттенка (для 5 пункта) --------------------------
 //NumOfShade := 128; // Оттенок в треугольнике (Уже просчитанный под контрастность "NumContrast")
 Q := Floor(NumOfShade/257)+1; // Номер треугольника "1..6"
 CellsCount := NumOfShade-(Q*257-129); // Количество ячеек от середины треугольника к краям, + вправо, - влево
 E := 1-(Q/2-Floor(Q/2))*2; // Если четный треугольник то E=1, иначе E=0
 //-----
 // 5. (-1529..1529) Проверить, находится ли оттенок в пределах одного из треугольников ------
 D := 1-2*(NumOfBright-Floor(NumOfBright)); // 1=если яркость с целым числом, иначе 0
 CellsInRow := (Ceil(NumOfContrast)*2-1)*6+D*6; // Количество ячеек во всех 6 треугольниках, в ряду "Ceil(NumOfContrast)"
 //OnePercentStep := 1530/CellsInRow; // Сколько ячеек из 1530, являются одним шагом для "CellsInRow" ячеек. (Пример: на контрастности=1, 6 ячеек в ряду и для прохода каждой нужно 6 шагов, по 255 ячеек за шаг)
 //StepNumber := Floor(PlusShade/OnePercentStep); // Номер ячейки в ряду "Ceil(NumOfContrast)"
 //PlusShade := StepNumber;
 CellsInRowTriangle := abs(Ceil(NumOfContrast)*2-1); // Количество ячеек в треугольнике в ряду "Ceil(NumOfContrast)", без учета четности треугольника
 Ql := Floor((PlusShade+CellsCount)/(CellsInRowTriangle+D)); // Приблизительное количество треугольников в указанном промежутке "PlusShade"
 Qn := (PlusShade+CellsCount)-Ql*(CellsInRowTriangle+D); // Количество ячеек от центра следующего треугольника
 Qlout := -Floor(((Ceil(NumOfContrast)-1+D*(1-((Ql+1)/2-Floor((Ql+1)/2))*2))-abs(Qn))/1531); // 1=если "Qn" за пределами треугольника "Ql", иначе 0
 Qb := Ql+Qlout; // Количество треугольников в указанном промежутке "PlusShade"
 // Установить новый оттенок в указанном промежутке "PlusShade", от предыдущего оттенка "NumOfShade"
 NumOfShade := Qb*257+NumOfShade+(PlusShade-CellsInRowTriangle*Qb-D*(1-E)*Qb);
 //-----
 // Если "NumOfShade<0" или "NumOfShade>1541", то установить "NumOfShade" в пределах "0..1541"
 Lp0 := abs(Floor(NumOfShade/(abs(NumOfShade)+1))); // 1= если "NumOfShade<0", иначе 0
 Lp1 := Floor((abs(NumOfShade)-Lp0)/1542); // Во сколько раз "abs(NumOfShade)>1542"
 NumOfShade := abs(NumOfShade*(Lp0*-2+1)-1542*(Lp1+Lp0)); // "NumOfShade" в пределах "0..1541"

 // 6. (-1529..1529) Вывести за пределы функции измененные значения яркости, оттенка, контрастности ----
 ChangedBright := Floor(NumOfBright*2); // Новая яркость
 ChangedShade := Floor(NumOfShade); // Новый оттенок
 ChangedShadeMax := Floor(CellsInRow); // Границы оттенка
 ChangedShadeMin := -Floor(CellsInRow);
 ChangedContrast := Floor(NumOfContrast+0.5); // Новая контрастность
 //////////////////////////////////////////////////////////////////////////////

 // Перевести яркость, оттенок, контрастность в RGB ///////////////////////////
 Q := Floor(NumOfShade/257)+1; // Номер треугольника "1..6"
 CellsCount := NumOfShade-(Q*257-129); // Количество ячеек от середины треугольника к краям, + вправо, - влево
 SideLR := -Floor(CellsCount/130); // 1= если "CellsCount < 0",  0= если "CellsCount >= 0"
 E := 1-(Q/2-Floor(Q/2))*2; // Если четный треугольник то E=1, иначе E=0

 Qmax := Ceil(Q/2)-1+E*(1-SideLR)-3*Floor(Q/6)*(1-SideLR); // (0-R, 1-G, 2-B) = RGBmax
 Qp := Q-Floor(Q/4)*3; // Приравнивание 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
 Qmid := 2-(Qp-SideLR-Floor(Qp/3)*(1-SideLR)*3); // (0-R, 1-G, 2-B) = RGBmid
 Qmin := 3-(Qmax+Qmid); // (0-R, 1-G, 2-B) = RGBmin
 RGBmax := NumOfBright+NumOfContrast; // Максимальное значение из R,G,B
 RGBmin := NumOfBright-abs(NumOfContrast); // Минимальное значение из R,G,B
 RGBmid := abs(RGBmin+(abs(CellsCount)-(NumOfBright*2)*E)*Ceil(NumOfContrast/129)); // Среднее значение из R,G,B
 R := Round((abs(Qmax-2+0.5)-0.5)*RGBmax+(abs(Qmid-2+0.5)-0.5)*RGBmid+(abs(Qmin-2+0.5)-0.5)*RGBmin); // Если Qmax или Qmid или Qmin=0, то R = RGBmax или RGBmid или RGBmin соответственно
 G := Round((1-abs(Qmax-1))*RGBmax+(1-abs(Qmid-1))*RGBmid+(1-abs(Qmin-1))*RGBmin); // Если Qmax или Qmid или Qmin=1, то G = RGBmax или RGBmid или RGBmin соответственно
 B := Round((abs(Qmax-0.5)-0.5)*RGBmax+(abs(Qmid-0.5)-0.5)*RGBmid+(abs(Qmin-0.5)-0.5)*RGBmin); // Если Qmax или Qmid или Qmin=2, то B = RGBmax или RGBmid или RGBmin соответственно
 //////////////////////////////////////////////////////////////////////////////
end;


procedure TForm1.TrackBar1Change(Sender: TObject); // Если передвинут ползунок "TrackBar1"
var
R,G,B, Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, PlusShade,
ChangedBright, ChangedShade, ChangedContrast, ChangedShadeMin, ChangedShadeMax : extended;
begin
 //R := 170; G := 0; B := 0; // от 0 до 255
 //RGB_to_BSC(R,G,B,  Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast); // Перевести RGB в яркость, оттенок, контрастность
 //Main_NumOfBright := Main_NumOfBright*2; // Поменять диапазон яркости от 0 до 510
 //Main_NumOfContrast := Floor(Main_NumOfContrast+0.5); // Поменять диапазон контрастности от 0 до 128

 Main_NumOfBright := 170; // Яркость, от 0 до 510
 Main_NumOfShade := 128; // Оттенок, от 1 до 1540
 Main_NumOfContrast := 85; // Контрастность, от 0 до 128 (0=черно-белые оттенки)

 PlusShade := TrackBar1.Position; // Прибавить к оттенку от -1529 до 1529

 // Поменять оттенок RGB (true- цвет точно находится в треугольнике, false- цвет указывается вручную)
 RGB_Shade(Main_NumOfBright, Main_NumOfShade, Main_NumOfContrast, PlusShade, false,
            ChangedBright,ChangedShade,ChangedContrast,ChangedShadeMin,ChangedShadeMax,
            R,G,B);

 if ((TrackBar1.Min<>ChangedShadeMin) or (TrackBar1.Max<>ChangedShadeMax)) then
 begin
  TrackBar1.Min := Floor(ChangedShadeMin);
  TrackBar1.Max := Floor(ChangedShadeMax);
 end;

 Form1.Caption := 'B: '+floattostr(Main_NumOfBright) +' S: '+floattostr(Main_NumOfShade)
  +' C: '+floattostr(Main_NumOfContrast) +' plus: '+floattostr(PlusShade) +'  |nB: '+floattostr(ChangedBright)
  +' nS: '+floattostr(ChangedShade)+' nC: '+floattostr(ChangedContrast)
  +' min: '+floattostr(ChangedShadeMin)+' max: '+floattostr(ChangedShadeMax)
  +'| R: '+floattostr(R)+' G: '+floattostr(G)+' B: '+floattostr(B);
end;
+ Поменять контрастность RGB.
uses  Math;

function RGB_Contrast (R,G,B, Max_Percent_Contrast,Percent_Contrast:extended;
              out R2,G2,B2:extended):boolean; // Поменять контрастность RGB
var
RGBmax,RGBmin,NumOfBright,NumOfContrast,LcR,LcG,LcB,Lc2,MaxNumOfContrast,
RGBmid,E,D,CountInRow,MaxCountInRow,CellsCount,Sline,Zero1,Kside,NextMidCount,
NextRGBmid,DiffRGBmid,Rm,Gm,Bm,BGW:extended;
begin
 // Максимальное, минимальное значение из R,G,B
 RGBmax := (((((R + G) / 2) + (Abs (R - G) / 2)) + B) / 2) + (Abs ((((R + G) / 2) + (Abs (R - G) / 2)) - B) / 2);
 RGBmin := (((((R + G) / 2) - (Abs (R - G) / 2)) + B) / 2) - (Abs ((((R + G) / 2) - (Abs (R - G) / 2)) - B) / 2);

 NumOfBright := (RGBmax + RGBmin) / 2; // Яркость от 0 до 255
 NumOfContrast := (RGBmax - RGBmin) / 2; // Контрастность от 0 до 127.5

 LcR := (Ceil ((R - NumOfBright) / 256) * -2) + 1; // 1=Если "R" меньше "NumOfBright", -1=если больше
 LcG := (Ceil ((G - NumOfBright) / 256) * -2) + 1; // 1=Если "G" меньше "NumOfBright", -1=если больше
 LcB := (Ceil ((B - NumOfBright) / 256) * -2) + 1; // 1=Если "B" меньше "NumOfBright", -1=если больше

 // 0 = уменьшить контрастность, 1 = увеличить контрастность
 Lc2 := Floor(Percent_Contrast/(Abs(Percent_Contrast)+1))+1; // 1= если "Percent_NumOfBright<0", иначе 0

 MaxNumOfContrast := 127.5-abs(NumOfBright-127.5); // Определить максимальную контрастность на яркости "NumOfBright"

 RGBmid := (R + G + B)-(RGBmax+RGBmin); // Среднее значение из R,G,B
 E := Ceil((RGBmid+0.002-NumOfBright)/256); // 0=если нечетный треугольник, 1=если четный треугольник
 D := 1-2*(NumOfBright-Floor(NumOfBright)); // 1=если яркость с целым числом, иначе 0
 CountInRow := (Ceil(NumOfContrast)+E*D-1)*2; // Количество ячеек в основном ряду треугольника
 MaxCountInRow := (Ceil(MaxNumOfContrast)+E*D-1)*2; // Количество ячеек в целевом ряду треугольника
 CellsCount := CountInRow/2-(abs(RGBmax*E-(RGBmid-RGBmin*(1-E)))); // Количество ячеек от середины треугольника
 Sline := Ceil((CellsCount+1)/(CountInRow+1))-1; // 1=если "CellsCount>CountInRow", иначе 0
 Zero1 := 1-Ceil(CountInRow/254); // 1=если "CountInRow=0", иначе 0
 Kside := (1/(CountInRow+Zero1))*(CellsCount-Sline); // Коеффициент положения ячейки
 NextMidCount := MaxCountInRow/2-abs(Round(abs(Kside)*MaxCountInRow))+Sline; // Количество ячеек от середины треугольника, в целевом ряду
 NextRGBmid := Floor(Ceil(abs(NumOfBright+MaxNumOfContrast*(E*2-1)))-NextMidCount*(E*2-1)); // "RGBmid" в целевом ряду
 DiffRGBmid := abs(NextRGBmid-RGBmid); // Сколько нужно приплюсовать к "RGBmid", чтобы получить "DiffRGBmid"

 Rm := 1+Floor(((RGBmax-RGBmin)-(abs((RGBmax-R)-(R-RGBmin))+1))/256); // 1=если R=RGBmid, иначе 0
 Gm := 1+Floor(((RGBmax-RGBmin)-(abs((RGBmax-G)-(G-RGBmin))+1))/256); // 1=если G=RGBmid, иначе 0
 Bm := 1+Floor(((RGBmax-RGBmin)-(abs((RGBmax-B)-(B-RGBmin))+1))/256); // 1=если B=RGBmid, иначе 0

 BGW := Ceil((abs(R-G)+abs(R-B))/511); // 0=если R=G=B, иначе 1

 R2 := Round(Abs(((((MaxNumOfContrast*Lc2-(NumOfBright * LcR - R * LcR))*(1-Rm*Lc2)+
  DiffRGBmid*Rm*Lc2)*BGW * -abs(Percent_Contrast)) / Max_Percent_Contrast) + R * LcR));
 G2 := Round(Abs(((((MaxNumOfContrast*Lc2-(NumOfBright * LcG - G * LcG))*(1-Gm*Lc2)+
  DiffRGBmid*Gm*Lc2)*BGW * -abs(Percent_Contrast)) / Max_Percent_Contrast) + G * LcG));
 B2 := Round(Abs(((((MaxNumOfContrast*Lc2-(NumOfBright * LcB - B * LcB))*(1-Bm*Lc2)+
  DiffRGBmid*Bm*Lc2)*BGW * -abs(Percent_Contrast)) / Max_Percent_Contrast) + B * LcB));
end;


procedure TForm1.Button5Click(Sender: TObject);
var
R,G,B,R2,G2,B2,Max_Percent_Contrast,Percent_Contrast: extended;
begin
 R := 199; G := 56; B := 56; // от 0 до 255

 Max_Percent_Contrast := 128; // Максимально допустимое значение контрастности (255= Учитывать треугольники на яркости с дробью и без, 128= Учитывать треугольники только одного типа яркости)
 Percent_Contrast := -64; // На сколько процентов поменять контрастность от –Max_Percent_Contrast до Max_Percent_Contrast

 // Поменять контрастность RGB
 RGB_Contrast (R,G,B, Max_Percent_Contrast,Percent_Contrast, R2,G2,B2);

 Form1.Caption := 'R: '+floattostr(R)+'  G: '+floattostr(G)+'  B: '+floattostr(B)
              +'  |Поменять контрастность на '+floattostr(Percent_Contrast)
              +'% из '+floattostr(Max_Percent_Contrast)
              +'|   R2: '+floattostr(R2)+'  G2: '+floattostr(G2)+'  B2: '+floattostr(B2);
end;
22 июн 20, 11:19    [22155006]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
alekcvp
Member

Откуда:
Сообщений: 2235
Ученик_333,

А точно контрастность - это именно контрастность, а не "насышение" (saturation)?
Потому что за чёрно-белые оттенки отвечает именно оно обычно.

И HSL - это Hue, Saturation, Light вроде, контрастности там нет.

Сообщение было отредактировано: 22 июн 20, 14:34
22 июн 20, 14:35    [22155174]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Сергей N
Member

Откуда: отсюда
Сообщений: 69
Ученик_333, у Вас СВОЯ формализованная концепция восприятия цвета? Тогда поясните, пожалуйста, ее основные положения и дайте определения оттенка и контрастности. Без этого серьезно воспринимать Вашу модель невозможно.
22 июн 20, 15:23    [22155193]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
alekcvp
А точно контрастность - это именно контрастность, а не "насышение" (saturation)?

Если честно, не уверен. Вот пример по формулам, только для c#. Судя по картинке в википедии думаю, что это можно считать контрастностью.
(Хотя там изображение еще и темнеет, так-что вполне возможно я ошибся в формулировках).

Сообщение было отредактировано: 22 июн 20, 15:28
22 июн 20, 15:29    [22155201]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Сергей N
Member

Откуда: отсюда
Сообщений: 69
К примеру, https://colorscheme.ru/art-of-color/saturation.html
22 июн 20, 16:17    [22155248]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
alekcvp
Member

Откуда:
Сообщений: 2235
Ученик_333,

Я имел в виду это https://ru.wikipedia.org/wiki/HSL
22 июн 20, 19:04    [22155413]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 68
alekcvp
Я имел в виду это https://ru.wikipedia.org/wiki/HSL
Сергей N
К примеру, https://colorscheme.ru/art-of-color/saturation.html

Насчет формулировок пока не определился, а вот основные положения, думаю видны на изображениях.

К сообщению приложен файл. Размер - 116Kb
23 июн 20, 07:33    [22155651]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить