Delphi:
Поменять цвет RGB (2) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727. 728. 729. 730. 731. 732. 733. 734. 735. 736. 737. 738. 739. 740. 741. 742. 743. 744. 745. 746. 747. 748. 749. 750. 751. 752. 753. 754. 755. 756. 757. 758. 759. 760. 761. 762. 763. 764. 765. 766. 767. 768. 769. 770. 771. 772. 773. 774. 775. 776. 777. 778. 779. 780. 781. 782. 783. 784. 785. 786. 787. 788. 789. 790. 791. 792. 793. 794. 795. 796. 797. 798. 799. 800. 801. 802. 803. 804. 805. 806. 807. 808. 809. 810. 811. 812. 813. 814. 815. 816. 817. 818. 819. 820. 821. 822. 823. 824. 825. 826. 827. 828. 829. 830. 831. 832. 833. 834. 835. 836. 837. 838. 839. 840. 841. 842. 843. 844. 845. 846. 847. 848. 849. 850. 851. 852. 853. 854. 855. 856. 857. 858. 859. 860. 861. 862. 863. 864. 865. 866. 867. 868. 869. 870. 871. 872. 873. 874. 875. 876. 877. 878. 879. 880. 881. 882. 883. 884. 885. 886. 887. 888. 889. 890. 891. 892. 893. 894. 895. 896. 897. 898. 899. 900. 901. 902. 903. 904. 905. 906. 907. 908. 909. 910. 911. 912. 913. 914. 915. 916. 917. 918. 919. 920. 921. 922. 923. 924. 925. 926. 927. 928. 929. 930. 931. 932. 933. 934. 935. 936. 937. 938. 939. 940. 941. 942. 943. 944. 945. 946. 947. 948. 949. 950. 951. 952. 953. 954. 955. 956. 957. 958. 959. 960. 961. 962. 963. 964. 965. 966. 967. 968. 969. 970. 971. 972. 973. 974. 975. 976. 977. 978. 979. 980. 981. 982. 983. 984. 985. 986. 987. 988. 989. 990. 991. 992. 993. 994. 995. 996. 997. 998. 999. 1000. 1001. 1002. 1003. 1004. 1005. 1006. 1007. 1008. 1009. 1010. 1011. 1012. 1013. 1014. 1015. 1016. 1017. 1018. 1019. 1020. 1021. 1022. 1023. 1024. 1025. 1026. 1027. 1028. 1029. 1030. 1031. 1032. 1033. 1034. 1035. 1036. 1037. 1038. 1039. 1040. 1041. 1042. 1043. 1044. 1045. 1046. 1047. 1048. 1049. 1050. 1051. 1052. 1053. 1054. 1055. 1056. 1057. 1058. 1059. 1060. 1061. 1062. 1063. 1064. 1065. 1066. 1067. 1068. 1069. 1070. 1071. 1072. 1073. 1074. 1075. 1076. 1077. 1078. 1079. 1080. 1081. 1082. 1083. 1084. 1085. 1086. 1087. 1088. 1089. 1090. 1091. 1092.
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) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727. 728. 729. 730. 731. 732. 733. 734. 735. 736. 737. 738. 739. 740. 741. 742. 743. 744. 745. 746. 747. 748. 749. 750. 751. 752. 753. 754. 755. 756. 757. 758. 759. 760. 761. 762. 763. 764. 765. 766. 767. 768. 769. 770. 771. 772. 773. 774. 775. 776. 777. 778. 779. 780. 781. 782. 783. 784. 785. 786. 787. 788. 789. 790. 791. 792. 793. 794. 795. 796. 797. 798. 799. 800. 801. 802. 803. 804. 805. 806. 807. 808. 809. 810. 811. 812. 813. 814. 815. 816. 817. 818. 819. 820. 821. 822. 823. 824. 825. 826. 827. 828. 829. 830. 831. 832. 833. 834. 835. 836. 837. 838. 839. 840. 841. 842. 843. 844. 845. 846. 847. 848. 849. 850. 851. 852. 853. 854. 855. 856. 857. 858. 859. 860. 861. 862. 863. 864. 865. 866. 867. 868. 869. 870. 871. 872. 873. 874. 875. 876. 877. 878. 879. 880. 881. 882. 883. 884. 885. 886. 887. 888. 889. 890. 891. 892. 893. 894. 895. 896. 897. 898. 899. 900. 901. 902. 903. 904. 905. 906. 907. 908. 909. 910. 911. 912. 913. 914. 915. 916. 917. 918. 919. 920. 921. 922. 923. 924. 925. 926. 927. 928. 929. 930. 931. 932. 933. 934. 935. 936. 937. 938. 939. 940. 941. 942. 943. 944. 945. 946. 947. 948. 949. 950. 951. 952. 953. 954. 955. 956. 957. 958. 959. 960. 961. 962. 963. 964. 965. 966. 967. 968. 969. 970. 971.
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;
}
}
|