IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> RGB --> 256, переход между палитрами
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день!
Собственно нужна функция на ФП которая получая RGB-параметры возвращала бы номер этого(или максимально близкого к этому цвету) в стандартной палитре. [ RGBToP(const r, g, b:word):word; ]
Желательно БЕЗ использования асм.
Поиск особых результатов не дал(кроме не к чему не ведущей темы 2003-года)

заранее благодарен


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


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

Пусть элемент палитры описывается типом
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.

P.S.
Игрушки я не разрабатывал.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 6.02.2023 0:26
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name