The old Photoshop plugin reads and writes a single scanline at a time, so that might also be useful to look at.
The source is available here:
And the relevant code is in EXRFormatPlugin.cpp. See EXRFormatPlugin::DoReadContinue and EXRFormatPlugin::DoWriteStart. I don't know if the plugin will actually compile anymore, unfortunately. I stopped maintaining it when Photoshop got native EXR support.
- Paul
On Dec 14, 2009, at 10:01 AM, Jonathan Litt wrote: It's almost exactly like the general interface examples in the distribution (generalInterfaceExamples.cpp -> writeGZ1 & writeGZ2), but you would put a loop around that whole chunk of code. Your buffers should each be the size of one scanline, and you need to recreate the framebuffer object for each scanline because you're going to pass the same pixel buffers each time but give them a different offset into the file. The key thing to get right is the second argument to the Slice() object that you pass to each call of framebuffer.insert(), because that is where the offset will go. That is how writePixels knows where to start. Perhaps the closest example of this is in the function "readGZ1", although that is for reading a datawindow and not writing scanlines.
I agree it would be nice if there were an example of this in the distribution.
-Jonathan
From: Koraxen <address@hidden> To: Florian Kainz <address@hidden> Cc: address@hidden Sent: Thu, December 10, 2009 10:34:44 AM Subject: Re: [Openexr-devel] Writing single EXR file with very many channels?
More precisely: generateScanline(1) write scanline1 of channel1 write scanline1 of channel2 write scanline1 of channel3 write scanline1 of channel4 free() mem generateScanline(2) write scanline2 of channel1 write scanline2 of channel2 write scanline2 of channel3 write scanline2 of channel4 free() mem .. and so forth. The writePixels( int height ) function will write a given number of scanlines, but not a specific scanline? - K. On Thu, Dec 10, 2009 at 10:26 AM, Koraxen <address@hidden> wrote: Thanks for the reply Florian!
Do you know of any example that shows scanlines being written 1 at a time?
As in: write scanline1 of channel1 write scanline1 of channel2 write scanline1 of channel3 write scanline1 of channel4 free() mem
write scanline2 of channel1 write scanline2 of channel2 write scanline2 of channel3 write scanline2 of channel4 free() mem
...and so forth.
I can find one for tiled files in the ReadingAndWritingImageFiles pdf, but not for scanline.
Thanks again, - K.On Wed, Dec 9, 2009 at 11:20 AM, Florian Kainz <address@hidden> wrote: Hi Kora,
the IlmImf library does not allow writing the file channel by channel; all channels must be written at the same time. The OpenEXR file layout would channel-by-channel writing very inefficient. However, you can write a few scanlines at a time or a few tiles at a time; your frame buffer only has to be large enough to hold the portion of the image you are writing. (In the extreme, a single scan line or a single tile is enough.)
Florian
Koraxen wrote:
Hey guys,
I have a question regarding how to deal memory consumption and multi-layered EXR files.
I need to write an EXR file that contains 10 different versions of a same high res (5120 x 2880) image. This translates into an EXR file that contains 10 layers x 4 channels = 40 channels.
What I am doing is: 1. Instantiate an exr framebuffer 2. Allocate memory for 40 high-res channels, and insert() them all into framebuffer 3. Instantiate OutputFile object, and set the framebuffer to it 4. Write the OutputFile
The problem is that host system obviously runs out of memory during step #2.
What's needed here is the ability to: - Insert a channel to framebuffer - Write it to disk - Free memory - Repeat 40 times - End up with a *single* EXR file containing 40 channels
How can this be done?
Thanks a ton! - Kora
------------------------------------------------------------------------
_______________________________________________ Openexr-devel mailing list address@hiddenhttp://lists.nongnu.org/mailman/listinfo/openexr-devel
|