Построение градиента

Публикация № 978835

Программирование - Практика программирования

градиент переход цветов RGB

3
Небольшая функция, строящая градиент, и обработка для построения произвольных градиентов.

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

//Возвращает массив цветов, представляющих собой градиент - переход от начального цвета к конечному. 
//Возвращаемый массив начинается с начального и заканчивается конечным цветом
//
//Параметры:
//		НачальныйЦвет - Цвет - начальный цвет градиента с видом цвета Абсолютный 
//		КонечныйЦвет - Цвет - конечный цвет градиента с видом цвета Абсолютный
//		КоличествоГрадаций - Число - общее число цветов в возвращаемом массиве (включает начальный и конечный цвета), должно быть больше 2
//
//Возвращаемое значение:
//		Массив,Неопределено - массив с элементами типа Цвет или Неопределено (если градаций меньше 3 либо начальный и конечный цвета
//								заданы не абсолютными цветами
//
Функция ПолучитьГрадиент(НачальныйЦвет, КонечныйЦвет, КоличествоГрадаций)
	
	МассивЦветов = Новый Массив;
	МассивЦветов.Добавить(НачальныйЦвет);
	
	Если КоличествоГрадаций > 2 И НачальныйЦвет.Вид = ВидЦвета.Абсолютный И КонечныйЦвет.Вид = ВидЦвета.Абсолютный Тогда
		ШагКрасного = (КонечныйЦвет.Красный - НачальныйЦвет.Красный) / КоличествоГрадаций;
		ШагЗеленого = (КонечныйЦвет.Зеленый - НачальныйЦвет.Зеленый) / КоличествоГрадаций;
		ШагСинего = (КонечныйЦвет.Синий - НачальныйЦвет.Синий) / КоличествоГрадаций;
		
		ТекКрасный = НачальныйЦвет.Красный;
		ТекЗеленый = НачальныйЦвет.Зеленый;
		ТекСиний = НачальныйЦвет.Синий;
		
		Для Сч = 2 По КоличествоГрадаций Цикл
			ТекКрасный = ТекКрасный + ШагКрасного;
			ТекЗеленый = ТекЗеленый + ШагЗеленого;
			ТекСиний = ТекСиний + ШагСинего;
			
			МассивЦветов.Добавить(Новый Цвет(Окр(ТекКрасный,0), Окр(ТекЗеленый,0), Окр(ТекСиний,0)));
		КонецЦикла;
		
		МассивЦветов[МассивЦветов.ВГраница()] = КонечныйЦвет;
		
		Возврат МассивЦветов;
		
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

Также на основе этой функции я сделал простую обработку, в которой можно задать начальный и конечный цвета и количество градаций, она построит нужный градиент в поле табличного документа. Градиент строится автоматически при изменении начального/конечного цвета либо количества градаций.

В обработке используется стандартный платформенный диалог выбора цвета. Если просто выбрать в нем цвет, он будет не с типом Абсолютный и обработка не сможет определить цветовые составляющие. Но в этом диалоге можно легко превратить тип цвета в Абсолютный, если вручную вбить значение любой компоненты или кнопками регулирования увеличить и обратно уменьшить значение любой компоненты цвета.

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

Тестовое окружение

Обработка тестировалась на платформе 8.3.6.2041, должна работать на любом последующем релизе платформы. Может работать в любой конфигурации на управляемых формах.

3

Скачать файлы

Наименование Файл Версия Размер
Построение градиента:
.epf 7,24Kb
12.01.19
0
.epf 1.0 7,24Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. dsfix 23 28.01.19 17:45 Сейчас в теме
Оставьте свое сообщение