AcademySoftwareFoundation / AcademySoftwareFoundation/OpenImageIO
[BUG] TIFFs saved with CMYK ColorSpace always get converted to 8-bit
- Dominant language
- C++
- Stars
- 2.4k
- Forks
- 698
- Avg merge
- 3d 4h
- Merged PRs (30d)
- 47
Description
**Describe the bug**
When trying to save 16-bit data into a TIFF with CMYK color space applied, it outputs as 8-bit instead.
**OpenImageIO version and dependencies**
2.4.11.0
**To Reproduce**
Steps to reproduce the behavior:
1. Create an ImageSpec with UINT16 format, and `tiff:ColorSpace` set to "CMYK"
2. Open ImageOutput with the spec
3. Write 16-bit data to it
4. Output file is 8-bit
Not sure how to reproduce this flow in oiiotool, but if someone can give me a command that does this I can try it out.
**Evidence**
Cannot attach specific images, but exiftool, Mac Preview, and Photoshop all confirm that the output is 8-bit.
**IF YOU ALREADY HAVE A CODE FIX:** There is no need to file a separate issue,
please just go straight to making a [pull request](https://github.com/AcademySoftwareFoundation/OpenImageIO/pulls).
I do not have a code fix specifically, but mainly opening this as a question on a portion of code I think is causing this. Specifically, this if statement will evaluate to true no matter what format is:
https://github.com/AcademySoftwareFoundation/OpenImageIO/blob/24f172a7e7581fa8c38bee2d01a7e8e4985b3d8b/src/tiff.imageio/tiffoutput.cpp#L721-L722
Because of this everything is getting converted to 8-bit. However, I'm not sure if it's trying to do this on purpose because there doesn't seem to be any handling for 16-bit values.
For reference, this is what my potential fix would be, but I am not in a position to test this properly right now and probably won't be soon which is why this is not a PR.
```
m_photometric = PHOTOMETRIC_SEPARATED;
if (m_spec.format == TypeDesc::UINT16) {
m_bitspersample = 16;
} else {
// Make everything else UINT8
m_spec.format = TypeDesc::UINT8;
m_bitspersample = 8;
}
TIFFSetField(m_tif, TIFFTAG_BITSPERSAMPLE, m_bitspersample);
TIFFSetField(m_tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
if (source_is_rgb(m_spec)) {
```
Contributor guide
Research direction
Inspect src/tiff.imageio/tiffoutput.cpp around lines 721-722 and trace how ImageSpec.format and TIFFTAG_BITSPERSAMPLE are set for CMYK output. Reproduce with a UINT16 ImageSpec and tiff:ColorSpace set to CMYK, then verify with exiftool, Mac Preview, or Photoshop that the output remains 16-bit.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- computer-graphics
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100