Método NearestIndexedColor
Localiza a entrada mais próxima entre as ranhuras físicas da paleta 8..63 e devolve tanto o valor público de ColorIndex como a ranhura física
O método está disponível tanto em IXLSWorkbook como em TXLSXWorkbook e não modifica a paleta nem o estado do livro de trabalho
Sintaxe
function NearestIndexedColor( AArgb: LongWord; out AMatch: TXLSNearestIndexedColorMatch): Boolean;
Entrada
AArgb aceita um valor $00RRGGBB de 24 bits ou um valor $FFRRGGBB opaco
Um byte alfa zero é normalizado para $FF; os valores parcialmente transparentes são rejeitados porque as entradas indexadas da paleta do livro de trabalho são opacas
Resultado
| Campo | Significado |
|---|---|
InputARGB | A cor de entrada opaca normalizada |
ColorIndex | O índice público da paleta de 1 a 56 |
PaletteSlot | A ranhura física da paleta BIFF ou OOXML de 8 a 63 |
ARGB | A cor opaca normalizada armazenada na ranhura da paleta selecionada |
DistanceSquared | A distância euclidiana ao quadrado no espaço de cores OKLab |
ExactMatch | True quando a entrada selecionada tem os mesmos canais RGB que a entrada normalizada |
A função devolve false para uma entrada parcialmente transparente ou quando a cache da paleta não está disponível; em caso de falha, ColorIndex é inicializado com zero e PaletteSlot com -1
Contrato de correspondência
Cada livro de trabalho coloca em cache o ARGB normalizado e as coordenadas OKLab das suas 56 entradas físicas da paleta
Uma reposição da paleta reconstrói a cache completa e uma alteração efetiva de uma única ranhura atualiza apenas essa ranhura em cache
Cada consulta converte a entrada uma vez e efetua uma única análise fixa de 56 entradas, sem histórico de consultas nem crescimento ilimitado da cache
Distâncias iguais selecionam o menor índice público, incluindo cores duplicadas da paleta, pelo que os resultados permanecem determinísticos entre motores e execuções
Os tokens de cores automáticas, de sistema e inválidas não são candidatos; utilize ResolveIndexedColor para classificar esses valores
Exemplo
if Workbook.NearestIndexedColor($FF13579B, Match) then
begin
PaletteIndex := Match.ColorIndex;
if Match.ExactMatch then
UseExactPaletteColor(Match.ARGB);
end;