2011-07-04 4 views
2

QT에서 일부 GDI + 기능을 구현해야합니다 (특히 LinearGradientBrush). 문제가있는 유일한 방법은 SetGammaCorrection입니다. MSDN에는 GDI + 감마 보정 알고리즘에 대한 철저한 설명이 있지만 그 항목을 찾을 수 없다는 주제를 발견했습니다.QT에서 GDI + 감마 보정 시뮬레이션

1)는 2 색 보간 간단한 LinearGradientBrush가 있다고 가정

I는 다음과 같이 감마 보정을 시뮬레이션하는 것을 시도했다. 이 두 색상 사이의 간격을 각 점 사이의 거리가 같은 사전 정의 된 수 (100)로 나눕니다.

2) 각 지점에 값을 지정하십시오.

current_color = start_color * (1 - current_point_value) + end_color * current_point_value; 

가 : 0.01, ..., 마지막 점 1.

3의 값을 갖는 것)의 각 점에서의 보간 된 컬러 값을 계산 - 첫 번째 포인트는 제 0의 값을 가질 것이다 시작 색상과 종료 색상은 명확하지 않은 경우 그래디언트 경계 색상입니다.

4) 개의 색의 경계를 제외한 각각의 계산 된 컬러 값 (실제의 감마 보정을 수행) : 감마

gamma_corrected_color_value = color_value^(1/gamma); 

값은 2.2이다.

QLinearGradient를 가져 와서 계산 된 색상 및 위치 (포인트 값)로 그라디언트 스톱의 배열을 만들고 그 스톱을 그라디언트에 할당하고 마지막으로이 그라디언트로 QBrush를 만듭니다.

이제이 브러시로 직사각형을 채우면 실제 GDI + LinearGradientBrush의 결과에 매우 가깝지 만 결과는 동일하지 않습니다. 감마 값과 세그먼트 수의 다른 조합을 시도했지만 거의 동일한 그래디언트를 얻을 수 없었습니다.

GDI +에서 감마 보정을 구현하는 방법이나 QT에서 시뮬레이트하는 방법을 아는 사람이 있습니까?

고마워, 토니.

+0

결과가 얼마나 떨어져 있었습니까? 마이크로 소프트는 sRGB의 창시자 중 하나입니다. 아마도 그들은 직선적 인 감마 함수 대신 그 공식을 사용했을 것입니다. –

답변

0

Qt 그래디언트는 선형이며, 감마는 비선형입니다. 감마가 변경 될 때마다 그래디언트를 다시 생성해야하는 것처럼 보입니다. 감마가 그래디언트의 매개 변수가되는 것과 반대입니다.

+0

예, 이것이 작동하는 방식입니다. 그러나 그래디언트 생성 프로세스에는 아무런 문제가 없습니다. 문제는 나에서 사용하는 감마 보정 알고리즘이 실제 GDI + LinearGradientBrush와 약간 다른 결과를 생성한다는 것입니다. 그 결과의 최대 유사성을 얻고 싶습니다. – Tony