filter()

Image / Pixels

Description

Applies a filter to the display. Available filters: GRAY, INVERT, THRESHOLD.

Syntax

void filter(int mode) void filter(int mode, float param)

Parameters

NameTypeDescription
modeintGRAY, INVERT, THRESHOLD, BLUR_FILTER, POSTERIZE
paramfloatparameter for some filters (optional)

Returns

void

Related

Under the Hood

From Processing.h:

void filter(int mode) { for (auto& p : pixels) { int r=(p>>16)&0xFF, g=(p>>8)&0xFF, b=p&0xFF, a=(p>>24)&0xFF; if (mode == GRAY) { int gr=(r+g+b)/3; p=(a<<24)|(gr<<16)|(gr<<8)|gr; } else if (mode == INVERT) { p=(a<<24)|((255-r)<<16)|((255-g)<<8)|(255-b); } else if (mode == THRESHOLD) { int gr=(r+g+b)/3; int t=gr>127?255:0; p=(a<<24)|(t<<16)|(t<<8)|t; } } dirty = true; } void filter(int mode); void filter(int mode, float param);

Under the Hood

From Processing.cpp:

void PApplet::filter(int mode) { filter(mode, 0.5f); } void PApplet::filter(int mode) { filter(mode, 0.5f); void PApplet::filter(int mode, float /*param*/) { int total = winWidth * winHeight; std::vector<unsigned char> buf(total * 4); glReadPixels(0, 0, winWidth, winHeight, GL_RGBA, GL_UNSIGNED_BYTE, buf.data()); for (int i = 0; i < total; i++) { int r = buf[i*4], g = buf[i*4+1], b = buf[i*4+2]; int grey = (r + g + b) / 3; if (mode == GRAY) { buf[i*4] = buf[i*4+1] = buf[i*4+2] = (unsigned char)grey; } else if (mode == INVERT) { buf[i*4] = 255 - r; buf[i*4+1] = 255 - g; buf[i*4+2] = 255 - b; } else if (mode == THRESHOLD) { unsigned char t = (grey > 127) ? 255 : 0; buf[i*4] = buf[i*4+1] = buf[i*4+2] = t; } } glDrawPixels(winWidth, winHeight, GL_RGBA, GL_UNSIGNED_BYTE, buf.data()); }