Добрый день! Собственно нужна функция на ФП которая получая RGB-параметры возвращала бы номер этого(или максимально близкого к этому цвету) в стандартной палитре. [ RGBToP(const r, g, b:word):word; ] Желательно БЕЗ использования асм. Поиск особых результатов не дал(кроме не к чему не ведущей темы 2003-года)
Оооо, я когда-то решал эту задачу. Её нужно было решать всем разработчикам игрушек с палитровой графикой для подгонки например цветов текстур/спрайтов с оригинальной палитрой к цветовой палитре игры.
Пусть элемент палитры описывается типом type TRGB = record Red, Green, Blue : Byte end; Палитра состоит из 256 элементов TRGB: type TRGBPalette = array[0..255] of TRGB;
Можно рассуждать следующим образом. Есть цветовое пространство RGB. Нам нужен его первый октант, то есть та часть(тот куб), в котором координаты по осям R, G и B изменяются от 0 до 255(тип Byte для Red, Green и Blue в TRGB). Соответственно переменная типа TRGB будет с одной стороны задавать цвет, а с другой(то что нам и нужно) координаты в первом октанте RGB-пространства. Вся палитра будет соответственно задавать набор точек в RGB-пространстве. Остается решить задачу на нахождение минимального расстояния от заданной точки до точек из палитры(в цветовом пространстве RGB). Пусть функция вычисляющая расстояние между двумя точками A и B объявлена как function Distance( A, B : TRGB ) : Real; тогда найти минимальное расстояние (и нужный нам ближайший цвет) можно следующим образом:
var RGBPalette : TRGBPalette; { Палитра <чужая>. } X : TRGB; { Цвет <из нашей палитры>. } MinDistance : Real; Index : Integer; { Номер цвета из чужой палитры, который наиболее близок к нашему цвету. } I : Integer; begin Index := 0; MinDistance := Distance(X,RGBPalette[Index]); for I := 1 to 255 do if MinDistance > Distance(X,RGBPalette[I]) then begin MinDistance := Distance(X,RGBPalette[I]); Index := I end; end;
Тогда цвет RGBPalette[Index] наиболее "похож" на цвет X.