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 Profile
string 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 data
IccCurveTagType[] 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 data
IccParametricCurveTagType[] iccParametricCurveType = new IccParametricCurveTagType[3];
iccParametricCurveType[0] = FillIccParametricCurveTagType();
iccParametricCurveType[1] = FillIccParametricCurveTagType();
iccParametricCurveType[2] = FillIccParametricCurveTagType();
// define the CLUT
IccColorLookupTable16Bit iccCLUT16 = new IccColorLookupTable16Bit();
// only the first i entries are used, where i is the number of input channels
iccCLUT16.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-bit
iccCLUT16.Precision = 2;
// and then the padding bytes
iccCLUT16.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 ushort
iccCLUT16.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 IccResponseCurve
IccCurveTagType[] 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 type
IccLookupTableBToATagType iccLUTBtoA = new IccLookupTableBToATagType(
3, // input channels
2, // output channels
iccCurveType,
iccParametricCurveType,
iccCurveTypeA,
iccCLUT16,
iccMatrix);
// add the new tag to the ICC Profile
iccProfile.AddTag(iccLUTBtoA, IccTag.BToA2Tag, IccTagTypeBase.LutBtoATypeSignature);
// generate the new profile id
iccProfile.GenerateProfileId();
// update the icc array with the new changes
iccProfile.UpdateDataArray();
// write the Icc Profile into a new file
string 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