After a little more digging I guess you can't copy ICC. Now I'm loading it from file and pass it to Image.create()
Also I changed a convert function a little, previous one made a duplicate images in pdf if the converting image was the same on multiple pages and the resulting pdf got bigger.
New code, using JBIGTest sample:
SDFDoc cos_doc = pdfDoc.getSDFDoc();
int num_objs = (int)cos_doc.xRefSize();
for(int i=1; i<num_objs; ++i) {
Obj obj = cos_doc.getObj(i);
if (obj != null && !obj.isFree() && obj.isStream()) {
// Process only images
DictIterator itr = obj.find("Subtype");
if (!itr.hasNext() || !itr.value().getName().equals("Image"))
continue;
Image orig_image = new Image(obj);
if (orig_image.getImageColorSpace().getType() == ColorSpace.e_lab) {
Image2RGB image2rgb = new Image2RGB(obj);
ColorSpace iccFromFile = ColorSpace.createICCFromFile(pdfDoc, "c:\\temp\\sRGB_v4_ICC_preference.icc");
Image new_image = Image.create(cos_doc, image_reader,
orig_image.getImageWidth(),
orig_image.getImageHeight(), 8, iccFromFile);
Obj new_img_obj = new_image.getSDFObj();
cos_doc.swap(i, new_img_obj.getObjNum());
}
}
}
Q. How do I set image rendering intent? I don't have element or gstate here to use GState.setrenderingIntent(). Converted image has e_relative_colorimetric and I need it to be perceptual.