PDA

View Full Version : [Java]Ottimizzare ridimensionamento e scrittura immagini


mone.java
09-05-2008, 23:21
Ciao, sto facendo un programma che richiede il caricamento di molte immagini le quali vengono ridimensionate e successivamente scritte sull'hardDisk, il problema è che quando vado a disegnare l'immagine ridimensionata all'interno di una BuffredImage, con immagini grandi (macchina fotografica) , ci mette 1,5 - 2 secondi che moltiplicati per molte immagini risultano essere molti :sbav: .
Esiste un modo per ottimizzare in maniera significativa il procedimento ?? Se si quale.

posto il codice del metodo che carica le immagini evidenziando il punto critico:
p.s. (per avere una panoramica competa del programma e i codici sorgenti completi potete guardare una discussione con un'altra domanda relativa al programma: http://www.hwupgrade.it/forum/showthread.php?p=22374136#post22374136)


/**
* Carica l'immagine corrispondente al file preso come parametro e la ottimizza
* per il computer in uso (GraphicsConfiguration gc ==> gc.createCompatibleImage)
*
*
* @param path: e l'indirizzo nel quale si trova l'mmagine da "catturare"
* @param write: determina se il file è da scrivere su disco
* @param game: istanza del Main
* @return l'immagine che si vuole caricare rimpicciolita e ottimizzata
*/
public static Image loadImage(File img, boolean write,Main game) {
/* Creo un'immagine bufferizzata vuota */
BufferedImage sourceImage = null;

try{
/* Associo all'immagine bufferizzata un'immagine presa da url */
sourceImage = ImageIO.read(img);
} catch (IOException e) {
System.out.println("Impossibile leggere l'immagine "+img.getName());
return null;
}

/* Creo un'immagine accellerata della giusta dimensione per caricarci dentro la nostra */
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
Image image = gc.createCompatibleImage(sourceImage.getWidth(),sourceImage.getHeight());

/* Disegno l'immagine all'interno dell'imagine accellerata*/
image.getGraphics().drawImage(sourceImage,0,0,null);



// se l'immagine non è della grandezza giusta viene ridimensionata
if(write&&(image.getWidth(null)!=156||image.getHeight(null)!=117))
image = sourceImage.getScaledInstance(156,117,Image.SCALE_AREA_AVERAGING);

System.out.println();
System.out.println("Caricamento "+img.getName());
long bu = System.currentTimeMillis();
//scrivo l'immagine nella cartella immagini
if(write)
try {
System.out.println("1-"+(System.currentTimeMillis()-bu));
sourceImage = gc.createCompatibleImage(156,117);
System.out.println("2-"+(System.currentTimeMillis()-bu));
sourceImage.getGraphics().drawImage(image, 0, 0, null);
System.out.println("3-"+(System.currentTimeMillis()-bu));
String pathLocale = game.getClass().getClassLoader().getResource("").getFile()+"/"+"Immagini";
img = new File(pathLocale+"/"+img.getName());
if(img.exists()) { //se l'immagine esiste già
String[] options = {"Sovrascrivi","Rinomina","Salta"};
int opt = JOptionPane.showOptionDialog(game,
img.getName()+" esista già nella cartella immagini, sovrascriverlo, salvare l'mmagine con" +
"\n un nome diverso o andare avanti senza fare nulla?",
"Sovrascrivere immagine?", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, new ImageIcon(image),options, options[1]);
if(opt == JOptionPane.YES_OPTION) //sovrascrivo
ImageIO.write(sourceImage, "jpg", img);
else if(opt == JOptionPane.NO_OPTION) //salvo con nome diverso
ImageIO.write(sourceImage, "jpg", new File(img.getParent()+"*"+img.getName()));

} else{

ImageIO.write(sourceImage, "jpg", img);
}

System.out.println("4-"+(System.currentTimeMillis()-bu));
return null;
} catch (IOException e) {
System.out.println("Impossibile scrivere l'immagine "+img.getName());
}
return image;
}


Ciao e grazie in anticipo!!!!

banryu79
12-05-2008, 12:18
Ciao money.java, vorrei aiutarti ma nello specifico non conosco nulla di preciso sulla manipolazione delle immagini in Java.

Però visto che nessuno ti ha scritto nulla mi azzardo almeno a indicarti delle possibili fonti per "saperne si più", sperando che ti tornino utili in qualche modo.

Il materiale è tutto in inglese (spero tu sia in grado di leggerlo agevolmente).

1) blog di Chet Haase, un ingegnere della Sun che si occupa di grafica. Trovi, a parte il link che ti posto qui, molti altri spunti utili (anche sui problemi legati alle immagini in Java)
-> Chet Haase's Blog: ToolkitBufferedVolatileManagedImage Strategies (http://weblogs.java.net/blog/chet/archive/2004/08/toolkitbuffered.html)

