filter()
Image / PixelsDescription
Applies a filter to the display. Available filters: GRAY, INVERT, THRESHOLD.
Syntax
void filter(int mode)
void filter(int mode, float param)
Parameters
| Name | Type | Description |
|---|---|---|
| mode | int | GRAY, INVERT, THRESHOLD, BLUR_FILTER, POSTERIZE |
| param | float | parameter for some filters (optional) |
Returns
voidRelated
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());
}