OK, so here's the deal:
TIFF (unlike OpenEXR) doesn't have any header field or other information that
stores channel names. So it is meaningless to talk about the channel names "in
a TIFF file." No such thing. All OIIO can do for TIFF is make up names that we
think correspond to what's there, based on other header fields.
For a file with >= 3 channels and whose PHOTOMETRIC tag is PHOTOMETRIC_RGB, we
make the reasonable guess that the channel names for the first three channels
should be "R", "G", and "B".
But what if there's a fourth channel? What is it, and what is its name? TIFF
files contain a tag called EXTRASAMPLES describing the meaning of extra
samples. There are three choices:
1. ASSOCIATED -- it's an alpha channel, with the assumption that the color
channels are "premultiplied". We pass this along and call it "A".
2. UNASSOCIATED -- it's a mask, and the color channels are not premultiplied.
We pass this on as channel "A", and premultiply the color channels so we always
present "associated alpha" (unless the user has set the configuration to
include "oiio:UnassociatedAlpha" set to 1, in which case we do not premultiply
and leave the alpha unassociated).
3. UNSPECIFIED -- this means that the extra channel is something else, not an
alpha (associated or unassociated). In that case, it seems wrong to call the
channel "A", since the TIFF file *** explicitly says that it's not alpha ***.
So we call it "channelN", since the TIFF file, as we said, specifies no name.
(Examples of an extra channel that is not alpha would include depth, unlit
diffuse color, surface normal, etc.)
So, bottom line, the file you attached says in the TIFF header that the
EXTRASAMPLES value is UNSPECIFIED, meaning that it's not alpha. So we don't
call it "A". I don't really know what else to say.
You can rename channels with oiiotool:
oiiotool testalpha_olds.tif -chnames R,G,B,A -o out.tif
Although TIFF won't store the channel names you give it, the OIIO tiff output
module will recognize that since it's named "A", it's meant to be alpha, so the
EXTRASAMPLES value it writes should be ASSOCIATED. So this effectively just
copies the file and corrects the EXTRASAMPLES. I don't know how it got to have
the UNSPECIFIED value to being with.
Does this clarify?
-- lg
> On Jul 6, 2015, at 8:39 AM, Michel Lerenard <[email protected]> wrote:
>
> Hi,
>
> I've stumbled on an issue I haven't been able to understand. I've attached a
> file sent to our support team, which cannot be loaded properly. The file
> comes from Photoshop.
>
> While trying to understand what was happening, I noticed that in the
> ImageSpec channel names list, I get "R", "G", "B" and "channel3". If I open
> the file in GIMP and resave it using another name, everything is fine: the
> fourth channel is named "A".
>
> I've looked at the TIFF plugin code, and I don't understand the part of the
> readspec function that is renaming the fourth channel I have. From what I
> understand, at first the function reads that there are four channels in the
> file, initializes the spec with default names (R,G,B,A), then renames the
> channel "channel3" when it decides that the extra channel is not alpha.
>
> ====>>>>>
> // This extra channel is not alpha at all. Undo any
> // assumptions we previously made about this channel.
> if (m_spec.alpha_channel == c) {
> m_spec.channelnames[c] = Strutil::format("channel%d", c);
> m_spec.alpha_channel = -1;
> }
>
> ====<<<<<
>
> Could anyone explain to me how this works ? I'm completely lost with all the
> EXTRASAMPLE stuff that is used to decide what to do with the last channel.
>
> Thanks.
>
> Michel
> <testalpha_olds.tif>_______________________________________________
> Oiio-dev mailing list
> [email protected]
> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
--
Larry Gritz
[email protected]
_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org