CHIEDO AIUTO CON PROGETTO PROCESSING

di il
2 risposte

CHIEDO AIUTO CON PROGETTO PROCESSING

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

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte