Hi Larry Do you know how I could get my hands on an image that contains the equivalent of 16bit linear unique pixel values per rgb channel, or more? I guess it takes 4kx4k at 16bpp to get there. I could also work with 32bit floats
Thanks Larry Chris Spence Reverator 6815 Biscayne Blvd, Suite 103-191 Miami, FL 33138 Tel: 305 757 1330 i...@reverator.com www.reverator.com > On Oct 16, 2020, at 3:27 AM, Larry Gritz <l...@larrygritz.com> wrote: > > Yeah, this is a bit tricky. The APIs very much want to assume that although > channels may be stored in a planar or separate fashion in the file > (RRRRR...GGGGG.....BBBBB), that you will want to read them into memory > buffers with "contiguous" pixels (RGBRGBRGB...). So there is no API call that > directly reads an image (or scanline or tile) into separate channel buffers, > nor any per-channel strides that would let you force that to happen with a > single call. > > Perhaps this is an oversight. On the other hand, given that it's hard for me > to recall anybody asking for this in the last 12 years, it may have been the > right assumption in general. > > The easy solution is to read it into a temporary buffer and then rescramble > it to separate out the channels. We have some helper functions to make that > easy, look in imageio.h for the convert_image() function (and also > parallel_convert_image). You would basically call this once for each channel, > constructing the strides for src and dst so that they coalesce the R's, G's, > and B's together into their separate buffers. > > There is an obvious performance penalty (of the extra copy step). If that's > really critical for anybody, then we could consider adding "separate" > versions of the API calls that instead of one data pointer would take a > data[], one per channel. That would probably be a lot of work, though not > exactly rocket science. Like I said, the lack of requests for this over the > years is strong circumstantial evidence that it's not an important enough > case to enough people to justify the work or the extra API complexity, though > if lots of people chime in that they have wanted this, I could be convinced. > > -- lg > > >> On Oct 15, 2020, at 4:09 AM, Jan Hettenkofer <j...@hettenkofer.net >> <mailto:j...@hettenkofer.net>> wrote: >> >> Hello all, >> >> I am struggling to read images into a buffer that organises channels >> in a planar memory layout (i.e. all red scanlines before all blue >> before all green etc...). It appeared to me like specifying the >> strides for `ImageInput::read_image` would be the thing to do here. >> However, upon playing with it for a while I realised that it seems >> to be impossible to specify the stride for the channel values within >> a pixel. >> >> For example the following results in the red channel correctly set >> but all the other channel values set to 0 (untouched from the >> default initialisation I suppose): >> >> ``` >> std::vector<T> img_data(spec.width * spec.height * spec.nchannels); >> >> auto column_stride = sizeof(img_data[0]); >> auto row_stride = column_stride * spec.width; >> // initially I assumed that the z-stride would be the one to use >> // to rearrange the channels - now I realise that this is only >> // relevant for volumetric images >> auto slice_stride = row_stride * spec.height; >> >> // helpers::type_to_typedesc<T> returns the OIIO typedesc >> // corresponding to T >> file->read_image(helpers::type_to_typedesc<T>(), >> img_data.data(), >> column_stride, >> row_stride, >> slice_stride >> ); >> ``` >> >> I suspect that in this case green and blue values are written but >> then immediately overwritten by the red channel in the next two >> pixels. >> >> I could of course just accept the interleaved memory layout and then >> copy the pixels into the right place afterwards. >> >> Another way might be writing a clever adapter that "looks" like an >> array to OIIO but actually just re-routes the writes to a real buffer >> with modified positions. However, this would strongly couple my code >> to implementation details of `read_image`. >> >> Is there a method to specify a planar memory layout for the target >> buffer in order to avoid such workarounds? >> >> Thanks a lot in advance for your help! >> >> With kind regards, >> Jan Hettenkofer >> >> _______________________________________________ >> Oiio-dev mailing list >> Oiio-dev@lists.openimageio.org <mailto:Oiio-dev@lists.openimageio.org> >> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org >> > > -- > Larry Gritz > l...@larrygritz.com <mailto:l...@larrygritz.com> > > > > > _______________________________________________ > Oiio-dev mailing list > Oiio-dev@lists.openimageio.org > http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
_______________________________________________ Oiio-dev mailing list Oiio-dev@lists.openimageio.org http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org