Diary of Sacred Fox - October 28, 2005

The Quintetには通算 179068 人(今日:0, 昨日:0)のお客様が来場しています

2005/10/28

ソースコード晒し

これだけ作り終えるのにむちゃくちゃ時間を食った
おまけに数式は画像資料少なすぎ & 説明なさすぎ & 数式内に5であるべき数字が1になっているところがあった誤植はやめてくれ
何をやっているかは推して知るべし

private static double[] getLUV(Color c) {
    const double Xr = 0.950456;
    const double Yr = 1.00;
    const double Zr = 1.088754;
    const double udr = 4.0 * Xr / (Xr + 15.0 * Yr + 3.0 * Zr);
    const double vdr = 9.0 * Yr / (Xr + 15.0 * Yr + 3.0 * Zr);
    double X = 0.412453 * c.R / 255.0 + 0.35758 * c.G / 255.0 + 0.180423 * c.B / 255.0;
    double Y = 0.212671 * c.R / 255.0 + 0.71516 * c.G / 255.0 + 0.072169 * c.B / 255.0;
    double Z = 0.019334 * c.R / 255.0 + 0.119193 * c.G / 255.0 + 0.950227 * c.B / 255.0;
    double yr = Y / Yr;
    double L = yr > 0.00856 ? 116.0 * Math.Pow(yr, 1.0 / 3.0) - 16.0 : 903.3 * yr;
    double D = 1.0 / (X + 15.0 * Y + 3.0 * Z);
    double ud = 4.0 * X * D;
    double vd = 9.0 * Y * D;
    double u = 13.0 * L * (ud - udr);
    double v = 13.0 * L * (vd - vdr);
    return new double[] {L, u, v};
}
private static Color getRGB(double L, double u, double v) {
    const double Xr = 0.950456;
    const double Yr = 1.00;
    const double Zr = 1.088754;
    const double udr = 4.0 * Xr / (Xr + 15.0 * Yr + 3.0 * Zr);
    const double vdr = 9.0 * Yr / (Xr + 15.0 * Yr + 3.0 * Zr);
    if (L == 0.0)
        return Color.Black;
    double Y = L > 903.3 * 0.00856 ? Math.Pow((L + 16.0) / 116.0, 3.0) : L / 903.3;
    double L13 = 13.0 * L;
    double U = 3.0 * (L13 * udr + u);
    double V = 1.0 / (4.0 * (L13 * vdr + v));
    double X = 3.0 * U * Y * V;
    double Z = ((12.0 * L13 - U) * V - 5.0) * Y;
    double R = 3.240479 * X - 1.53715 * Y - 0.498535 * Z;
    double G = -0.969256 * X + 1.875991 * Y + 0.041556 * Z;
    double B = 0.055648 * X - 0.204043 * Y + 1.057311 * Z;
    return Color.FromArgb((int) (R * 255), (int) (G * 255), (int) (B * 255));
}

元の式は多少違うけど, ECCのMathematicaに食わせたら多少簡単になったのでそっちを採用, 導出過程はわかりやすかったんだけど, そこに誤植があるんじゃぁねぇ…

Comments (0):