From: Ignacio Ruiz-de-C. <ign...@si...> - 2009-04-18 02:52:38
|
Hi, list: I am building profiles with very customized features, not related to any media. One of those, for instance, would allow me to map values of an sRGB image to specific cmyk combinations. To implement that, I started with the "makecmy.c" sample, available in lcms 1.18, and - modified the colospace of the profile (now, CMYK) cmsSetColorSpace(hProfile, icSigCmykData); - made LUT sizes smaller (I am quantizing the space, after all, no need for accuracy) and changed 3 dimensions to 4 in linearization curves LPGAMMATABLE PreLinear[3]; cmsAlloc3DGrid(AToB0, 9, 4, 3); cmsAlloc3DGrid(BToA0, 17, 3, 4); - modified the cargo, getting rid of the perceptual RGB Cargo ->hRGB = cmsCreate_sRGBProfile(); - finally, the most important, I rewrote the Forward function, so that when it gets called by cmsSample3DGrid(), it fills my LUT in the appropriate manner, that is, for an entry lab in the LUT, calculate its original rgb value, and then derive the new cmyk I want to obtain (assigned to Out[]): static int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) { LPCARGO C = (LPCARGO) Cargo; WORD RGB[3]; DWORD total; int imin, imax; cmsDoTransform(C ->Lab2RGB, In, &RGB, 1); total = RGB[0] + RGB[1] + RGB[2]; // map values where R+G+B>512 to white (C0,M0,Y0,K0) if(total > 0xFFFF*2){ Out[0] = Out[1] = Out[2] = Out[3] = 0; return TRUE; } // map values where R+G+B<128 to rich black (C100,M100,Y100,K100) if(total < 0x8000){ Out[0] = Out[1] = Out[2] = Out[3] = 0xFFFF; return TRUE; } // other tricks here, to values where total is between 128 and 512 ... return TRUE; } The trick seems to work, the profile gets built, and when viewed with Huan's profile inspector, the CLUT seems to work. My problem is that even though the pre and post linearization curves are identities (have not touched the code here), the values obtained when applying the profile are.not the spected ones, which should match the values inserted in the LUT, shouldn't they? In other words, the linearization curves seem to modify the results of the CLUT, even though they are identities... Any idea, hint, suggestion? Thanks, Ignacio -- ______________________________________________________________ Ignacio Ruiz de Conejo Senior Imaging Researcher Tel. : +61 28875 9682 e-mail: ign...@si... ______________________________________________________________ |