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自人们问起的方法...

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);
}
4

1 回答 1

1

您可能需要非常仔细地检查您的 dll 引用在服务器上与在开发机器上是否相同。Hanselman 最近有一篇关于这件事的文章:在生产环境中确认您的期望和版本号

此外,由于它在调试与发布模式下的行为不同,请检查它是否在构建中使用相同的位数以消除可能在浮点数上表现出来的潜在变化(例如 x86)。

于 2012-05-29T22:47:27.660 回答