#include #include static int pam_transform(struct pam *inpam, struct pam *outpam, cmsHTRANSFORM *hTransform); int main(int argc, char **argv) { int c, i, nProf = 0; char *in_prof = NULL, *out_prof = NULL; double gamma = 0.0; cmsHTRANSFORM hTransform; cmsHPROFILE profiles[3]; struct pam inpam, outpam; while ((c = getopt(argc, argv, "i:o:g:")) != EOF) { switch (c) { case 'i': in_prof = optarg; break; case 'o': out_prof = optarg; break; case 'g': gamma = atof(optarg); break; default: break; } } if (in_prof) { profiles[nProf++] = cmsOpenProfileFromFile(in_prof, "r"); } else { profiles[nProf++] = cmsCreate_sRGBProfile(); } if (gamma) { LPGAMMATABLE gTable[3]; gTable[0] = cmsBuildGamma(256, gamma); gTable[1] = gTable[2] = cmsBuildGamma(256, 1.0); profiles[nProf++] = cmsCreateLinearizationDeviceLink( icSigLabData, gTable); } if (out_prof) { profiles[nProf++] = cmsOpenProfileFromFile(out_prof, "r"); } else { profiles[nProf++] = cmsCreate_sRGBProfile(); } hTransform = cmsCreateMultiprofileTransform( profiles, nProf, TYPE_RGB_16, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); pm_init(argv[0], 0); pnm_readpaminit(stdin, &inpam, PAM_STRUCT_SIZE(tuple_type)); outpam = inpam; outpam.file = stdout; pnm_writepaminit(&outpam); pam_transform(&inpam, &outpam, &hTransform); cmsDeleteTransform(hTransform); for (i = 0; i < nProf; i++) { cmsCloseProfile(profiles[i]); } return 0; } static int pam_transform(struct pam *inpam, struct pam *outpam, cmsHTRANSFORM *hTransform) { tuple *inrow, *outrow; int row, col; inrow = pnm_allocpamrow(inpam); outrow = pnm_allocpamrow(outpam); for (row = 0; row < inpam->height; row++) { pnm_readpamrow(inpam, inrow); for (col = 0; col < inpam->width; col++) { int i; unsigned short inpix[3], outpix[3]; for (i = 0; i < 3; i++) { inpix[i] = (unsigned short) inrow[col][i]; } cmsDoTransform(*hTransform, inpix, outpix, 1); for (i = 0; i < 3; i++) { outrow[col][i] = (sample) outpix[i]; } } pnm_writepamrow(outpam, outrow); } pnm_freepamrow(inrow); pnm_freepamrow(outrow); return 0; }