0

色相に基づいてキーカラーの置換を行うC#コードがいくつかあります。私のローカルマシンでは、完全に実行されています。ただし、サーバーにプッシュすると、すべての色ではなく「一部」が置き換えられます。これは、コードの一部を実行しないことを決定しているようなものです。

画像はロスレスPNGであり、サーバー上ではそのままです。これはある種のスレッドの問題ですか?私のコードはここではスレッド化されていませんが(Webサーバーの機能を超えて)、誰かが同様のことが起こるのを見たことがありますか?

このコードが別のライブラリプロジェクトでコンパイルされ、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参照が同じであることを注意深く確認することをお勧めします。ハンゼルマンは最近、まさにそのことについての記事を持っていました:本番環境での期待とバージョン番号を確認してください

また、デバッグモードとリリースモードでは動作が異なるため、ビルドで同じビット数を使用していることを確認して、浮動小数点数に現れる可能性のある潜在的な変動(x86など)を排除します。

于 2012-05-29T22:47:27.660 に答える