Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
AdamMainsTL opened this issue Jun 10, 2024 · 0 comments
Open

Comments

@AdamMainsTL
Copy link
Contributor

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.

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:

if (m_spec.format != TypeDesc::UINT8
|| m_spec.format != TypeDesc::UINT16) {

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)) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant