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!


and


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> 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
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
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

--
DARIUSZ MAKOWSKi
CGI-Photographer
07 590 530 854
dari...@dariuszmakowski.com
www.dariuszmakowski.com


--
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
_______________________________________________
Oiio-dev mailing list
Oiio-dev@lists.openimageio.org
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to