# ImageWriter

Writes image files to disk using OpenImageIO. All file types supported by OpenImageIO are supported by the ImageWriter.

## user

Container for user-defined plugs. Nodes should never make their own plugs here, so users are free to do as they wish.

Input connections to upstream nodes which must be executed before this node.

Input connections to nodes which must be executed after this node, but which don’t need to be executed before downstream nodes.

Output connections to downstream nodes which must not be executed until after this node.

## dispatcher

Container for custom plugs which dispatchers use to control their behaviour.

## dispatcher.batchSize

Maximum number of frames to batch together when dispatching tasks. If the node requires sequence execution batchSize will be ignored.

## dispatcher.immediate

Causes this node to be executed immediately upon dispatch, rather than have its execution be scheduled normally by the dispatcher. For instance, when using the LocalDispatcher, the node will be executed immediately in the dispatching process and not in a background process as usual.

When a node is made immediate, all upstream nodes are automatically considered to be immediate too, regardless of their settings.

## in

The image to be written to disk.

## fileName

The name of the file to be written. File sequences with arbitrary padding may be specified using the ‘#’ character as a placeholder for the frame numbers.

Supported file extensions : bmp, dib, cin, dds, dpx, fits, hdr, rgbe, ico, iff, z, jpg, jpe, jpeg, jif, jfif, jfi, jp2, j2k, j2c, null, nul, exr, sxr, mxr, png, ppm, pgm, pbm, pnm, pfm, psd, pdd, psb, bay, bmq, cr2, crw, cs1, dc2, dcr, dng, erf, fff, k25, kdc, mdc, mos, mrw, nef, orf, pef, pxn, raf, raw, rdc, sr2, srf, x3f, arw, 3fr, cine, ia, kc2, mef, nrw, qtk, rw2, sti, rwl, srw, drf, dsc, ptx, cap, iiq, rwz, cr3, rla, sgi, rgb, rgba, bw, int, inta, socket, pic, tif, tiff, tx, env, sm, vsm, tga, tpic, term, zfile, osl, oso, oslgroup, oslbody

## channels

The names of the channels to be written to the file. Names should be separated by spaces and may contain any of Gaffer’s standard wildcards.

## colorSpace

The colour space of the output image, used to convert the input image from the scene linear colorspace defined by the OpenColorIO config. The default behaviour is to automatically determine the colorspace by calling the function registered with ImageWriter::setDefaultColorSpaceFunction().

## out

A pass-through of the input image.

## layout

Controls where channels are placed in the file, including how they are named. “Single part” writes all channels to the same part ( all interleaved ). “Part per layer” writes a separate part for each layer, so they may be loaded independently for better performance, and is the default. “Part per view” is a compromise, where layers are not separated, but views are separated, so that stereo files can use independent data windows.

There is also the option to use a layout that matches Nuke’s default behaviour, but does not conform to the EXR specification. The Nuke presets match “Part per Layer”, “Part per View”, and “Single Part” respectively, but with the following deviations from the specification :

• The layer name is omitted from the channel name

• Custom channels from the main layer are placed in a part named other

• The channel Z from the main layer is placed in a part named depth

• The RGBA channels from secondary layers are renamed to red, green, blue, and alpha

• When writing single part stereo, the view name comes before the layer name

You may also pick “custom”, and set up your own layout. This allows for things like a mixed layout that is partially EXR spec compliant, and partially Nuke. Or you could use a expression to group some layers together in the same part.

## layout.partName

Specifies the name to be stored in EXR’s part name metadata.

If different channels are given different part names, then a multipart file is produced.

Special context variables available for setting layout plugs:

• ${imageWriter:viewName} : The current view • ${imageWriter:channelName} : The current channel name

• ${imageWriter:layerName} : The prefix of the channel name • ${imageWriter:baseName} : The suffix of the channel name

• ${imageWriter:standardPartName} : Like the layerName, but set to “rgba” instead of empty for the main layer • ${imageWriter:nukeViewName} : Like viewName, but set to “main” when there is no current view

• ${imageWriter:nukeLayerName} : Like layerName, but set to “depth” for “Z”, and “other” for custom channels of the main layer • ${imageWriter:nukeBaseName} : Like baseName, but set to “red”, “green”, “blue”, “alpha” instead of RGBA for layers other than the main layer.

