문제

SRGB 색상이 아닌 LinearRGB 색상에서 HSL을 얻는 방법을 아는 사람이 있습니까? 나는 많은 srgb <-> hsl 변환을 보았지만 linearrgb <-> hsl에는 아무것도 없었습니다. 그것이 자금이 조정되는 것과 동일한 전환인지 확실하지 않지만 누군가가 이것에 대한 통찰력에 감사드립니다.

선형 RGB는 선형화 SRGB ([0,255]를 취하고 [0,1])와 동일하지 않습니다. /SRGB에서 선형 RGB 변환이 있습니다 http://en.wikipedia.org/wiki/srgb. VBA에서 이것은 표현 될 것입니다 (선형화 된 SRGB 값 [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

표준 RGB_TO_HSL 루틴으로 선형 RGB 값을 보내려고 시도했지만 HSL_TO_RGB에서 다시 나와서 작동하지 않았습니다. 아마도 현재 HSL <-> RGB 알고리즘이 감마 보정을 설명하고 선형 RGB가 감마가 수정되지 않았기 때문에 정확히 모르겠습니다. 나는 이것이 두 가지를 제외하고는 할 수 있다는 언급을 거의 보지 못했다 :

  1. 참조http://en.wikipedia.org/wiki/hsl_and_hsv#cite_note-9(번호가 매겨진 항목 10).
  2. 오픈 소스 프로젝트 grafx2 @에 대한 참조http://code.google.com/p/grafx2/issues/detail?id=63#c22기고자는 자신이 선형 RGB <-> HSL 변환을 수행했다고 말하고 .diff 파일의 댓글에 첨부 파일에 C 코드를 제공합니다 (실제로 읽을 수 없습니다 :()

내 의도는 다음과 같습니다.

  1. SRGB에서 보내기 (예 :FF99FF (R=255, G=153, B=255))) 선형 RGB (R=1.0, G=0.318546778125092, B=1.0)
    • 위의 코드를 사용하여 (예 : g = 153은 선형 RGB에서 얻을 수 있습니다. sRGB_to_linearRGB(153 / 255))
  2. HSL에
  3. 포화를 350% 수정/변조
  4. hsl-> linear rgb-> srgb에서 다시 보내십시오. 결과는 다음과 같습니다.FF19FF (R=255, G=25, B=255).

.NET에서 사용 가능한 기능을 사용합니다 .getHue a System.Drawing.Color HSL 값의 100% 변조 이상의 SRGB 공간에서는 작동하지 않으므로 SRGB 대신 선형 RGB가 전송되어야합니다.

도움이 되었습니까?

해결책

HSL은 감마 인코딩 된 값으로 정의되기 때문에 선형 RGB로 변환하는 것은 의미가 없습니다. 대신, 자신의 함수를 작성하여 SRGB를 HSL로 변환하고 해당 값으로 포화를 변형 한 다음 (잠재적으로 Gamut 외부 포화 값을 허용) SRGB로 다시 변환합니다. SRGB에서 인코딩 할 수 없습니다).

다른 팁

그만큼 System.Windows.Media.Color 클래스를 사용하면 A, R, G, B 속성을 통해 SCA, SCR, SCG, SCB 특성 또는 RGB를 통해 SCRGB를 얻거나 설정할 수 있습니다.

따라서 RGB를 HSL로 변환하여 조작 한 다음 RGB로 다시 변환하고 색상 인스턴스에 저장할 수 있습니다. 그런 다음 변환 된 SCRGB 속성을 읽을 수 있습니다.

이상적이지 않으며 정보 손실이 포함될 수 있습니다. 그러나 그것은 옵션입니다!

귀하의 의견을 바탕으로 여기, 귀하의 문제는 변환을 잘못 수행하지 않습니다. 양자화 된 값에 대한 연속적인 변환을 수행하고 있습니다. 다시 말해, srgb => rgb => hsl => hsl => rgb => srgb의 결과를 취하고 후속 색상 작업에서 사용합니다. 정밀도를 유지하는 가장 간단한 방법은 항상 원래 RGB 값을 유지하고 적용하려는 HSL 공간의 변화를 축적하는 것입니다. 이렇게하면 항상 HSL 공간 작업을 원래 색상에 적용하고 양자화 된 값을 반복적으로 처리하는 것에 대해 걱정할 필요가 없습니다.

하다 이것 돕다? 그 질문에는 많은 흥미로운 링크가 있습니다. 아마도 당신의 경우에도 작동하는 것도 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top