Modificare la dimensione della finestra in base all'immagine caricata
Negli esempi che abbiamo visto fino ad ora relativi all'uso delle immagini all'interno di Processing abbiamo sempre impostato a priori la grandezza della finestra del nostro sketch in base alla dimensione dell'immagine caricata.
È un metodo molto semplice ma decisamente scomodo se dobbiamo utilizzare tante immagini diverse oppure se vogliamo rendere il nostro programma universale.
Nella versione precedente di Processing era possibile utilizzare delle variabili all'interno della funzione size(). Questa opzione, però, benché fortemente osteggiata dagli sviluppatori fin dal 2009 è stata definitivamente rimossa con l'aggiornamento a Processing 3 perché impediva miglioramenti in termini di performance, velocità e compatibilità cross-platform.
Non disperate! Esiste una soluzione alternativa che, però, non è ben descritta nel reference del linguaggio. Ecco perché ho pensato fosse interessante scrivere un breve articolo a riguardo.
Ecco come fare:
- All'interno di setup() è comunque necessario indicare una dimensione di partenza con la funzione size(). Per semplicità possiamo scrivere: size(1, 1);
- Dopodiché aggiungiamo la seguente linea di codice:
surface.setResizable(true);
mi raccomando, fate attenzione alle maiuscole! - A questo punto, nel punto in cui abbiamo la necessità di reimpostare la dimensione è sufficiente scrivere:
surface.setSize(larghezza, altezza);
dove larghezza e altezza sono i nostri parametri.
Ecco un esempio con un'immagine:
/*
* Modificare la dimensione della finestra in base all'immagine caricata
* Federico Pepe, 25.06.2017
* http://blog.federicopepe.com/processing
*/
PImage img;
void setup() {
size(1, 1);
surface.setResizable(true);
img = loadImage("immagine.jpg");
surface.setSize(img.width, img.height);
}
void draw() {
}
Per cambiare la dimensione a ogni click del mouse:
/*
* Modificare la dimensione della finestra in base all'immagine caricata
* Federico Pepe, 25.06.2017
* http://blog.federicopepe.com/processing
*/
void setup() {
size(100, 100);
surface.setResizable(true);
}
void draw() {
}
void mousePressed() {
surface.setSize(round(random(100, 500)), round(random(100, 500)));
}