24h購物| | PChome| 登入
2011-01-07 13:59:38| 人氣3,172| 回應0 | 上一篇 | 下一篇

[C#] Lab to RGB

推薦 0 收藏 0 轉貼0 訂閱站台

程式碼如下:

//        RGB2Lab : sRGB system, D50
//        作者: Chris C.S Huang
//        程試語言: VC# 2008 Expression Edition

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ColorSpaceDLL
{
     unsafe public class ColorSpace
    {       
         public Boolean Lab2RGB(double L, double a, double b, double* R, double* G, double* B)
        {
            double X, Y, Z;
       
            Lab2XYZ(L, a, b, &X, &Y, &Z);
        
             XYZ2RGB(X, Y, Z, R, G, B);
          
             if (*R <= 255.0 && *R >= 0.0 && *G <= 255.0 && *G >= 0.0 && *B <= 255.0 && *B >= 0.0)
             {
                 return true;
             }
             else
             {
                 return false;
             }
        }

        private void Lab2XYZ(double L, double a, double b, double* X, double* Y, double* Z)
        {
            double k = 903.3; double e = 0.008856;
            double fx, fy, fz;
            double xr, yr, zr;
            double Xr = 0.96422; double Yr = 1.00000; double Zr = 0.82521;
            fy = (L + 16.0) / 116.0;
            fx = a / 500.0 + fy;
            fz = fy - b / 200.0;

            if (Math.Pow(fx, 3) > e)
                xr = Math.Pow(fx, 3);
            else
                xr = (fx * 116.0 - 16.0) / k;
            if (L > k * e)
                yr = Math.Pow((L + 16.0) / 116.0, 3);
            else
                yr = L / k;
            if (Math.Pow(fz, 3) > e)
                zr = Math.Pow(fz, 3);
            else
                zr = (fz * 116.0 - 16.0) / k;

            *X = xr * Xr;
            *Y = yr * Yr;
            *Z = zr * Zr;
        }

        private void XYZ2RGB(double X, double Y, double Z, double* R, double* G, double* B)
        {
            double r, g, b;
            r = 3.133856 * X - 1.61687 * Y - 0.49061 * Z;
            g = (-0.97877) * X + 1.916142 * Y + 0.033454 * Z;
            b = 0.071945 * X -0.22899 * Y + 1.405243 * Z;
            (*R) = (gamma(r) * 255.0);
            (*G) = (gamma(g) * 255.0);
            (*B) = (gamma(b) * 255.0);
        }

        private double gamma(double r)    //sRGB
        {
            double R;
            if (r <= 0.0031308)
                R = 12.92 * r;
            else
                R = Math.Pow(r, 1.0 / 2.4) * 1.055 - 0.055;
            return R;
        }

    }
}

參考資料:

http://www.brucelindbloom.com

台長: Chris C.S Huang
人氣(3,172) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 色彩轉換 |
此分類上一篇:[C#] RGB to Lab色彩轉換工具

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文