Ciao a tutti ho un problema con un progetto che utilizza processing. Il testo è questo:
-Il programma consente di modificare un’immagine cambiando tonalità di alcuni pixel. Il
programma decide se modificare o no il pixel in base ad un valore casuale(*). Un click del mouse
avvia il processo di alterazione casuale dei pixel. I pixel devono essere modificati di continuo. Un
nuovo click del mouse ferma la trasformazione dell’immagine. Un nuovo click fa ripartire la
trasformazione, e così via.
-La pressione dei tasti ‘+’ e ‘-’ altera i parametri che definiscono la modifica dell’immagine, come
illustrato più avanti.
• Il compito deve essere svolto mediante la funzione creaImmagine(), che accetta in
ingresso un oggetto di tipo PImage e rende in uscita un oggetto di tipo PImage, che sarà
l’immagine modificata come da specifiche, e la funzione calcolaPixel(), che accetta in
ingresso un oggetto di tipo Color e rende in uscita un oggetto di tipo Color, che sarà Il pixel
modificato come da specifiche.
• creaImmagine() crea una nuova immagine utilizzando su ciascun pixel la funzione
calcolaPixel()
• calcolaPixel() calcola il nuovo pixel nel seguente modo.
Siano r,g,b i livelli di canale di un pixel.
Sia soglia un valore numerico (globale float) posto inizialmente a 0.5.
Sia r un valore casuale(*) compreso tra 0 e 1, generato per ogni pixel
Se r>soglia, allora la funzione lascia il pixel inalterato.
Altrimenti il programma calcola i nuovi valori rm, gm, bm , (che definiscono il pixel
modificato) nel seguente modo;
rm=0.393*r+0.769*g+0.189*b
gm=0.349*r+0.686*g+0.168*b
bm=0.272*r+0.534*g+0.131*b
In ogni caso i valori finali di r, g, b devono essere valori leciti, cioè compresi tra 0 e 255.
-Inoltre, quando l'utente preme il tasto "+" la soglia viene incrementata di 0.1. Quando l'utente
preme il tasto "-" la soglia viene decrementata di 0.1.
Sono da implementare le funzioni creaImmagine() e calcolaPixel
(*)
La funzione per generare numeri casuali è la funzione random() di processing. La funzione prende
in ingresso due float, il primo è l'estremo inferiore e il secondo è l'estremo superiore. La funzione
restituisce un float compreso tra l'estremo inferiore e l'estremo superiore non incluso.
il codice:
int x_0,y_0;
float soglia;
PImage tmp__img;
volatile boolean tmp__i;
void image()
{
tmp__i = false;
tmp__img = null;
selectInput("Select a file to process:", "fileSelected", null, this);
}
void fileSelected(File selection1) {
if (selection1 == null) {
print("Window was closed or the user hit cancel.\n");
} else {
tmp__img=loadImage(selection1.getAbsolutePath().toString());
tmp__i=true;
}
}
PImage getImage()
{
image();
while (tmp__i==false)
{
delay(100);
}
if (tmp__img==null)
{
PImage img1 = new PImage();
return img1;
}
return tmp__img;
}
PImage img;
void mouseClicked() {
for (int i = 0; i < img.width; i++) {
float r = random(255);
stroke(r*5);
line(50, i, 50+r, i);
}
for (int i = 0; i < img.height; i++) {
float r = random(0,10);
println(r);
}
color c;
c=color(255,0,0);
img.set(mouseX,mouseY,c);
}
//void keyTyped(){
//float CreaImmagine(PImage img){ //FUNZIONI
//return (PImage img);
//float CalcolaPixel (color c){//FUNZIONI
//float r,g,b;
//r=red(c);
//g=green(c);
//b=blue(c);
//soglia=(0,5);
//r=random(0,1);
//}
//if (r>soglia){
//r=red(c);
//g=green(c);
//b=blue(c);
//}
//else{
//rm=0.393*r+0.769*g+0.189*b
//gm=0.349*r+0.686*g+0.168*b
//bm=0.272*r+0.534*g+0.131*b
//return c;
void setup() {
surface.setResizable(true);
img= getImage();
surface.setSize(img.width, img.height);
noStroke();
image (img,0,0);
}
void draw(){
float r,g,b;
color c;
c=color(255,0,0);
img.set(mouseX, mouseY,c);
image(img,0,0);
}
RIESCO A CARICARE UN'IMMAGINE IN MODO CHE L'UTENTE LA POSSA SCEGLIERE, MA QUANDO DEVO UTILIZZARE LA FUNZIONE CREAIMMAGINE(), NON RIESCO A FAR SI CHE SI PRENDA SEMPRE L'IMMAGINE ORIGINALE, COPIARLA, E MODIFICARE SEMPRE L'IMMAGINE MODIFICATA.
PImage imgOrig, imgMod;
color trasformaPixel (color c){
float r,g,b;
float i; //aggiungo la variabile intensità
r=red (c);
g=green(c);
b=blue(c);
i= (r+g+b)/3; //i tre valori diviso per 3.
if(i<150){ //se l'intensità è minore di 150.. se metto 30 i pixel saranno più bianchi, se metto 300 saranno più neri.
r=0; //metto r,g,b, a 0.
g=0;
b=0;
}
else { //altrimenti...
r=255; //tutto a 255
g=255;
b=255;
}
c=color (r,g,b);
return c;
};
void rettangolo (int x_0, int y_0, int n_x, int n_y){
color c;
int x, y;
for (x=x_0; x<x_0+n_x; x=x+1){
for (y=y_0; y<y_0+n_y; y=y+1){
c=imgMod.get (x,y); //void rettangolo deve alterare l'immagine modificata
c=trasformaPixel(c);
imgMod.set(x,y,c);
}
}
};
void setup(){
size(800,600);
imgOrig=loadImage("salento.jpg"); //carica l'immagine originale
image (imgOrig,0,0); //la visualizza
}
void draw (){
imgMod=imgOrig.copy(); //copia l'immagine originale nell'immagine modificata
rettangolo(mouseX,mouseY,40,40);
image(imgMod,0,0);
}
SOLO IN QUESTO MODO MA COSI SCELGO IO L'IMMAGINE ENON DO MODO ALL'UTENTE DI SCEGLIERLA.
GRAZIE