This example method can be used in creating an "lutBtoAType" mentioned in the ICC.1:2004-10 specification. The following information is used: input channels = 3, output channels = 2.
using Leadtools;using Leadtools.ColorConversion;public IccCurveTagType FillIccCurveTagType(){double myDoubleValue = 1.0;ushort[] curveData = new ushort[1];curveData[0] = IccTools.FromDoubleToU8Fixed8Number(myDoubleValue);IccCurve iccCurve = new IccCurve(curveData);IccCurveTagType iccCurveTagType = new IccCurveTagType(iccCurve);return iccCurveTagType;}public IccParametricCurveTagType FillIccParametricCurveTagType(){int[] parameters = new int[1];parameters[0] = IccTools.FromDoubleTo2bFixed2bNumber(5.0);IccParametricCurve parametricCurve = new IccParametricCurve(IccFunctionsType.Function4Bytes, parameters);IccParametricCurveTagType parametricCurveTagType = new IccParametricCurveTagType(parametricCurve);return parametricCurveTagType;}public void IccLookupTableBToATagTypeExample(){// load an Icc Profilestring fileName = Path.Combine(LEAD_VARS.ImagesDir, "ReadFromImageCS.icc");IccProfileExtended iccProfile = new IccProfileExtended(fileName);// "B Curves" should be of the same number as Input Channels// They can be either IccCurveTagType or IccResponseCurveTagType// fill the dataIccCurveTagType[] iccCurveType = new IccCurveTagType[3];iccCurveType[0] = FillIccCurveTagType();iccCurveType[1] = FillIccCurveTagType();iccCurveType[2] = FillIccCurveTagType();// define the "Matrix"int[] element = new int[12] {IccTools.FromDoubleTo2bFixed2bNumber(1.0),IccTools.FromDoubleTo2bFixed2bNumber(2.0),IccTools.FromDoubleTo2bFixed2bNumber(3.0),IccTools.FromDoubleTo2bFixed2bNumber(4.0),IccTools.FromDoubleTo2bFixed2bNumber(5.0),IccTools.FromDoubleTo2bFixed2bNumber(6.0),IccTools.FromDoubleTo2bFixed2bNumber(7.0),IccTools.FromDoubleTo2bFixed2bNumber(8.0),IccTools.FromDoubleTo2bFixed2bNumber(9.0),IccTools.FromDoubleTo2bFixed2bNumber(10.0),IccTools.FromDoubleTo2bFixed2bNumber(11.0),IccTools.FromDoubleTo2bFixed2bNumber(12.0)};IccMatrix iccMatrix = new IccMatrix(element);// "M Curves" should be of the same number as Input Channels// They can be either IccCurve or IccResponseCurve// Fill the dataIccParametricCurveTagType[] iccParametricCurveType = new IccParametricCurveTagType[3];iccParametricCurveType[0] = FillIccParametricCurveTagType();iccParametricCurveType[1] = FillIccParametricCurveTagType();iccParametricCurveType[2] = FillIccParametricCurveTagType();// define the CLUTIccColorLookupTable16Bit iccCLUT16 = new IccColorLookupTable16Bit();// only the first i entries are used, where i is the number of input channelsiccCLUT16.NumberOfGridPoints[0] = 1;iccCLUT16.NumberOfGridPoints[1] = 1;iccCLUT16.NumberOfGridPoints[2] = 1;// the percision that determins if we are using IccColorLookupTable// 8Bit or 16Bit, 1 for 8-bit, and 2 for 16-biticcCLUT16.Precision = 2;// and then the padding bytesiccCLUT16.Pad[0] = 0;iccCLUT16.Pad[1] = 0;iccCLUT16.Pad[2] = 0;// and finally the CLUT data points (arranged as described in the text in// ICC.1:2004-10 specification, page 48// The size of the data array is: multiplication of all the cells in the numberOfGridPoints array// 1 * 1 * 1 * 2 (number of output channel) * 2 (Percision) = 4 Bytes = 2 ushorticcCLUT16.Data = new ushort[2];iccCLUT16.Data[0] = 3;iccCLUT16.Data[1] = 4;// "A Curves" should be of the same number as Output Channels// They can be either IccCurve or IccResponseCurveIccCurveTagType[] iccCurveTypeA = new IccCurveTagType[2];iccCurveTypeA[0] = FillIccCurveTagType();iccCurveTypeA[1] = FillIccCurveTagType();// The data pointer will contain all the curve buffers in a sequential order,// the offset of the start of each curve buffer will be saved into the// appropriate offset variable in the class// the data pointer will be created automatically inside the toolkit when// the IccProfile.SetICCTagData() method// define the tag typeIccLookupTableBToATagType iccLUTBtoA = new IccLookupTableBToATagType(3, // input channels2, // output channelsiccCurveType,iccParametricCurveType,iccCurveTypeA,iccCLUT16,iccMatrix);// add the new tag to the ICC ProfileiccProfile.AddTag(iccLUTBtoA, IccTag.BToA2Tag, IccTagTypeBase.LutBtoATypeSignature);// generate the new profile idiccProfile.GenerateProfileId();// update the icc array with the new changesiccProfile.UpdateDataArray();// write the Icc Profile into a new filestring IccfileName = Path.Combine(LEAD_VARS.ImagesDir, "IccLookupTableBToATagTypeCS.icc");iccProfile.GenerateIccFile(IccfileName);}static class LEAD_VARS{public const string ImagesDir = @"C:\LEADTOOLS22\Resources\Images";}
IccLookupTableBToATagType Members
Leadtools.ColorConversion Namespace
IccParametricCurveTagType Class
IccResponseCurveSet16TagType Class
IccViewingConditionsTagType Class
IccMultiLocalizedUnicodeTagType Class
IccLookupTableAToBTagType Class
IccProfileSequenceDescriptionTagType Class
IccS15Fixed16ArrayTagType Class