AcademySoftwareFoundation / AcademySoftwareFoundation/OpenImageIO

[BUG] TIFFs saved with CMYK ColorSpace always get converted to 8-bit

Open
#4,286 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.