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