function [rgb,M] = XYZToSRGBPrimary(XYZ) % [rgb,M] = XYZToSRGBPrimary(XYZ) % % Convert between CIE XYZ to sRGB primary % coordinates. These are linear device % coordinates for the primaries of the sRGB % standard. If your input is scaled in the % gamut of the monitor, the numbers will come % out in the range 0-1. You may want to scale % the result into the range 0-1 before applying % sRGB gamma correction. % % Originally implemented from conversion matrix as specified at: % http://www.srgb.com/basicsofsrgb.htm % It turns out this was the draft standard. The site above is gone % You can still find the draft standard at: % http://www.colour.org/tc8-05/Docs/colorspace/61966-2-1.pdf % % I can't find the official technical standard on the web, but % there is pretty good agreement across web sources. Wikipedia % seems fine, as does. % http://www.w3.org/Graphics/Color/sRGB % % 5/1/04 dhb Wrote it. % 7/8/10 dhb Updated to match standard I can now find on the web. % Define the transformation matrix. Now matching what's at w3.org. The % old matrix is commented out in the second line. M = [3.2410 -1.5374 -0.4986 ; -0.9692 1.8760 0.0416 ; 0.0556 -0.2040 1.0570]; %M = [3.2406 -1.5372 -0.4986 ; -0.9689 1.8758 0.0415 ; 0.0557 -0.2040 1.0570]; % Do the transform if (~isempty(XYZ)) rgb = M*XYZ; else rgb = []; end