public static void ConvertImage(SimpleColor[,] imageSource, SimpleColor[,] imageDest, ColorProfile from, ColorProfile to) { var bradfordMatrix = MyMatrix.GenerateBradfordMatrix(from, to); Parallel.For(0, imageSource.GetLength(0), i => { for (int j = 0; j < imageSource.GetLength(1); j++) { DoubleColor color = new DoubleColor(imageSource[i, j]); var c1 = ConvertColorToXYZ(color, from); var c2 = ConvertColorFromXYZ(c1, to, bradfordMatrix); imageDest[i, j] = c2.ToSimpleColor(); } }); }
public static DoubleColor ConvertColorFromXYZ(DoubleColor color, ColorProfileEnum from, ColorProfileEnum to) { ColorProfile cp = null; switch (to) { case ColorProfileEnum.sRGB: { cp = ColorProfileFactory.GetFactory().sRBGcolorProfile; } break; case ColorProfileEnum.adobeRGB: { cp = ColorProfileFactory.GetFactory().adobeRBGcolorProfile; } break; case ColorProfileEnum.appleRGB: { cp = ColorProfileFactory.GetFactory().appleRBGcolorProfile; } break; case ColorProfileEnum.CIE_RGB: { cp = ColorProfileFactory.GetFactory().CIE_RBGcolorProfile; } break; case ColorProfileEnum.WideGamut: { cp = ColorProfileFactory.GetFactory().WideGamutcolorProfile; } break; case ColorProfileEnum.PAL: { cp = ColorProfileFactory.GetFactory().PALcolorProfile; } break; default: break; } //color.InverseGammaCorrection(cp.Gamma); MyMatrix bradford = MyMatrix.GenerateBradfordMatrix(from, to); if (bradford != null) { (color.R, color.G, color.B) = bradford.MultiplyByVectorRight(color.R, color.G, color.B); } var v = cp.XYZtoRGB.MultiplyByVectorRight(color.R, color.G, color.B); DoubleColor XYZ = new DoubleColor(v.X, v.Y, v.Z); XYZ.GammaCorrection(cp.Gamma); return(XYZ); //return new DoubleColor(-1, -1, -1); }