Hi, Sorry. Don't know why, but my last push didn't work. Should be fixed right now. Regards Marti
Quoting Vincent Ponchaut <vincent.ponch...@hotmail.fr>: > Hi Marti, > Thanks for the update. I checked out the GIT repository using > subversion and compiled the library using VC2013. Unfortunately, the > sample code I included in my last mail still gives me exactly the > same output... > Did I do something wrong (I did clean & rebuild my entire solution > after relinking Little CMS) ? > Vincent >> Date: Sat, 1 Aug 2015 17:14:24 +0000 >> From: marti.ma...@littlecms.com >> To: vincent.ponch...@hotmail.fr >> CC: lcms-user@lists.sourceforge.net >> Subject: Re: [Lcms-user] Issue with 'lumi' tag >> >> >> >> Hello Vicent, >> >> This is now fixed in GIT. Thanks for reporting >> >> Best regards >> Marti >> >> >> Vincent Ponchaut <vincent.ponch...@hotmail.fr> escribió: >> >> >> > Hi everyone, >> >> > I am trying to find a generic approach for reading the 'lumi' tag >> >> > accurately, using Little CMS 2.7. I use ICC profiles that are >> >> > generated with XRite i1 display pro, and it seems that the X & Z >> >> > values of the CIEXYZ 'lumi' value are not 0 (making the profile >> >> > wrong according to the ICC spec). >> >> > I am under the impression that little CMS applies a kind of >> >> > correction whenever this kind of 'lumi' tag is detected (diving X, >> >> > Y, and Z by 100.0 ? ). >> >> >> >> >> >> Hello Vicent, >> >> >> >> LittleCMS does nothing with the contents of luminance tag. It just >> >> returns the XYZ contained it it. Make sure to use the right type, which >> >> is cmsCIEXYZ. Otherwise yes, you can mix read raw with read cooked, but >> >> what you say closing and reopening the handle gives you different >> >> values is very suspicious. Could you show us the portion of code that >> >> reads that tag? Thanks. Oh, also make sure to try the latest code from >> >> GIT, there are some fixes that may be relevant. >> >> >> >> Regards >> >> Marti >> >> >> > >> > Hi Marti, >> > The "correction" that I mentioned would be the NormalizeXYZ function >> > that is used in _cmsReadXYZNumber: >> > [...] >> > XYZ->X = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.X)); >> > XYZ->Y = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Y)); >> > XYZ->Z = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Z)); >> > >> > >> > NormalizeXYZ(XYZ); >> > [...] >> > >> > I think that this may be the reason why the luminance of my profile >> > is not read correctly. >> > So I tried to bypass this and observed the behavior I described. >> > Sample code: >> > /* Open profile handle */ cmsHPROFILE hProfile = >> > cmsOpenProfileFromFile("testProfile.icc", "r"); >> > /* Read luminance in a "classic" way */ cmsCIEXYZ *lumi = >> > (cmsCIEXYZ*)cmsReadTag(hProfile, cmsSigLuminanceTag); >> > cout << lumi->X << lumi->Y << lumi->Z << endl; >> > /* Read luminance from raw data */ cmsS15Fixed16Number >> > buffer_s15f16[20]; cmsReadRawTag(hProfile, cmsSigLuminanceTag, >> > buffer_s15f16, 20); >> > lumi->X = >> > cms15Fixed16toDouble(cmsAdjustEndianess32(buffer_s15f16[2])); >> > lumi->Y = >> > cms15Fixed16toDouble(cmsAdjustEndianess32(buffer_s15f16[3])); >> > lumi->Z = >> > cms15Fixed16toDouble(cmsAdjustEndianess32(buffer_s15f16[4])); >> > cout << lumi->X << lumi->Y << lumi->Z << endl; >> > This produces the following output: 0.527483 0.571429 0.697399 >> > 0.527481 0.571426 0.697403 >> > >> > However, that is not the case with the following code (that is >> > practically the same except for closing/reopening the profile >> > between the two calls): >> > /* Open profile handle */ cmsHPROFILE hProfile = >> > cmsOpenProfileFromFile("testProfile.icc", "r"); >> > /* Read luminance in a "classic" way */ cmsCIEXYZ *lumi = >> > (cmsCIEXYZ*)cmsReadTag(hProfile, cmsSigLuminanceTag); >> > cout << lumi->X << lumi->Y << lumi->Z << endl; >> > /* Close then reopen */ cmsCloseProfile(hProfile); >> > hProfile = cmsOpenProfileFromFile("testProfile.icc", "r"); >> > /* Read luminance from raw data */ cmsS15Fixed16Number >> > buffer_s15f16[20]; cmsReadRawTag(hProfile, cmsSigLuminanceTag, >> > buffer_s15f16, 20); >> > lumi->X = >> > cms15Fixed16toDouble(cmsAdjustEndianess32(buffer_s15f16[2])); >> > lumi->Y = >> > cms15Fixed16toDouble(cmsAdjustEndianess32(buffer_s15f16[3])); >> > lumi->Z = >> > cms15Fixed16toDouble(cmsAdjustEndianess32(buffer_s15f16[4])); >> > cout << lumi->X << lumi->Y << lumi->Z << endl; >> > This version produces this output:0.527483 0.571429 0.697399 >> > 527.483 571.429 697.399 >> > >> > >> > I can make my code work fine by using only the version that reads >> > the tag from raw data, but I could not, for example, make an >> > algorithm that goes: 1) Open profile 2) Read Luminance in a >> > "classic" way3) Sanity check of the obtained values4) If the value >> > is not correct, read luminance from raw data >> > Without having a close/reopen step in between. >> > I will definitely give a try to the code on GIT, thanks ! >> > Best regards, >> > Vincent >> >> ------------------------------------------------------------------------------ _______________________________________________ Lcms-user mailing list Lcms-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lcms-user