If I understand your example correctly, you are laying out your pixel data in 
memory as:

    RRRRRRRRRR GGGGGGGGGG BBBBBBBBBB

but in general OIIO wants each pixel to be contiguous, like

    RGB RGB RGB RGB RGB RGB RGB RGB RGB RGB 

So like this:

int npixels = xres * yres;
for (auto pixel = 0; pixel < npixels; ++pixel) {
    for (auto chan = 0; chan < channels; chan++) {
        pixelsOut[pixel*channels + chan] = (float(chan % channels) * 20)*0.01;
    }
}



> On Jan 29, 2022, at 4:02 PM, Dariusz <dari...@dariuszmakowski.com> wrote:
> 
> Hey
> 
> Ok I'm giving up for today. I'm sure I'm missing comma somewhere or 
> something... but here is what I get >
> 
> <bUVVf1cOBGAIvRT9.png>
> 
> It should be RGB with each channel incremented by 0.2 in value, so red 0, 
> green 0.2, blur 0,4. Then remaining 3 channels increment in 0.6/0.8/1.0 as 
> flat colours.
> 
> 
> int channels = 6; // RGB
>  int xres = 640, yres = 480;
> auto imageoffset = xres * yres;
> 
> std::vector<float> pixelsOut(imageoffset * channels);
> for (auto chan = 0; chan < channels; chan++) {
>     for (auto pixel = 0; pixel < imageoffset; ++pixel) {
>         pixelsOut[(chan * imageoffset) + pixel] = (float(chan % channels) * 
> 20)*0.01;
>         //qDebug()<<(float(chan % channels) * 20)*0.01;
>     }
> }
> 
> 
> std::unique_ptr<OIIO::ImageOutput> out = OIIO::ImageOutput::create(filenamex);
> if (!out)
>     return;
> OIIO::ImageSpec specx(xres, yres, channels, OIIO::TypeDesc::FLOAT);
> specx.channelnames = {"R", "G", "B", "PAINT", "GLASS", "DOOR"};
> specx.channelformats = {OIIO::TypeDesc::FLOAT,
>                         OIIO::TypeDesc::FLOAT,
>                         OIIO::TypeDesc::FLOAT,
>                         OIIO::TypeDesc::FLOAT,
>                         OIIO::TypeDesc::FLOAT,
>                         OIIO::TypeDesc::FLOAT,
> };
> out->open(filenamex, specx);
> out->write_image(OIIO::TypeDesc::FLOAT, pixelsOut.data());
> out->close();
> 
> Any help would be legendary.I'm literally all out of ideas here :D
> 
> Regards
> Dariusz
> 
> 
> On 29/01/2022 20:27, Dariusz wrote:
>> Hello
>> 
>> Woa that was fast ! Thank you!!!
>> 
>> Hmmm I just discovered OIIO::ImageOutput::AppendSubimage, I take this is not 
>> what I want then... ? 
>> Your explanation with compression/etc makes total sense. This subimage must 
>> be something different then, gotta read in.
>> 
>> for (auto &maskData: g.second.mMaskMap) {
>>     //imageDataCombined.insert(imageDataCombined.end(), 
>> maskData.second.second.begin(), maskData.second.second.end());
>>     OIIO::ImageSpec specx(xres, yres, channelNames.size(), 
>> OIIO::TypeDesc::FLOAT);
>>     specx.channelnames = channelNames;
>>     specx.extra_attribs.add_or_replace(OIIO::ParamValue("oiio:ColorSpace", 
>> "Linear"));
>>     specx.extra_attribs.add_or_replace(OIIO::ParamValue("compression", 
>> "zips"));
>>     
>> specx.extra_attribs.add_or_replace(OIIO::ParamValue("applied_color_corrections",
>>  false));
>>     specx.extra_attribs.add_or_replace(OIIO::ParamValue("oiio:subimages", 
>> 1));
>>     out->open(filenamex, specx, OIIO::ImageOutput::AppendSubimage);
>>     out->write_image(OIIO::TypeDesc::FLOAT, maskData.second.second.data());
>> }
>> out->close();
>> This seems to be crashing atm... fairly sure I'm breaking something ^^.
>> 
>> 
>> 1 more issue...
>> After posting this post I started writing proper images to exr & opening in 
>> PS and oh boy how I wish I didn't post before doing that test... Im now 
>> stuck with weird layers! 
>> 
>> <tVzSl0kX4Zgv9vCr.png>
>> and
>> <X6Nvkexbu5WVSF6L.png>
>> 
>> The top one looks "close" to being correct, it just looks like all 5 
>> channels are squeezed in 1 layer from rotated 90deg & ordered left to 
>> right... hmmm
>> 
>> And many more, I went over different ways of building my "master buffer" 
>> now, but so far I'm hitting walls...
>> 
>> I tried it as scalines both width/height driven>
>> for (auto height = 0; height < yres; ++height) {
>>     for (auto &maskData: g.second.mMaskMap) {
>>         imageDataCombined.insert(imageDataCombined.end(), 
>> maskData.second.second.begin() + (height * xres), 
>> maskData.second.second.begin() + ((height + 1) * xres));
>>     }
>> }
>> As well ass channel stacked >
>> 
>> 
>> for (auto &maskData: g.second.mMaskMap) {
>>     imageDataCombined.insert(imageDataCombined.end(), 
>> maskData.second.second.begin(), maskData.second.second.end());
>> }
>> 
>> No matter how I build that buffer, it always comes out wrong... 
>> Any ideas how to get it to... save properly? where am I making mistakes here?
>> 
>> Big thanks !
>> Regards
>> Dariusz
>> 
>> 
>> 
>> On 29/01/2022 20:17, Larry Gritz wrote:
>>> The only thing I would add to your example is that there is no need to set 
>>> channelformats at all if the channels are the same data type. In that case, 
>>> you just need to set ImageSpec.format. Only when you have mixed data types 
>>> for the channels is channelformats used (and regular ImageSpec.format is 
>>> the "best" format that could hold any of the channels).
>>> 
>>>> Nowt this will write a nice file for me... but I'd like to understand... 
>>>> if I have 100 channels.... and I might be reading channel from 1 file/ 
>>>> closing it /writing it/etc... How can I eee... add a channel to existing 
>>>> file?
>>> 
>>> 
>>> You can't. It's a limitation of the exr format and the underlying 
>>> libOpenEXR that there is no way to add or alter a single channel in an 
>>> existing file. You just have to read the whole thing and write a new file.
>>> 
>>> I'm not sure there's any image file format (or image file format reading 
>>> library) that makes this easy. It could be done for uncompressed data, I 
>>> guess -- just write over those bytes with new pixel values. But for any 
>>> image file format that supports compression that could lead to varying size 
>>> of the compressed data depending on the pixel values... I'm sure you can 
>>> see why it's hard to change that without having to potentially shift all 
>>> data in the file around.
>>> 
>>> 
>>>> On Jan 29, 2022, at 11:45 AM, Dariusz <dari...@dariuszmakowski.com 
>>>> <mailto:dari...@dariuszmakowski.com>> wrote:
>>>> 
>>>> Hey
>>>> 
>>>> I'm fairly new to this amazing lib. Just trying to wrap my head around it.
>>>> 
>>>> I've opened one of exr files that has multiple layers, I did some edits to 
>>>> few of them and now I'd like tow rite them out again in to file. Either 
>>>> current one, or new one...
>>>> 
>>>> I've started with docs examples & started tweaking it...
>>>> 
>>>> int channels = 6;  // RGBA + 1 RGB channel
>>>> 
>>>> int xres = 640, yres = 480;
>>>> 
>>>> std::vector<float> pixelsOut(xres * yres * channels);
>>>> 
>>>> for (auto x = 1000; x < xres * yres * channels - 1000; ++x) {
>>>>     pixelsOut[x] = (char) rand();
>>>> }
>>>> std::unique_ptr<OIIO::ImageOutput> out = 
>>>> OIIO::ImageOutput::create(filenamex);
>>>> if (!out)
>>>>     return;
>>>> OIIO::ImageSpec spec(xres, yres, channels, OIIO::TypeDesc::FLOAT);
>>>> spec.channelnames = {"R", "G", "B", "LALA","LOLOL", "LILI"};
>>>> spec.channelformats = {OIIO::TypeDesc::FLOAT,
>>>>                         OIIO::TypeDesc::FLOAT,
>>>>                         OIIO::TypeDesc::FLOAT,
>>>>                         OIIO::TypeDesc::FLOAT,
>>>>                         OIIO::TypeDesc::FLOAT,
>>>>                         OIIO::TypeDesc::FLOAT,
>>>> 
>>>>                         };
>>>> out->open(filenamex, spec);
>>>> out->write_image(OIIO::TypeDesc::FLOAT, pixelsOut.data());
>>>> out->close();
>>>> 
>>>> Nowt this will write a nice file for me... but I'd like to understand... 
>>>> if I have 100 channels.... and I might be reading channel from 1 file/ 
>>>> closing it /writing it/etc... How can I eee... add a channel to existing 
>>>> file?
>>>> 
>>>> Regards
>>>> Dariusz
>>>> 
>>>> 
>>>> -- 
>>>> DARIUSZ MAKOWSKi
>>>> CGI-Photographer
>>>> 07 590 530 854
>>>> dari...@dariuszmakowski.com <mailto:dari...@dariuszmakowski.com>
>>>> www.dariuszmakowski.com <http://www.dariuszmakowski.com/>
>>>> 
>>>>  
>>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>>>  Virus-free. www.avast.com 
>>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>>>  
>>>> <x-msg://14/#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>_______________________________________________
>>>> 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 
>>>> <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 <mailto:Oiio-dev@lists.openimageio.org>
>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org 
>>> <http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org>
>> 
>> -- 
>> DARIUSZ MAKOWSKi
>> CGI-Photographer
>> 07 590 530 854
>> dari...@dariuszmakowski.com <mailto:dari...@dariuszmakowski.com>
>> www.dariuszmakowski.com <http://www.dariuszmakowski.com/>
>> 
>> _______________________________________________
>> 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 
>> <http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org>
> 
> -- 
> DARIUSZ MAKOWSKi
> CGI-Photographer
> 07 590 530 854
> dari...@dariuszmakowski.com <mailto:dari...@dariuszmakowski.com>
> www.dariuszmakowski.com 
> <http://www.dariuszmakowski.com/>_______________________________________________
> Oiio-dev mailing list
> Oiio-dev@lists.openimageio.org
> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

--
Larry Gritz
l...@larrygritz.com




_______________________________________________
Oiio-dev mailing list
Oiio-dev@lists.openimageio.org
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to