Pergunta

Alguém conhece uma maneira de obter HSL de uma cor RGB linear (não de uma cor sRGB)?Já vi muitas conversões sRGB<->HSL, mas nada para linearRGB<->HSL.Não tenho certeza se é fundamentalmente a mesma conversão com pequenos ajustes, mas agradeceria qualquer visão que alguém possa ter sobre isso.

RGB linear não é o mesmo que linearizar sRGB (que é pegar [0,255] e torná-lo [0,1]).A transformação RGB linear de/para sRGB está em http://en.wikipedia.org/wiki/SRGB.No VBA, isso seria expresso (considerando valores sRGB linearizados [0,1]):

Public Function sRGB_to_linearRGB(value As Double)
   If value < 0# Then
      sRGB_to_linearRGB = 0#
      Exit Function
   End If
   If value <= 0.04045 Then
      sRGB_to_linearRGB = value / 12.92
      Exit Function
   End If
   If value <= 1# Then
      sRGB_to_linearRGB = ((value + 0.055) / 1.055) ^ 2.4
      Exit Function
   End If
   sRGB_to_linearRGB = 1#
End Function

Public Function linearRGB_to_sRGB(value As Double)
   If value < 0# Then
      linearRGB_to_sRGB = 0#
      Exit Function
   End If
   If value <= 0.0031308 Then
      linearRGB_to_sRGB = value * 12.92
      Exit Function
   End If
   If value < 1# Then
      linearRGB_to_sRGB = 1.055 * (value ^ (1# / 2.4)) - 0.055
      Exit Function
   End If
   linearRGB_to_sRGB = 1#
End Function

Tentei enviar valores RGB lineares para rotinas RGB_to_HSL padrão e voltar de HSL_to_RGB, mas não funcionou.Talvez porque os algoritmos HSL<->RGB atuais sejam responsáveis ​​pela correção de gama e o Linear RGB não seja corrigido por gama - não sei exatamente.Não vi quase nenhuma referência de que isso possa ser feito, exceto duas:

  1. Uma referência sobrehttp://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9(item numerado 10).
  2. Uma referência em um projeto de código aberto grafx2 @http://code.google.com/p/grafx2/issues/detail?id=63#c22em que o colaborador afirma que ele fez a conversão linear RGB <-> HSL e fornece algum código C em um anexo ao seu comentário em um arquivo .diff (que eu realmente não consigo ler :()

Minha intenção é:

  1. enviar de sRGB (por exemplo,FF99FF (R=255, G=153, B=255)) para RGB linear (R=1.0, G=0.318546778125092, B=1.0)
    • Usando o código acima (por exemplo, o G = 153 seria obtido no RGB linear de sRGB_to_linearRGB(153 / 255))
  2. para HSL
  3. modificar/modular a saturação em 350%
  4. Envie de volta de hsl-> linear rgb-> srgb, o resultado seriaFF19FF (R=255, G=25, B=255).

Usando funções disponíveis no .NET, como .getHue a partir de um System.Drawing.Color não funciona em nenhum espaço sRGB acima de 100% de modulação de qualquer valor HSL, daí a necessidade de enviar RGB Linear em vez de sRGB.

Foi útil?

Solução

Não faz muito sentido converter para RGB linear, já que o HSL é definido em termos de valores codificados em gama.Em vez disso, escreva sua própria função para converter sRGB em HSL, modele a saturação com esses valores (permitindo valores de saturação potencialmente fora da gama) e, em seguida, converta novamente para sRGB, fixando intensidades que estão fora da faixa sRGB (ou proibindo alterações de saturação que não pode ser codificado em sRGB).

Outras dicas

O Sistema.Windows.Media.Color class permite obter ou definir scRGB por meio das propriedades ScA, ScR, ScG, ScB ou RGB por meio das propriedades A, R, G, B.

Assim, você poderia converter RGB em HSL, manipulá-lo, depois converter novamente para RGB e armazenar em uma instância Color.Você pode então ler as propriedades scRGB convertidas.

Não é o ideal e pode envolver alguma perda de informações.Mas é uma opção!

Com base no seu comentário aqui, seu problema não é fazer a conversão incorretamente;é que você está realizando conversões sucessivas em valores quantizados.Em outras palavras, você está pegando o resultado de sRGB=>RGB=>HSL=>HSL=>RGB=>sRGB e usando-o em operações de cores subsequentes.A maneira mais direta de manter a precisão é sempre manter o valor RGB original e acumular as alterações no espaço HSL que você deseja aplicar.Dessa forma, você estará sempre aplicando as operações espaciais HSL à cor original e não precisará se preocupar em processar repetidamente valores quantizados.

Faz esse ajuda?Há muitos links interessantes nessa questão, talvez algo que funcione no seu caso também...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top