O que é Radiance HDR?
Radiance HDR é um formato de imagem de alto alcance dinâmico desenvolvido para o sistema de renderização Radiance e normalmente identificado pela extensão HDR. Sua codificação comum de pixels RGBE representa cada pixel com três bytes de cor e um byte de expoente compartilhado.
Como o Radiance HDR funciona
Uma imagem Radiance tem três partes: um cabeçalho de informações em texto, uma string de resolução e registros de linhas de varredura. O cabeçalho normalmente começa com #?RADIANCE (stb_image e ImageMagick também aceitam #?RGBE), contém atribuições de variáveis como FORMAT (32-bit_rle_rgbe ou 32-bit_rle_xyze), EXPOSURE, COLORCORR e PRIMARIES, e termina com uma linha vazia. A string de resolução, por exemplo -Y 1024 +X 2048, fornece as quantidades de pixels e a ordem em que eles foram gravados. Cada pixel ocupa quatro bytes: uma mantissa de 8 bits para cada uma das três cores primárias e um expoente comum de 8 bits. Um byte de mantissa é uma fração de 256, não um valor inteiro: o código de referência do Radiance decodifica um canal como (mantissa + 0,5) / 256 × 2^(expoente − 128), e um byte de expoente igual a 0 significa preto, então os bytes (128, 64, 32, 129) armazenam aproximadamente (1; 0,5; 0,25). As linhas de varredura são armazenadas sem compressão ou com um de dois esquemas de codificação por comprimento de sequência; a referência do Radiance indica uma compressão típica de cerca de 2:1. Os valores são lineares e podem ter significado físico: para dados RGB, um pixel de (1, 1, 1) corresponde a 1 watt por esterradiano por metro quadrado ao longo do espectro visível, mas a referência do Radiance diz que os valores não são fisicamente válidos se as fontes de luz não tiverem sido modeladas corretamente, se a imagem tiver sido convertida de outro formato ou se tiver sido aplicada uma filtragem personalizada. A própria documentação do Radiance usa o sufixo .pic; .hdr é o mais comum em outros contextos.
Informações essenciais
- RGBE atribui a cada pixel uma mantissa de 8 bits por canal e um único expoente compartilhado, não três números de ponto flutuante. Em um pixel que não seja preto, o byte de mantissa do canal mais brilhante fica entre 128 e 255, e os outros dois são escalados pelo mesmo expoente, então um canal muito menos brilhante que o mais brilhante preserva poucos bits significativos. O autor do formato estima uma precisão de cerca de 1% ao longo de mais de 76 ordens de grandeza e observa que os intervalos entre valores podem se tornar visíveis em regiões de azul e magenta saturados.
- A string de resolução informa a ordem de varredura, além do tamanho.
-Y N +X Mé a forma padrão: N linhas armazenadas de cima para baixo, cada uma com M pixels da esquerda para a direita. Sete outras combinações de sinais e eixos descrevem armazenamento espelhado ou rotacionado, e, quando X vem primeiro, o primeiro número é a largura, não a altura. Um decodificador que extrai apenas dois números transpõe ou espelha esses arquivos; a referência do Radiance observa que alguns programas lidam apenas com a ordenação padrão. - Todos os quatro bytes são usados pelas três mantissas e pelo expoente, então não há canal alfa nem sinal. A transparência precisa ser transportada em um arquivo separado ou em outro formato, e RGBE não pode armazenar componentes negativos, o que o limita às cores dentro da gama de suas primárias RGB. A variante XYZE, declarada por
FORMAT=32-bit_rle_xyze, cobre a gama visível, mas um leitor precisa verificar a linhaFORMATpara distinguir as duas, então confirme o suporte a XYZE antes de depender dele. - As variáveis do cabeçalho mudam o significado dos números.
EXPOSUREé um multiplicador já aplicado aos pixels e é cumulativo, então a radiância original é o valor armazenado dividido pelo produto de todas as linhasEXPOSURE.COLORCORRé o mesmo tipo de multiplicador aplicado e cumulativo, fornecido separadamente para cada cor primária, então cada canal também deve ser dividido pelo seu produto deCOLORCORR.PRIMARIESfornece as cromaticidades; quando está ausente, aplicam-se os padrões do Radiance, cujo ponto de branco é equienergético (0,333; 0,333), não D65. Alguns leitores não usam essas informações: a documentação do OpenImageIO diz que ele presume que todo arquivo RGBE seja linear com primárias sRGB.
Quando o Radiance HDR é relevante
Use Radiance HDR quando um renderizador ou uma ferramenta de iluminação espera uma entrada .hdr, geralmente para mapas de ambiente e iluminação baseada em imagem que precisam de valores lineares muito além do branco da tela. A documentação do OpenImageIO afirma que o formato ainda é usado em muitas aplicações legadas e para distribuir mapas de ambiente HDR, mas recomenda formatos mais recentes, como OpenEXR, exceto quando é necessário acessar arquivos legados. Ao converter, verifique se o destino respeita a exposição, a correção de cor, as cores primárias e a orientação do cabeçalho; uma saída de 8 bits não consegue manter o alcance adicional.
Como a Transloadit ajuda com Radiance HDR
A tabela de formatos de imagem da Transloadit lista HDR, descrito como o formato de imagem Radiance RGBE, como um formato que seus Robots baseados no ImageMagick, incluindo /image/resize, podem ler e gravar.
A tabela informa apenas a capacidade de leitura e gravação; ela não descreve como os valores de alto alcance dinâmico são mapeados quando a saída é um formato de 8 bits, como JPEG ou PNG, então verifique o brilho e a cor em um arquivo representativo.
Explore os formatos de arquivo e os recursos de compressão da Transloadit
Fontes
- Formatos de arquivo Radiance (Greg Ward Larson): formato de arquivo de imagem, variáveis do cabeçalho, string de resolução, registros de linhas de varredura
- Greg Ward: codificações de imagem de alto alcance dinâmico (seção sobre codificação RGBE do Radiance)
- O formato de arquivo de imagem RADIANCE (nota de referência com código de exemplo para codificação e decodificação de pixels)
- Plugins de formato incluídos no OpenImageIO: HDR/RGBE
- Problema #1323 do stb: solicitação de suporte a XYZE em Radiance .hdr