On one hand, we don't want to do operations that are not supported in the 
output format, thereby resulting in significant loss of data. On the other 
hand, we can't be too trigger-happy with the errors, or it would be impossible 
to get anything done. So when we encounter a request to do something not 
possible with a given format, we try to ask "is there a particular thing that 
the human almost certainly meant when they made this impossible request?"

For example OpenEXR's least accurate pixel data type ('half') has more 
precision and range than JPEG's most accurate type, so there will be data loss, 
but we don't want to make every operation that starts with exr and ends with 
jpg to be an error. So we just convert any input pixel data type to UINT8 when 
outputting a JPEG. For most ordinary images, the data is LDR and our eyes are 
mostly satisfied with 8 bits in an sRGB-mapped intensity response, so this 
conversion will probably be fine. ("If you wanted to preserve the HDR data, you 
should not have output to JPEG, dummy.")

But what if we are asked to save more channels than a file format can 
accommodate? If you just drop the channels, you're not just reducing precision, 
you are losing whole sections of the original data. So at present, we make it a 
hard error.

As a special case (and maybe precedent?), we do just silently drop an alpha 
channel when saving JPEG. JPEG cannot accommodate alpha, but it's so common for 
an input to have alpha, it was painful for it to be an error when saving to 
JPEG. It seemed that the obvious human interpretation was "I'm using JPEG 
because this is final output for the web or for my mom to view, the alpha that 
was valuable for intermediate computations won't be needed for those purposes, 
so drop it."

I think that at the low level of ImageInput, open() should fail if you ask for 
more channels than can be supported in any obvious way. But for oiiotool in 
particular, I think we can make more "best guess" heuristics.

I'm certainly open to this being debated!

When oiiotool is outputting to a format that doesn't support as many channels 
as the image appears to have, do you think we should just silently output the 
first 3 channels and drop the rest? Should this be the one and only behavior? 
Or should there be a "strict/lax" option that determines whether this (and 
potentially other conversions) are an error or silently do whatever is 
necessary to complete the action somehow? If so, should the default be strict 
or lax?

        -- lg


(Note for the pedants in the crowd: most of the places I wrote "JPEG", I'm not 
really talking about the JPEG compression, but rather the JFIF file format.)


On Feb 5, 2015, at 3:56 PM, Justin Israel <[email protected]> wrote:

> I was curious about some behavior in oiiotool v1.4.14, when dealing with a 
> source image that has 6 channels, and converting it to a jpeg. 
> 
> oiiotool source.exr -o out.jpg
> # oiiotool ERROR: jpeg does not support 6-channel images
> 
> I presume this bubbles up from libjpeg. Fair enough. But I know that the 
> mantra of OpenImageIO has usually been to try and do the right default 
> action, and attempt to avoid failures if possible. That being said, do you 
> think it would be more in line with that philosophy if the jpeg plugin 
> ensured it would only use 1, 3, or 4 of the first available channels, if not 
> using an explicit list already? That way you would still get a jpg output, 
> even if you passed it a 6 channel image, but could still explicitly give is a 
> channel list if you knew them up front. 
> 
> Currently I have to inspect the source image first before calling oiiotool, 
> and ensure that I pass it a reduced channel list if needed. 
> 
> Justin

--
Larry Gritz
[email protected]



_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to