%PDF- %PDF-
Direktori : /proc/thread-self/root/usr/share/doc/OpenEXR/examples/ |
Current File : //proc/thread-self/root/usr/share/doc/OpenEXR/examples/rgbaInterfaceExamples.cpp |
// // SPDX-License-Identifier: BSD-3-Clause // Copyright (c) Contributors to the OpenEXR Project. // //----------------------------------------------------------------------------- // // Code examples that show how class RgbaInputFile and // class RgbaOutputFile can be used to read and write // OpenEXR image files with 16-bit floating-point red, // green, blue and alpha channels. // //----------------------------------------------------------------------------- #include <ImfRgbaFile.h> #include <ImfStringAttribute.h> #include <ImfMatrixAttribute.h> #include <ImfArray.h> #include "drawImage.h" #include <iostream> #include <algorithm> #include "namespaceAlias.h" using namespace IMF; using namespace std; using namespace IMATH_NAMESPACE; void writeRgba1 (const char fileName[], const Rgba *pixels, int width, int height) { // // Write an RGBA image using class RgbaOutputFile. // // - open the file // - describe the memory layout of the pixels // - store the pixels in the file // RgbaOutputFile file (fileName, width, height, WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (height); } void writeRgba2 (const char fileName[], const Rgba *pixels, int width, int height, const Box2i &dataWindow) { // // Write an RGBA image using class RgbaOutputFile. // Don't store the whole image in the file, but // crop it according to the given data window. // // - open the file // - describe the memory layout of the pixels // - store the pixels in the file // Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); RgbaOutputFile file (fileName, displayWindow, dataWindow, WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (dataWindow.max.y - dataWindow.min.y + 1); } void writeRgba3 (const char fileName[], const Rgba *pixels, int width, int height, const char comments[], const M44f &cameraTransform) { // // Write an RGBA image using class RgbaOutputFile. // Store two extra attributes in the image header: // a string and a 4x4 transformation matrix. // // - open the file // - describe the memory layout of the pixels // - store the pixels in the file // Header header (width, height); header.insert ("comments", StringAttribute (comments)); header.insert ("cameraTransform", M44fAttribute (cameraTransform)); RgbaOutputFile file (fileName, header, WRITE_RGBA); file.setFrameBuffer (pixels, 1, width); file.writePixels (height); } void readRgba1 (const char fileName[], Array2D<Rgba> &pixels, int &width, int &height) { // // Read an RGBA image using class RgbaInputFile: // // - open the file // - allocate memory for the pixels // - describe the memory layout of the pixels // - read the pixels from the file // RgbaInputFile file (fileName); Box2i dw = file.dataWindow(); width = dw.max.x - dw.min.x + 1; height = dw.max.y - dw.min.y + 1; pixels.resizeErase (height, width); file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); file.readPixels (dw.min.y, dw.max.y); } void readRgba2 (const char fileName[]) { // // Read an RGBA image using class RgbaInputFile. // Read the pixels, 10 scan lines at a time, and // store the pixel data in a buffer that is just // large enough to hold 10 scan lines worth of data. // // - open the file // - allocate memory for the pixels // - for each block of 10 scan lines, // describe the memory layout of the pixels, // read the pixels from the file, // process the pixels and discard them // RgbaInputFile file (fileName); Box2i dw = file.dataWindow(); int width = dw.max.x - dw.min.x + 1; Array2D<Rgba> pixels (10, width); while (dw.min.y <= dw.max.y) { file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); file.readPixels (dw.min.y, min (dw.min.y + 9, dw.max.y)); // processPixels (pixels) dw.min.y += 10; } } void readHeader (const char fileName[]) { // // Read an image's header from a file, and if the header // contains comments and camera transformation attributes, // print the values of those attributes. // // - open the file // - get the file header // - look for the attributes // RgbaInputFile file (fileName); const StringAttribute *comments = file.header().findTypedAttribute <StringAttribute> ("comments"); const M44fAttribute *cameraTransform = file.header().findTypedAttribute <M44fAttribute> ("cameraTransform"); if (comments) cout << "comments\n " << comments->value() << endl; if (cameraTransform) cout << "cameraTransform\n" << cameraTransform->value() << flush; } void rgbaInterfaceExamples () { cout << "\nRGBA images\n" << endl; cout << "drawing image" << endl; int w = 800; int h = 600; Array2D<Rgba> p (h, w); drawImage1 (p, w, h); cout << "writing entire image" << endl; writeRgba1 ("rgba1.exr", &p[0][0], w, h); cout << "writing cropped image" << endl; writeRgba2 ("rgba2.exr", &p[0][0], w, h, Box2i (V2i (w/6, h/6), V2i (w/2, h/2))); cout << "writing image with extra header attributes" << endl; writeRgba3 ("rgba3.exr", &p[0][0], w, h, "may contain peanuts", M44f()); cout << "reading rgba file" << endl; readRgba1 ("rgba2.exr", p, w, h); cout << "reading rgba file into 10-scanline buffer" << endl; readRgba2 ("rgba2.exr"); cout << "reading extra file header attributes" << endl; readHeader ("rgba3.exr"); }