Hi Nicholas,

I suspect you'd be better off using the generic interface. There is an
example in the docs that speaks to the computation of the offsets required
to achieve just such a thing.

-Piotr

On 23 June 2015 at 16:21, Nicholas Yue <yue.nicho...@gmail.com> wrote:

> Hi,
>
>   I have having difficult working out the correct stride logic to write
> one scanline at a time to an OpenEXR file.
>
>   The example code shows write the entire array in memory but I only have
> access to a single scanline at a time.
>
>   I want to minimize the memory usage by not storing the entire image
> before writing.
>
>   Here is the code.
>
>   Thanks in advance.
>
> #include <stdio.h>
> #include <string>
> #include <OpenEXR/ImfOutputFile.h>
> #include <OpenEXR/ImfArray.h>
> #include <OpenEXR/ImfCompression.h>
> #include <OpenEXR/ImfChannelList.h>
> #include <OpenEXR/ImfRgba.h>
>
> // This is currently NOT working but would be a useful example to have
>
> void writeIncrementalScanline (const std::string& fileName,
>    int width,
>    int height)
> {
> float pixelAspectRatio = 1;
> const Imath::V2f screenWindowCenter = Imath::V2f (0, 0);
> float screenWindowWidth = 1;
> Imf::LineOrder lineOrder = Imf::INCREASING_Y;
> Imf::Compression compression = Imf::ZIPS_COMPRESSION;
> Imf::Header header(width, height,
>    pixelAspectRatio,
>    screenWindowCenter,
>    screenWindowWidth,
>    lineOrder,
>    compression);
>
> header.channels().insert("rgba.R",Imf::Channel(Imf::HALF));
> header.channels().insert("rgba.G",Imf::Channel(Imf::HALF));
> header.channels().insert("rgba.B",Imf::Channel(Imf::HALF));
> header.channels().insert("rgba.A",Imf::Channel(Imf::HALF));
> Imf::OutputFile file (fileName.c_str(), header);
> Imf::FrameBuffer framebuffer;
>
> Imf::Array2D<half> redBuffer(width,1);
> Imf::Array2D<half> greenBuffer(width,1);
> Imf::Array2D<half> blueBuffer(width,1);
> Imf::Array2D<half> alphaBuffer(width,1);
> half colorChannelGreyScaleDelta = 1.0f/float(height-1);
> std::cout << "colorChannelGreyScaleDelta = " << colorChannelGreyScaleDelta
> << std::endl;
> std::cout << "height * colorChannelGreyScaleDelta = " << height *
> colorChannelGreyScaleDelta << std::endl;
>
>
> size_t xStride = sizeof(half) * 1;
> size_t yStride = width;
>
> const half *redPixels   = &redBuffer[0][0];
> const half *greenPixels = &greenBuffer[0][0];
> const half *bluePixels  = &blueBuffer[0][0];
> const half *alphaPixels = &alphaBuffer[0][0];
>
> framebuffer.insert("rgba.R",
>    Imf::Slice(Imf::HALF,
>   (char *)redPixels,
>   xStride,
>   yStride));
> framebuffer.insert("rgba.G",
>    Imf::Slice(Imf::HALF,
>   (char *)greenPixels,
>   xStride,
>   yStride));
> framebuffer.insert("rgba.B",
>    Imf::Slice(Imf::HALF,
>   (char *)bluePixels,
>   xStride,
>   yStride));
> framebuffer.insert("rgba.A",
>    Imf::Slice(Imf::HALF,
>   (char *)alphaPixels,
>   xStride,
>   yStride));
>
>
> for (int h=0;h<height;h++)
> {
> half grey_scale_value = colorChannelGreyScaleDelta * h;
> for (int w=0;w<width;w++)
> {
> redBuffer[w][0]   = 1.;//grey_scale_value;
> greenBuffer[w][0] = 1.;//grey_scale_value;
> blueBuffer[w][0]  = 1.;//grey_scale_value;
> alphaBuffer[w][0] = 1.;
> }
>
> file.setFrameBuffer(framebuffer);
> file.writePixels();
>
> }
> }
>
> int main()
> {
>     const std::string fileName("IncrementalScanline.exr");
>
>     const int width = 256;
>     const int height = 512;
>     writeIncrementalScanline (fileName, width, height);
>
>     return 0;
> }
>
> Cheers
> --
> Nicholas Yue
>
>
> _______________________________________________
> Openexr-devel mailing list
> Openexr-devel@nongnu.org
> https://lists.nongnu.org/mailman/listinfo/openexr-devel
>
>
_______________________________________________
Openexr-devel mailing list
Openexr-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/openexr-devel

Reply via email to