openframeworks addon for applying Core Image Filters on ofImages
Objective-C++ C++ Makefile Objective-C C
Latest commit 1942994 Jan 16, 2017 @Ahbee with renderer
Permalink
Failed to load latest commit information.
example_camera update examples the right way Jan 16, 2017
example_simple with renderer Jan 16, 2017
src
.gitignore update Readme May 28, 2014
README.md Update README.md Jan 16, 2017

README.md

ofxCoreImageFilters

ofxCoreImage Filters allows you to apply Core Image filters on ofImages. See the Core Image Filter Reference for the full list of available effects.

Features

  • Supports all 173 filters
  • Works with openGl 3.2+ and the programmable renderer.

How to use

Step 1 Change source files to objective c++

Every source file in which you include "ofxCI.h", must be marked as objective c++. To do this select the file, open the file inspector (option+command + 1) and select objective c++ as the type. Some people might say to change the extension from .cpp to .mm, but this does not always work(better to do both).

step 2 Setup and configure a filter

calling setup creates the filter and sets it up with default parameters. To see list of filter types look at the file ofxCIConstants.h. For full documentation refer to the Core Image Filter Reference

 ofxCIFilter parallelogram;
 parallelogram.setup(OFX_FILTER_TYPE_PARALLELOGRAM_TILE);

call getAvailableSettings() to view parameters

parallelogram.getAvailableSettings();

getAvailableSettings() will print the name,type,and range of each parameter. Usually any parameters that have the word 'Image' in them are mandatory to set. parallelogram.getAvailableSettings() will print the following.

CIParallelogramTile:
inputImage          type:ofImage
inputCenter         type:ofVec2f
inputAngle          type:float        range: -3.14159 to 3.14159
inputAcuteAngle     type:float        range: -3.14159 to 3.14159
inputWidth          type:float        range: 1 to 200

you set the parameters like this

    ofImage myInput;
    myInput.loadImage("picture.jpg");
    parallelogram.setInputImage(myInput);
    parallelogram.setInputCenter(ofVec2f(123,45));
    parallelogram.set("inputAcuteAngle",1.4f);
    parallelogram.setInputWidth(20.0);

Common parameters like "inputImage" and "inputCenter" have built in functions to set them. For less common parameters like "inputAcuteAngle" you must use the function

ofxCIFilter::set(string parameterName, T value)

step 3 Get the output of a filter

call getOutput(const ofImage &outImage) to get the output image. This function deletes whatever was previously in the outImage and creates a new image.

    ofImage outImage;
    parallelogram.getOutput(outImage);

    // do whatever you want with outImage
    // ...

Chaining Filters

One way to chain filters is to pass the output of one filter into the input of another. But a more efficient way is to use an ofxCIFilterChain. It is more efficient because it skips the conversion steps between ofImage and CIImage;

Example use of an ofxCIFilterChain.

    ofImage input;
    input.loadImage("picture.png");

    ofxCIFilter blur;
    ofxCIFilter edges;
    ofxCIFilter gloom;

    blur.setup(OFX_FILTER_TYPE_GAUSSIAN_BLUR);
    blur.setInputImage(input);
    edges.setup(OFX_FILTER_TYPE_EDGES);
    gloom.setup(OFX_FILTER_TYPE_GLOOM);

    ofxCIFilterChain chain;
    chain.addFilter(blur);
    chain.addFilter(edges);
    chain.addFilter(gloom);

    ofImage output;
    chain.getOutput(output);

You only have to set 'inputImage' on the first filter. ofxCIFilterChain only takes a weak reference to the filters so make sure each filter you added is still around in memory when you call getOutput() on the chain.


Credits

Thanks @laserpilot whose original Core Image addon served as a foundation