• ${imageWriter:nukePartName} : Like standardPartName, but set to “depth” for “Z”, and “other” for custom channels of the main layer • ${imageWriter:singlePartViewName} : The current view, or “” if this is the first view. This should be used to compose channel names for single-part multi-view EXR files.

## layout.channelName

Specifies the channel name to be given to EXR. To match the standard, this should just be exactly the Gaffer channel name. But some other software like Nuke omits the layer prefix, and assumes that the part name will be prefixed to the channel.

Special context variables available for setting layout plugs:

• ${imageWriter:viewName} : The current view • ${imageWriter:channelName} : The current channel name

• ${imageWriter:layerName} : The prefix of the channel name • ${imageWriter:baseName} : The suffix of the channel name

• ${imageWriter:standardPartName} : Like the layerName, but set to “rgba” instead of empty for the main layer • ${imageWriter:nukeViewName} : Like viewName, but set to “main” when there is no current view

• ${imageWriter:nukeLayerName} : Like layerName, but set to “depth” for “Z”, and “other” for custom channels of the main layer • ${imageWriter:nukeBaseName} : Like baseName, but set to “red”, “green”, “blue”, “alpha” instead of RGBA for layers other than the main layer.

• ${imageWriter:nukePartName} : Like standardPartName, but set to “depth” for “Z”, and “other” for custom channels of the main layer • ${imageWriter:singlePartViewName} : The current view, or “” if this is the first view. This should be used to compose channel names for single-part multi-view EXR files.

## matchDataWindows

For multi-view images, sets the data windows to be the same for all views, by expanding them all to include the union of all views. Wastes disk space and processing time, but is required by Nuke for multi-view images.

## openexr

Format options specific to OpenEXR files.

## openexr.mode

The write mode for the OpenEXR file - scanline or tiled data.

## openexr.compression

The compression method to use when writing the OpenEXR file.

## openexr.dwaCompressionLevel

The compression level used when writing files with DWAA or DWAB compression. Higher values decrease file size at the expense of image quality.

## openexr.dataType

The data type to be written to the OpenEXR file. If you want to use different data types for different channels, you can drive this with an expression or spreadsheet, which may use the same context variables as the layout plugs ( the useful ones are ${imageWriter:channelName}, ${imageWriter:layerName} and \${imageWriter:baseName}, for the whole channel name, and for the prefix and suffix respectively ).

## openexr.depthDataType

Overriding the data type for depth channels is useful because many of the things depth is used for require greater precision. This is a simple override which sets Z and ZBack to float precision. If you want to do something more complex, set this to Use Default, and connect an expression or spreadsheet to the Data Type plug.

## dpx

Format options specific to DPX files.

## dpx.dataType

The data type to be written to the DPX file.

## tiff

Format options specific to TIFF files.

## tiff.mode

The write mode for the TIFF file - scanline or tiled data.

## tiff.compression

The compression method to use when writing the TIFF file.

## tiff.dataType

The data type to be written to the TIFF file.

## field3d

Format options specific to Field3D files.

## field3d.mode

The write mode for the Field3D file - scanline or tiled data.

## field3d.dataType

The data type to be written to the Field3D file.

## fits

Format options specific to FITS files.

## fits.dataType

The data type to be written to the FITS file.

## iff

Format options specific to IFF files.

## iff.mode

The write mode for the IFF file - scanline or tiled data.

## jpeg

Format options specific to Jpeg files.

## jpeg.compressionQuality

The compression quality for the Jpeg file to be written. A value between 0 (low quality, high compression) and 100 (high quality, low compression).

## jpeg.chromaSubSampling

The chroma sub sampling used to write the jpeg file. Note that the file will be stored as YCbCr instead of RGB.

## jpeg2000

Format options specific to Jpeg2000 files.

## jpeg2000.dataType

The data type to be written to the Jpeg2000 file.

## png

Format options specific to PNG files.

## png.compression

The compression method to use when writing the PNG file.

## png.compressionLevel

The compression level of the PNG file. This is a value between 0 (no compression) and 9 (most compression).

## rla

Format options specific to RLA files.

## rla.dataType

The data type to be written to the RLA file.

## sgi

Format options specific to SGI files.

## sgi.dataType

The data type to be written to the SGI file.

## targa

Format options specific to Targa files.

## targa.compression

The compression method to use when writing the Targa file.

## webp

Format options specific to WebP files.

## webp.compressionQuality

The compression quality for the WebP file to be written. A value between 0 (low quality, high compression) and 100 (high quality, low compression).