## gegl-chain

A serialization format for GEGL graphs that grew out of the desire to write one-liner image processing tasks on the commandline.

Everything after — in a GEGL commandline that contains an input image is considered the chain of operations.

    $ gegl input.jpg -o output.png -- noise-reduction unsharp-mask

If GEGL is built linking to micro raptor gui, the gegl binary can also act as an image viewer as well as visualizer for the result of chains of operations.

    $ gegl input.jpg -- noise-reduction unsharp-mask

If an argument on the commandline part of the chain contains a = it is a property assignment for the preceding operation. For example:

    $ gegl in.jpg -- noise-reduction iterations=4 unsharp-mask

If you try to assign a property that doesn’t exist, the error message will contain a list of valid properties for the operation.

The format treats input and output pads as explicitly linked when they follow each other, to create a sub-chain hooked up to an aux input assign the aux pad with the sub chain contained in square brackets, like this:

    $ gegl in.jpg -- noise-reduction iterations=2 over aux=[ text string='hello there' color=white size=32 translate x=100 y=100 dropshadow radius=2 x=1.5 y=1.5 ]

And it is also possible to create reference in the chain, reusing permitting creating masks for color adjustments based on image content, for instance the following example, which uses a blurred version of an image as a threshold mask - which thus becomes a local content dependent thresholding filter.

    $ gegl in.jpg -- id=a threshold aux=[ ref=a gaussian-blur std-dev-x=120 std-dev-y=120 ]

When it is more reasonable to specify dimensions relative to the height of an image - similar to CSS vh dimensions, GEGL can use a "rel" suffix similar to the CSS vh unit, on the commandline and in other tools, a scaling factor to scale "rel" units is passed with the parsing API.

    $ gegl in.jpg -- id=a threshold aux=[ ref=a gaussian-blur std-dev-x=0.1rel std-dev-y=0.1rel ]

If gegl have working gegl:ff-load and gegl:ff-save ops, The gegl binary also permits simple forms of video processing, like the following:

    $ gegl input.mp4 -o output.ogv -- scale-size x=160 y=120 newsprint period=4

If you want to create a GIF as the final output, it is recommended to create a temporary video file, and use for instance ffmpeg to create a high quality GIF with a two pass approach.

### Color management

Since GEGL-0.4.6 gegl is fully color managed and in addition to pixel data flowing through the chain Color Space Profiles specifying the CIE xy chromaticities and white point of the data.

For files that contain ICC profiles, the ICC profile is preferred over chromaticities. For example EXR files use chromaticities if set and falls back to sRGB primaries when none are specified.

The current color space at the end of the chain gets written by file savers for the file formats png, jpg, tif and exr.

Convert from jpg to png keeping ICC profile:

    $ gegl input.jpg -o output.png

Scale to a thum-image 128px high, keeping ICC profile, the scaling will be performed in "RaGaBaA float" a linear encoding of the color space, wheras the file format export will bring it back to R’G'B' u8.

    $ gegl input.jpg -o thumb.jpg -- scale-size-keepaspect x=-1 y=128

Output ICC profile found in input image to a file:

    $ gegl input.jpg -o output.icc

Convert image to sRGB:

    $ gegl input.jpg -o output.jpg -- convert-space name=sRGB

Convert image to sRGB and do value-invert, we do a rgb-clip op before the invert.

    $ gegl input.jpg -o output.jpg -- convert-space name=sRGB rgb-clip value-invert

Convert image to profile ICC profile custom.icc from disk:

    $ gegl input.jpg -o output.jpg -- convert-space path=custom.icc

Convert image to profile ICC profile contained in other.jpg:

    $ gegl input.jpg -o output.jpg -- convert-space aux=[ load path=other.jpg  ]

Override color space with ProPhoto:

    $ gegl input.jpg -o output.jpg -- cast-space name=ProPhoto

Overlay an sRGB watermark on arbitrary file:

    $ gegl input.jpg -o output.jpg -- over aux=[ load path="watermark.png"  ]

Note that no special handling was needed, what happens is that the icc profile coming on the main input pad of the over op wins and becomes the working space the auxiliary buffers contents gets converted to this buffers compositing and blending spaces.

Perform shadows-highlights op, with default settings in ProPhoto RGB, and cast back to the original space when done:

    $ gegl input.jpg -o output.jpg -- id=original_space cast-space name=ProPhoto shadows-highlights cast-space aux=[ ref=original_space  ]