Hi, I do love little CMS very much - nice, small and quick. But I do have an issue with a bit of code and I cannot see what I am doing wrong. Maybe one of you guys could help me and tell if I do anything obvious stupid?
The basic idea is that I do have an image with an embedded profile and an external profile file. The external profile can differ and may have e.g. 6 channels. I want to transform the image with the external profile and read the pixel values of the output channels. Here is an example code (leaving out only the input image specific stuff), which is really a modified version of the basic example seen in the tutorial: //START cmsHPROFILE hInProfile, hOutProfile; cmsHTRANSFORM hTransform; //Width and height and pixel type are from the input image int nInputPixelType = TYPE_BGRA_16; int nWidth = xxx; int nHeight = xxx; //Loading the profiles hInProfile = cmsOpenProfileFromMem(memoryPointer,size); hOutProfile = cmsOpenProfileFromFile(szProfileFile, "r"); //Extracting information of the output profile cmsColorSpaceSignature outputColorSpace = cmsGetColorSpace(hOutProfile); int nNumOutputChannels = cmsChannelsOf(outputColorSpace); //This is 6 in my example //This formatter is used in the transformation int nOutputFormatter = _cmsLCMScolorSpace(outputColorSpace); int nNumBytes = T_BYTES(nOutputFormatter); //This is 4 in my example //I change now the formatter to have 1 byte instead as I want to use that instead of 4 byte precision if(nNumBytes != 1) { //Clear the first 3 bits nOutputFormatter &= ~7; //Set it to 1 Bytes nOutputFormatter |= 1; //Retrieve the value again (making sure it is one byte) nNumBytes = T_BYTES(nOutputFormatter); } //Create the transformation hTransform = cmsCreateTransform(hInProfile, nInputPixelType, hOutProfile, nOutputFormatter, INTENT_RELATIVE_COLORIMETRIC, 0); //Closing the profile cmsCloseProfile(hInProfile); cmsCloseProfile(hOutProfile); //Create a buffer to hold the transformed data int nNewSizeInBytes = nNumOutputChannels * nHeight * nWidth * nNumBytes; char* szData = new char[nNewSizeInBytes]; memset(szData,0,nNewSizeInBytes); //Transform the data int nRowLengthInBytes = nNumOutputChannels*nNumBytes*nWidth; for(int i = 0; i < nHeight; ++i) { char* pixelBuffer = READ_BUFFER_FROM_IMAGE_FOR_ROW(i); cmsDoTransform(hTransform, pixelBuffer,szData + i *nRowLengthInBytes, nWidth); } //END The issue is that the transformation does work - I do get the data for each channel. But the transformed image data is only 1/3 wide (the height does match) - the other 2/3 of the image are untouched (e.g. when I initialize szData with white instead of black, it remains white). I must be doing something really stupid - but I cannot see what is wrong? Any help or pointers are highly appriciated. It would help me to know if the litte CMS code is ok but I have an issue either in the input buffer or the output buffer? Thank you very much in advance Michael ------------------------------------------------------------------------------ Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only SaaS-based application performance monitoring service that delivers powerful full stack analytics. Optimize and monitor your browser, app, & servers with just a few lines of code. Try New Relic and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may _______________________________________________ Lcms-user mailing list Lcms-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lcms-user