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!!!!
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!!!!