2012-05-29 3 views
0

색조에 따라 키 색상을 바꾸는 C# 코드가 있습니다. 내 로컬 컴퓨터에서 완벽하게 실행됩니다. 그러나 그것을 서버로 밀어 넣으면 모든 색이 아닌 "일부"가 대체됩니다. 마치 코드의 일부를 실행하지 않기로 결정한 것과 같습니다.코드가 로컬 대 서버에서 동일하게 실행되지 않습니다.

이미지는 무손실 PNG로 서버에는 손상되지 않습니다. 이 문제가 스레딩 문제입니까? 내 코드는 여기 (웹 서버가하는 것 이상으로) 스레드되지 않지만 비슷한 일이 생긴 사람은 누구입니까?

이 코드가 이고 별도의 라이브러리 프로젝트으로 컴파일 된 다음 MVC3 응용 프로그램에서 참조되는 경우에도 도움이 될 수 있습니다.

다음
private void _ReplaceImageColor(Image img, Color baseColor, Color newColor) 
{ 
    Bitmap bmp = (Bitmap)img; 
    double baseHue = baseColor.GetHue(); 
    for (int x = 0; x < bmp.Width; x++) 
    { 
     for (int y = 0; y < bmp.Height; y++) 
     { 
      double pixelHue, pixelSat, pixelVal; 
      ColorProcessor.ColorToHSV(bmp.GetPixel(x, y), out pixelHue, out pixelSat, out pixelVal); 
      if (pixelHue == baseHue) 
      { 
       Color setColor = ColorProcessor.ColorFromHSV(newColor.GetHue(), pixelSat, pixelVal); 
       bmp.SetPixel(x, y, setColor); 
      } 
     } 
    } 
} 

물었다 명 이후 ColorProcessor의 방법입니다 ... 당신은 매우 신중하게 DLL 참조가 있는지 확인 할 수 있습니다

public static void ColorToHSV(Color color, out double hue, out double saturation, out double value) 
{ 
    int max = Math.Max(color.R, Math.Max(color.G, color.B)); 
    int min = Math.Min(color.R, Math.Min(color.G, color.B)); 

    hue = color.GetHue(); 
    saturation = (max == 0) ? 0 : 1d - (1d * min/max); 
    value = max/255d; 
} 

public static Color ColorFromHSV(double hue, double saturation, double value) 
{ 
    int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
    double f = hue/60 - Math.Floor(hue/60); 

    value = value * 255; 
    int v = Convert.ToInt32(Math.Max(value, 0)); 
    int p = Convert.ToInt32(Math.Max(value * (1 - saturation), 0)); 
    int q = Convert.ToInt32(Math.Max(value * (1 - f * saturation), 0)); 
    int t = Convert.ToInt32(Math.Max(value * (1 - (1 - f) * saturation), 0)); 

    if (hi == 0) 
     return Color.FromArgb(255, v, t, p); 
    else if (hi == 1) 
     return Color.FromArgb(255, q, v, p); 
    else if (hi == 2) 
     return Color.FromArgb(255, p, v, t); 
    else if (hi == 3) 
     return Color.FromArgb(255, p, q, v); 
    else if (hi == 4) 
     return Color.FromArgb(255, t, p, v); 
    else 
     return Color.FromArgb(255, v, p, q); 
} 
+2

'ColorProcessor'란 무엇입니까? –

+0

먼저 조사를 좀 더해야합니다. 두 가지 모두에 사용할 데이터 테스트를 만들고 실패한 단일 데이터를 좁힐 수 있습니까? 그런 다음 코드에서 예외를 조사하십시오. –

+3

여기에 언급 할 가치가 있다고 생각합니다. MSDN의 'System.Drawing' 네임 스페이스에 대한 링크에서'주의 '상자를 읽으십시오. http://msdn.microsoft.com/en-us/library/xs6ftd89 – BeemerGuy

답변

1

:

감사합니다, 여기에 코드 샘플입니다 dev 컴퓨터에서와 같은 서버에서. Hanselman은 최근에 바로 그 기사를 가지고 있습니다 : Confirm Your Expectations and Version Numbers in Production Environments

또한 디버그 대 릴리즈 모드에서 다르게 행동하기 때문에 빌드에서 동일한 비트를 사용하여 그 잠재적 변형 (예 : x86)을 제거 할 수 있습니다 부동 소수점 숫자.

+0

버전은 모두 동일하게 보입니다. 그러나 이것은 릴리스 모드로 구축 할 때 로컬 컴퓨터에서 방금 발생했습니다 ... 그게 무슨 뜻입니까? – jocull

+0

Heisenbug처럼 들리지만 환경에 따라 다르게 동작합니다. 문제를 해결하기가 매우 어렵습니다. 잠재적 인 변형 (예 : x86)을 제거하려면 빌드에서 비트를 고정해야합니다. 또한 체크 아웃 : http://stackoverflow.com/questions/4787082/code-is-behaving-differently-in-release-vs-debug-mode – Turnkey

+0

지옥! 나는 네가 옳다고 확신한다. 이것은 복식 (HSV)을 다루고 있으며 나는 부동 소수점이 나에게 다가 갈 수 있다는 것을 알아야했다 ... 나는 그것을 조사 할 것이다. – jocull

관련 문제