Метод NearestIndexedColor
Намира най-близкия запис сред физическите слотове 8..63 на палитрата и връща едновременно неговата публична стойност ColorIndex и физическия слот
Методът е наличен както в IXLSWorkbook, така и в TXLSXWorkbook и не променя палитрата или състоянието на работната книга
Синтаксис
function NearestIndexedColor( AArgb: LongWord; out AMatch: TXLSNearestIndexedColorMatch): Boolean;
Вход
AArgb приема 24-битова стойност $00RRGGBB или непрозрачна стойност $FFRRGGBB
Нулев алфа байт се нормализира към $FF; частично прозрачните стойности се отхвърлят, защото индексираните записи в палитрата на работната книга са непрозрачни
Резултат
| Поле | Значение |
|---|---|
InputARGB | Нормализираният непрозрачен входен цвят |
ColorIndex | Публичният индекс на палитрата от 1 до 56 |
PaletteSlot | Физическият слот в BIFF или OOXML палитрата от 8 до 63 |
ARGB | Нормализираният непрозрачен цвят, съхраняван в избрания слот на палитрата |
DistanceSquared | Квадратът на евклидовото разстояние в цветовото пространство OKLab |
ExactMatch | Истина, когато избраният запис има същите RGB канали като нормализирания вход |
Функцията връща false за частично прозрачен вход или когато кешът на палитрата е недостъпен; при неуспех ColorIndex се инициализира на нула, а PaletteSlot на -1
Договор за съответствие
Всяка работна книга кешира нормализираните ARGB и OKLab координати на своите 56 физически записи в палитрата
Нулиране на палитрата престроява целия кеш, а ефективна промяна на един слот обновява само този кеширан слот
Всяка заявка преобразува входа веднъж и извършва едно фиксирано сканиране на 56 записа без история на заявките или неограничен растеж на кеша
При равни разстояния се избира най-ниският публичен индекс, включително при дублирани цветове в палитрата, така че резултатите остават детерминирани между машините и изпълненията
Автоматичните, системните и невалидните цветови токени не са кандидати; използвайте ResolveIndexedColor, за да класифицирате тези стойности
Пример
if Workbook.NearestIndexedColor($FF13579B, Match) then
begin
PaletteIndex := Match.ColorIndex;
if Match.ExactMatch then
UseExactPaletteColor(Match.ARGB);
end;