openexr-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Openexr-devel] Question about using exr PAI from C


From: Chris Burns
Subject: Re: [Openexr-devel] Question about using exr PAI from C
Date: Sun, 9 Apr 2006 19:43:05 -0700

My bad, I didn't realize OpenEXR was so flexible.  Thanks for
correcting me Florian.  This changes my plans also.

Chris


On 4/7/06, Florian Kainz <address@hidden> wrote:
> Hi Konstantin,
>
> Depending on what you mean by "3D image", OpenEXR may or
> may not be what you want:
>
> Stereo images are easy to support.  Just store two sets of
> image channels, for example, R,G,B for the left-eye view
> (and for compatibility with applications that are not
> stereo-enabled), and Rright,Gright,Bright for the right-
> eye view.  Additional data, such as the distance between
> the eyes, go into custom attributes in the file header.
>
> On the other hand, storing volumetric data is not directly
> supported.  You'd have to resort to tricks such as storing
> a 3D grid with Nx by Ny by Nz voxels as a 2D image vith
> Nx by Ny*Nz pixels, and adding a custom attribute to tell
> applications that the 2D image is really a 3D grid.
>
> If you do decide to use OpenEXR for your project, then I
> would recommend that you use the C++ API.  The C++ API is
> described in our programming tutorial, available at this
> URL: http://www.openexr.com/ReadingAndWritingImageFiles.pdf
>
> The C API was written for situations where an OpenEXR driver
> must be fitted into existing C software, and where compiling
> the driver code with a C++ compiler is not an option.
> The C API is rather limited compared to what C++ offers.
>
> The entire C API is defined in header file ImfCRgbaFile.h.
> The functions declared in this header are simply wrappers
> about the corresponding C++ functions.  For example,
>
>      ImfOutputFile *out = ...;
>      ImfOutputSetFrameBuffer (out, base, xStride, yStride);
>      ImfOutputWritePixels (out, numScanlines);
>
> is equivalent to
>
>      Imf::RgbaOutputFile out ...;
>      out->setFrameBuffer (base, xStride, yStride);
>      out->writePixels (numScanlines);
>
> One difference between the C and C++ APIs is how errors
> are reported.  The C API uses return values:
>
>      ImfOutputFile *out = ...;
>
>      if (!out ||
>          !ImfOutputSetFrameBuffer (out, base, xStride, yStride) ||
>          !ImfOutputWritePixels (out, numScanlines))
>      {
>          printf ("%s\n", ImfErrorMessage);
>      }
>
> The C++ API uses exceptions:
>
>      try
>      {
>          ImfOutputFile *out = ...;
>          ImfOutputSetFrameBuffer (out, base, xStride, yStride);
>          ImfOutputWritePixels (out, numScanlines);
>      }
>      catch (std::exception &e)
>      {
>          printf ("%s\n", e.what());
>      }
>
> Hope this helps,
>
> Florian
>
>
> P.S.: I'd have to disagree with Chris Burns regarding OpenEXR's
> ability to store custom data.  OpenEXR allows you to define your
> own "attributes", which are OpenEXR's equivalent to TIFF "tags",
> and you can store any number of image channels.
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]