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

Reply via email to