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

Reply via email to