2011-08-06 7 views
3

트랙 바를 슬라이드 할 때 이미지의 색조를 부드럽게 변경하는 더 좋은 방법이 있습니까? 내가하고있는 일은 픽셀 당 RGB 값을 얻고 채도와 밝기를 계산 한 다음 값을 넣는 것입니다. 이미지의 크기는 색조가 업데이트되는 속도에 영향을줍니다. Photoshop의 이미지 색상 기능은 색상을 0에서 360으로 부드럽게 변경합니다. 이는 내가 시도하고 싶은 부분입니다. 당신은 조회 테이블을 사용하여 시도 할 수이미지 색조를 빠르게 변경하는 방법은 무엇입니까?

data = editImage.LockBits(new Rectangle(0, 0, editWidth, editHeight), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
byte* dataPtr = (byte*)data.Scan0; 
h = trackBar1.Value/60.0; 
D = 1 - Math.Abs((h % 2) - 1); 

if (h >= 0 && h < 1) 
{ 
    for (int i = 0; i < editHeight; i++) 
    { 
     offsetStride = i * data.Stride; 
     for (int j = 0; j < editWidth; j++) 
     { 
      blue = dataPtr[(j * 3) + offsetStride]; 
      green = dataPtr[(j * 3) + offsetStride + 1]; 
      red = dataPtr[(j * 3) + offsetStride + 2]; 

      if (green > blue) max = green; 
      else max = blue; 
      if (red > max) max = red; 

      if (green < blue) min = green; 
      else min = blue; 
      if (red < min) min = red; 

      s = (max == 0) ? 0 : 1d - (1d * min/max); 
      v = max/255d; 

      C = v * s; 
      X = C * D; 
      E = v - C; 

      dataPtr[(j * 3) + offsetStride] = (byte)(min); 
      dataPtr[(j * 3) + offsetStride + 1] = (byte)((X + E) * 255); 
      dataPtr[(j * 3) + offsetStride + 2] = (byte)(max); 
     } 
    } 
} 

답변

4

색조를 변경하는 흑백 이미지를 원하면 가장 효율적인 방법은 빨강, 노랑, 초록, 파랑, 파랑 및 자홍색 이미지를 생성하고 필요에 따라 이들 사이를 보간하는 것입니다.

따라서 10 % 회전시 이미지를 생성하려면 50/60 * 빨간색 + 10/60 * 노란색을 추가하여 표시하십시오.

실제로 6 개의 이미지를 모두 생성 할 필요는 없습니다. 빨간색과 노란색 이미지를 생성하는 것으로 충분할 것입니다. 예를 들어, 파란색 이미지는 빨간색 이미지이지만 빨간색과 파란색 픽셀은 서로 바뀌었기 때문에 (그리고 빨간색에서 노란색을 파생시킬 수도 있음) 작동 중에 생성 할 수있는 다른 것들. 그러나 6 개의 이미지로 시작한 다음 나중에 최적화를 추가하는 것이 가장 간단합니다.

초기 색칠 된 이미지 중 하나를 생성하는 코드는 위에서 보았던 것과 비슷하지만 HSV에서 RGB까지의 마지막 단계는 조금 의심스러워 보입니다. 위키피디아 페이지는 C#이이 변환을 수행하는 라이브러리 함수를 포함 할 수 있습니다.) 당신은 픽셀로 색상, 픽셀을 이동하려면

는 저장 것 (그린이 시안으로 이동 정도로 붉은 색은 노란색으로 이동)

[당신의 설명을 감안할 때, 아래 당신이 무엇을하고 있는지와 관련이 없습니다] 먼저 전체 이미지를 HSV로 변환 한 다음 그로부터 작업하십시오.

여러 이미지 (색상이 10 도씩 회전)를 생성하고 그 사이를 보간하면 더 많은 시간을 절약 할 수 있습니다. 그러나 단색의 경우보다 복잡합니다. 일부 픽셀 (색조가 보간 중에 60도 배수로 움직이는 픽셀)에는 특별한 처리가 필요하기 때문입니다. 따라서 당신은 또한 그것들을 사전에 탐지하고 그것들을 즉시 계산할 필요가 있습니다. 중간 이미지가 많을수록 특수한 경우에 필요한 픽셀이 적어집니다. 그리고 실제로는 별도의 이미지를 게으른 (요청시) 생성하는 것이 일반적으로 사람들이 단지 작은 변화를 만들기 때문에 빠른 시작을 제공 할 것입니다.

+0

전체 이미지의 색조를 변경하고 싶습니다.따라서 RGB 이미지가 있고 색조를 60으로 변경하면 이미지가 그 위에 노란색 필터가있는 회색 음영 이미지처럼 보입니다. – Jack

+0

나는 방금 오류가 있었고 위의 텍스트를 업데이트했다는 것을 깨달았습니다. 당신은 3 개가 아니라 6 개의 이미지가 필요합니다. –

2

는 분 이후의 '의 계산을 제거하고 최대에만 그래서 당신은 s = getS(min, max)이있을 것이다 0에서 255까지 다양합니다. C와 E의 값은 아마도이 표에서 유지 될 수도 있습니다 (그러나 늦었고 그렇게 열심히 보지 않았습니다).

for (int min = 0; min < 255; min++) 
{ 
    for (int max = 0; max < 255; max++) 
    { 
     tableS[min, max] = (max == 0) ? 0 : 1d - (1d * min/max); 
    } 
} 

포토샵의 코드와 같은 테이블 미리 계산 될 가져옵니다의 각 요소는 아마도 최고의 성능을 얻기 위해 너무 어셈블러로 작성되었습니다.

많은 효과가 있는지 보려면 모든 색조 계산 코드를 주석 처리하고 가짜 데이터를 복사하여 어떻게 수행하는지보십시오. 포토샵만큼이나 기발하다면 이러한 계산이 병목 현상이라는 것을 알 수 있습니다.

+0

s 및 v d의 값을 미리 계산하면 조금 더 빨라지는 것 같습니다. 나는 C를 사전 계산하는 것이 가능하다고 생각하지 않는다. – Jack

관련 문제