Thread: [Lcms-user] Out-of-gamut colours?
An ICC-based CMM for color management
Brought to you by:
mm2
From: Alastair M. R. <bla...@fa...> - 2005-07-28 18:40:43
|
Hi, I now have a ColorSavvy CM2C colorimeter to play with. Using the SDK I've got the gadget reporting XYZ values for what's under its nose and it seems to be working OK. The first thing I'm going to try is a simple XYZ->CMYK transform using LCMS, which leads me to my question: What's the best way of determining whether a single colour value is out-of-gamut. The easiest way I can see is to create a "dummy" proofing transform, XYZ->CMYK proofed to RGB, and then to watch for the alarm colour in the output. Is there a more elegant way that I've missed? All the best, -- Alastair M. Robinson |
From: Marti <ma...@li...> - 2005-07-29 08:23:37
|
Hi, There is a special built-in profile called the null profile. This profile operates on gray scale and returns always zero. Since the gamut warning bypasses the output profile, you can use the null profile to do a quick gamut check: You will obtain 0 for in-gamut and 255 (or whatever gamut alarm you set) for out of gamut. Example: You want to check gamut colors on cmyk.icc, then: cmsSetAlarmCodes(255, 255, 255) // This would turn gray alarm code to 255 hNULL = cmsCreateNULLProfile(); cmsCreateProofingTransform(hXYZ, TYPE_XYZ_DBL, hNULL, TYPE_GRAY_8, hCMYK, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, (cmsFLAGS_GAMUTCHECK|cmsFLAGS_SOFTPROOFING)) Then, for checking a single color cmsCIEXYZ XYZ; BYTE gamut; ... put value to check into XYZ ... cmsDoTransform(xform, &XYZ, &gamut, 1); Additionaly, icctrans on 1.15 (on CVS) has that implemented. You can grab the beta sources here http://www.littlecms.com/lcms-1.15.tar.gz or the precompiled windows binary here: http://www.littlecms.com/icctrans.exe. Among CGATS support, it has this builtin accesible I:\>icctrans -i*Lab -o*null -t1 -m1 -g -p cmyk.icc little cms ColorSpace conversion calculator - v1.9 Enter values, 'q' to quit L*? 50 a*? -10 b*? 34 G=0.00 Enter values, 'q' to quit L*? 50 a*? -100 b*? 34 G=255.00 Hope this helps, -- Marti Maria The littlecms project. www.littlecms.com ----- Original Message ----- From: "Alastair M. Robinson" <bla...@fa...> To: <lcm...@li...> Sent: Thursday, July 28, 2005 8:40 PM Subject: [Lcms-user] Out-of-gamut colours? > Hi, > > I now have a ColorSavvy CM2C colorimeter to play with. Using the SDK > I've got the gadget reporting XYZ values for what's under its nose and > it seems to be working OK. > > The first thing I'm going to try is a simple XYZ->CMYK transform using > LCMS, which leads me to my question: > > What's the best way of determining whether a single colour value is > out-of-gamut. > > The easiest way I can see is to create a "dummy" proofing transform, > XYZ->CMYK proofed to RGB, and then to watch for the alarm colour in the > output. > > Is there a more elegant way that I've missed? > > All the best, > -- > Alastair M. Robinson -- No virus found in this outgoing message. Checked by AVG Anti-Virus. Version: 7.0.338 / Virus Database: 267.9.4/57 - Release Date: 22/07/2005 |
From: Alastair M. R. <bla...@fa...> - 2005-07-29 14:05:34
|
Hi Marti, Marti wrote: > There is a special built-in profile called the null profile. This > profile operates on gray scale and returns always zero. Since the gamut > warning bypasses the > output profile, you can use the null profile to do a quick gamut check: > You will > obtain 0 for in-gamut and 255 (or whatever gamut alarm you set) for out > of gamut. Many thanks - that's what I wanted :) All the best, -- Alastair M. Robinson |
From: Casper B. <cb...@bo...> - 2005-07-29 09:08:34
|
Hi I have now made a widget that lets the user specify a spline curve for transforming lightness. like an advanced brightness/contrast dialog. Now I wonder how I can make an abstract profile just like the one created by cmsCreateBCHSWabstractProfile, but taking my spline curve as input. I was looking at the cmsAllocGamma with a lot of entries in the table, but I don't know if this is the right way to go? best regards / venlig hilsen Casper Boemann |
From: Marti <ma...@li...> - 2005-07-29 09:35:22
|
Hi Casper, There is a function that does exactly what you want: cmsHPROFILE cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorS= pace, LPGAMMATABLE Tran= sferFunctions[]) You have to allocate 3 gamma tables. They should have same number of entr= ies. LPGAMMATABLE TransferFunctions[3]; TransferFunction[0] =3D cmsBuildGamma(256, 1.0); TransferFunction[1] =3D cmsBuildGamma(256, 1.0); TransferFunction[2] =3D cmsBuildGamma(256, 1.0); I'm using cmsBuildGamma() because it initializes the contents of the tabl= e. You could use cmsAllocGamma() but this returns garbage inside tables, as you are su= pposed to fill the required values. After that, you can modify the L* curve. It would be the first one in La= b space: TransferFunctions[0]. Just make sure you normalize values in range 0..0x= FFFF, so first entry should be zero and last entry 0xFFFF. This assures black i= s mapped on black and white on white. Then pass those curves to the function, marking the profile as operating = in Lab space. hProfile =3D cmsCreateLinearizationDeviceLink(icSigLabData, TransferFunct= ions); Voil=E0, all done. The profile is not marked as "abstract" but as "device= link". If you want this detail covered, you can mark the profile as abstract by using cmsSetDeviceClass(hProfile, icSigAbstractClass); Anyway, that latter is not required at all. Regards, -- Marti Maria The littlecms project. www.littlecms.com ----- Original Message -----=20 From: "Casper Boemann" <cb...@bo...> To: <lcm...@li...> Sent: Friday, July 29, 2005 11:07 AM Subject: [Lcms-user] writing an advanced brightness/contrast abstract pro= file > Hi > > I have now made a widget that lets the user specify a spline curve for > transforming lightness. like an advanced brightness/contrast dialog. > > Now I wonder how I can make an abstract profile just like the one crea= ted > by cmsCreateBCHSWabstractProfile, but taking my spline curve as input. > > I was looking at the cmsAllocGamma with a lot of entries in the table, = but I > don't know if this is the right way to go? > > best regards / venlig hilsen > Casper Boemann > > > > > ------------------------------------------------------- > SF.Net email is Sponsored by the Better Software Conference & EXPO Sept= ember > 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices > Agile & Plan-Driven Development * Managing Projects & Teams * Testing &= QA > Security * Process Improvement & Measurement * http://www.sqe.com/bsce5= sf > _______________________________________________ > Lcms-user mailing list > Lcm...@li... > https://lists.sourceforge.net/lists/listinfo/lcms-user > > > > --=20 > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.338 / Virus Database: 267.9.4/57 - Release Date: 22/07/200= 5 > >=20 --=20 No virus found in this outgoing message. Checked by AVG Anti-Virus. Version: 7.0.338 / Virus Database: 267.9.4/57 - Release Date: 22/07/2005 |
From: Casper B. <cb...@bo...> - 2005-08-02 13:37:43
|
On Friday 29 July 2005 11:34, Marti wrote: > Hi Casper, > > There is a function that does exactly what you want: Thanks it works. -- best regards / venlig hilsen Casper Boemann |