Repository navigation
Image CMS modes #8007
Description
Activity
it doesn't seem like it's possible to use the other four.
The following code will reach one of those lines.
from PIL import ImageCms source_profile = ImageCms.createProfile("sRGB") destination_profile = ImageCms.createProfile("sRGB") ImageCms.buildTransform(source_profile, destination_profile, "RGB", "YCC")
But it will raise an error afterwards.
I'm guessing you meant reach those lines without error?
You can't use the
ImageCmsTransformthat creates becauseYCCisn't a valid image mode, so you can't create an image with that mode to apply the transform to.From a documentation perspective, https://pillow.readthedocs.io/en/stable/reference/ImageCms.html#PIL.ImageCms.buildTransform describes
inModeandoutModeasString, as a valid PIL mode that the appropriate profile also supports (i.e. “RGB”, “RGBA”, “CMYK”, etc.)
Those are the modes that are passed to
findLCMStype(), so I think there's an argument that these options are undocumented, and that YCCA shouldn't be renamed to YCCA;P.However, from a practical perspective, the following code runs without an error.
from PIL import Image, ImageCms for inMode in ("L;16", "L;16B"): source_profile = ImageCms.getOpenProfile("/Users/andrewmurray/pillow/Pillow/Tests/icc/sGrey-v2-nano.icc") destination_profile = ImageCms.createProfile("sRGB") transform = ImageCms.buildTransform(source_profile, destination_profile, inMode, "RGB") im = Image.new("RGB", (1, 1)) ImageCms.applyTransform(im, transform) source_profile = ImageCms.getOpenProfile("/Users/andrewmurray/pillow/Pillow/Tests/icc/sRGB_v4_ICC_preference.icc") destination_profile = ImageCms.createProfile("sRGB") transform = ImageCms.buildTransform(source_profile, destination_profile, "RGBA;16B", "RGB") im = Image.new("RGB", (1, 1)) ImageCms.applyTransform(im, transform)
Would updating the documentation be sufficient to resolve this?
I've created #8031 to resolve this by deprecating the unexpected modes, and adding replacements for some.
@Yay295 What do you think about documentation vs. deprecation?
I think deprecation is probably the better option. Though if someone files an issue saying they're actually using it for something it could be un-deprecated.
Reacted by Hugo van Kemenade
When the C code checks the given input and output modes it checks against this list:
RGB,RGBA,RGBX,RGBA;16B,CMYK,L,L;16,L;16B,YCCA,YCC, andLAB.Pillow/src/_imagingcms.c
Lines 214 to 244 in e63ae38
However, only
RGB,RGBA,RGBX,CMYK,L, andLABare actual imaging modes.RGBA;16B,L;16, andL;16Bare rawmodes,YCCApartially exists as a rawmode namedYCCA;P, andYCCis a mode but is namedYCbCr. That last one is easy enough to fix by just using the correct name, but it doesn't seem like it's possible to use the other four.