2)
-> AWT Image Scaling API (http://java.sun.com/j2se/1.3/docs/guide/awt/designspec/graphics/imagescale.html)

3) Un post del Developer Forum della Sun:
-> Java 2D - How to Scale RenderedImage with good Quatily. (http://forum.java.sun.com/thread.jspa?threadID=677632&messageID=3954667)

4)
-> A comparison of Java image thumbnailing techniques (http://www.hanhuy.com/pfn/java-image-thumbnail-comparison)

Ciao :)

Don[ITA]
12-05-2008, 13:08
Controlla anche qui: http://rsb.info.nih.gov/ij/

banryu79
12-05-2008, 13:49
;22412693']Controlla anche qui: http://rsb.info.nih.gov/ij/

Molto interessante, è OpenSource e ci sono anche i sorgenti scaricabili, sia in formato "tradizionale" che in formato "java2html" molto comodo per leggerli.

Grazie Don[ITA] ;)

mone.java
12-05-2008, 15:06
;22412693']Controlla anche qui: http://rsb.info.nih.gov/ij/

Ciao money.java, vorrei aiutarti ma nello specifico non conosco nulla di preciso sulla manipolazione delle immagini in Java.

Però visto che nessuno ti ha scritto nulla mi azzardo almeno a indicarti delle possibili fonti per "saperne si più", sperando che ti tornino utili in qualche modo.

Il materiale è tutto in inglese (spero tu sia in grado di leggerlo agevolmente).

1) blog di Chet Haase, un ingegnere della Sun che si occupa di grafica. Trovi, a parte il link che ti posto qui, molti altri spunti utili (anche sui problemi legati alle immagini in Java)
-> Chet Haase's Blog: ToolkitBufferedVolatileManagedImage Strategies (http://weblogs.java.net/blog/chet/archive/2004/08/toolkitbuffered.html)

2)
-> AWT Image Scaling API (http://java.sun.com/j2se/1.3/docs/guide/awt/designspec/graphics/imagescale.html)

3) Un post del Developer Forum della Sun:
-> Java 2D - How to Scale RenderedImage with good Quatily. (http://forum.java.sun.com/thread.jspa?threadID=677632&messageID=3954667)

4)
-> A comparison of Java image thumbnailing techniques (http://www.hanhuy.com/pfn/java-image-thumbnail-comparison)

Ciao :)

Grazie per l'aiuto adesso proverò a fare delle prove e ovviamente se raggiungerò qualche risultato non esiterò a farvelo vedere.
Ciao Grazie!!

Don[ITA]
12-05-2008, 15:17
Molto interessante, è OpenSource e ci sono anche i sorgenti scaricabili, sia in formato "tradizionale" che in formato "java2html" molto comodo per leggerli.

Grazie Don[ITA] ;)

Figurati :D

banryu79
13-05-2008, 09:17
;22414973']Figurati :D

A proposito: ma come cavolo li sgamate certi link? :eek:


@EDIT:
grazie, Java Tips già lo conoscevo, ma quella particolare pagina di java.net no, bookmarkata ;)

Don[ITA]
13-05-2008, 12:04
Guarda io la maggior parte delle cose di java le trovo o sul forum della sun oppure qui (http://www.java-tips.org/) o qui (https://www.dev.java.net/). Per il resto googleggio e di solito trovo quello che cerco :D.

Ciauz

mone.java
13-05-2008, 17:21
Se non lo sapete ora nelle cose di google labs esiste un motore di ricerca per i codici sorgenti, provate a darci un'occhiata (sinceramente non l'ho mai usato...)
Ciao