Ce programme réalisé sur Processing propose différents filtres à appliquer sur sa webcam pour ensuite prendre en photo.Pour ce programme la bibliothèque vidéo de processing sera nécessaire.La bibliothèque controlP5 utilisé pour la création de boutons n'est pas nécessaire ici car les boutons sont réalisés dans une classe nommée bouton. Pour se prendre en photo, il faut appuyer sur la touche ENTRÉE. Les 8 filtres ont chacun leur particularités :
/*
Thomas Leloup
Programme webcam/boutons/applications de filtres
À améliorer = l'ergonomie des boutons et les filtres
*/
//importation librairie vidéo
import processing.video.*;
//attribut balle pong
ArrayList collectionBalle;
int Nballes = 100; // nombre de balles pour l'effet balle
//tableau des boutons
button[] ton;
//attribut boolean pour bouton
boolean overBox = false;
boolean locked = false;
boolean singlePress = false;
//boîte de particules de pluie
Drop[] drops = new Drop[500];
//attribut pour trame de points
ArrayList<Circle> circles;
int space;
//attribut pour la création de neige
PVector xx, yy, fcx, fcy, sx, sy;
int seed = 0, cell = 15;
Boolean randomized = true;
//attribut typographie
PFont font;
//déclaration de la caméra
Capture cam;
///////////////////////////////////////////////////////////////////////////////////
void setup() {
//taille zone de travail
size(1280, 760);
//on attribue la webcam à la caméra puis démarrage
cam = new Capture(this, width, height-40);
cam.start();
//initialisation de l'effet neige
Boolean randomized = true;
initialize();
//mode de couleur RVB
colorMode(RGB);
// initialisation du tableau de boutton
ton = new button[8];
//initialisation des boutons
for (int i=0;i<8;i++){
ton[i] = new button();
}
//les balles ont une nouvelle boîte
collectionBalle = new ArrayList();
//pour i compris entre 0 et nombre de balles
for(int i = 0; i<Nballes; i++){
// création du vecteur position
PVector p = new PVector(floor(random(50,width-50)), // x
floor(random(50,height-50))); //y
// création du vecteur position
PVector d = new PVector(floor(random(-8,8)), //dx
floor(random(-8,8))) ; //dy
//instanciation d'une nouvelle balle de classe balle
balle nouvelleBalle = new balle(
p,// vecteur position
color(random(0,255),random(0,255),random(0,255)),
floor(random(5,30)), //20, // d
d// vecteur déplacement
);
//ajouter la nouvelleballe à la collection
collectionBalle.add(nouvelleBalle);
}
//pour i compris entre 0 et taille du drop(chute d'eau)
for (int i = 0; i < drops.length; i++) {
//chute des gouttes i prend les valeurs de la classe drop
drops[i] = new Drop(); // instanciation de la ième "drop"
}
//pointes de trame
circles = new ArrayList();
//distance entre les points
space = 60;
//ajout de points dans la zone de travail en fonction de l'espace entre les balles et les balles
for (int i = -2 * space ; i <= (width) + space; i += space) {
for (int j = -2 * space ; j <= (height) + space; j += space) {
circles.add(new Circle(i, j));
}
}
}
///////////////////////////////////////////////////////////////////////////////////
// initialisation des flocons de neige
void initialize() {
seed += frameCount;
randomSeed((int)random(1000) + frameCount);
//coordonnées pour les flocons de neige
xx = new PVector(random(10, 110), random(10, 110));
yy = new PVector(random(10, 110), random(10, 110));
sx = new PVector(random(30, 70), random(30, 70));
sy = new PVector(random(30, 70), random(30, 70));
fcx = new PVector(random(20, 70), random(20, 70));
fcy = new PVector(random(20, 70), random(20, 70));
}
///////////////////////////////////////////////////////////////////////////////////
void draw() {
//30 images par seconde
frameRate(30);
//fond noir
background(0);
//si caméra est disponible, la lire
if (cam.available() == true) {
cam.read();
}
//la zone de travail est rempli par la caméra
image(cam, 0,0);
//dessin des boutons (couleurs et positions)
for (int i=0; i<8; i ++){
ton[i].draw(i*width/8,height-40,width/8,40);
}
//définition typographie et placement sur la zone de travail
pushStyle();
font = createFont("Montserrat-SemiBold.ttf", 14);
textFont(font);
fill(255);
text("Saturation", 0*width/8 +44, height-15);
text("Déformation", 1*width/8 +38, height-15);
text("Pong", 2*width/8 +63, height-15);
text("Pluie", 3*width/8 +63, height-15);
text("Trame", 4*width/8 +60, height-15);
text("Neige", 5*width/8 +60, height-15);
text("Noir & Blanc", 6*width/8 +38, height-15);
text("Négatif", 7*width/8 +58, height-15);
popStyle();
///////////////////////////////////////////////////////////////////////////////////
//BOUTON 1 SATURATION
if(ton[0].clicked()){ //au clic (voir class bouton)
bouton1();
}
///////////////////////////////////////////////////////////////////////////////////
//BOUTON 2 DÉFORMATION
else if(ton[1].clicked()){
for (int i = 0; i < width; i = i+10) {
for (int j = 0; j < height-40; j = j+10) {
pushStyle();
stroke(cam.get(i, j));
fill(cam.get(i, j)); // rempli de la caméra
ellipse(i, j, 10,10); // sur des ellipses
popStyle();
}}
fill(255,50); //bouton déformation rempli
rect(1*width/8,height-40,width/8,40);
}
///////////////////////////////////////////////////////////////////////////////////
//BOUTON 3 PONG
else if(ton[2].clicked()){
//pour i compris entre 0 et la taille de la collection
for(int i=0;i<collectionBalle.size();i++){
pushStyle();
noStroke();
fill(cam.get(0,height)*4); //les balles prennent les couleurs de la caméra
//selectionner la balle i du arraylist
balle b = (balle) collectionBalle.get(i);
// affiche la bal