Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405

    Caricare immagini di grosse dimensioni

    Ho la necessita di caricare da file un'immagine di circa 4000x3000 pixel (anche di più se potessi), il fatto è che mi da out of memory.
    Non posso ricorrere all'aumento dell'heap space perchè comunque non sarebbe abbastanza per la mia applicazione, mi serve quindi un metodo per gestire le immagini in modo efficente.
    L'immagine che carico poi deve essere proiettata sullo schermo, solo la parte visibile però.

    Il fatto è che ho errore anche solo istanziando un BufferedImage del tipo:
    codice:
     BufferedImage immagine=new BufferedImage(4000,3000,BufferedImage.TYPE_INT_ARGB);
    C'è un modo per caricare un'immagine senza doverla salvare in un bufferedImage per poi usarne solo la parte che si vuole?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    con JAI (Java Advanced Imaging) si può fare (ho provato con immagini fino a 1000 x 3500) più grandi non ne avevo sotto mano
    codice:
    import javax.swing.*;
    import javax.media.jai.*;
    import java.awt.image.*;
    
    public class FileTest extends JFrame {
      public static final String DEFAULT_FILE = "C:/Documents and Settings/Andrea/Desktop/frontpage.jpg";
      
      public static void main(String args[]) {
        String fileName = null;
        if(args.length == 0) {
          fileName = DEFAULT_FILE;
        } 
        else {
          fileName = args[0];
        }
        
        new FileTest(fileName);
      }
    
    
       public FileTest(String fileName) {
         super(fileName);
         // Read the image from the designated path.
         System.out.println("Creating operation to load image from '" + fileName+"'");
         RenderedOp img =  JAI.create("fileload", fileName);  
         BufferedImage buimg = img.createInstance().getAsBufferedImage();
         JScrollPane displayPane = new JScrollPane(new JLabel(new ImageIcon(buimg)));
         System.out.println(buimg);     
         this.getContentPane().add(displayPane);
         this.pack();
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.setVisible(true);
       }
     }
    La libreria la scarichi dal sito della sun:

    http://java.sun.com/products/java-me...oad-1_1_2.html

    è abbastanza documentata e trovi diversi esempi di codice. Occhio che alcune cose sono state deprecate nel tempo, ad esempio il programma qui sopra è un rimaneggiamento del primo esempio di codice che trovi nel capitolo 4 della documentazione.
    Saluti.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Ciao, mi sono dimenticato di dire che non posso usare altre librerie che non siano quelle standard gia incluse nel java 1.5...
    Comuqnue io arrivo a caricare immagini di 3500x1200 pixel al massimo, poi vado in out of memory.
    Poi nel codice qui sotto vedo che comunque istanzi un bufferedimage, il problema è quello, non credo che dipenda dalle librerie che uno usa, se è troppo gande non riesce a farlo.
    Io cerco un modo per evitare di istanziare un bufferimage delle dimensioni dell'immagine...

  4. #4
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Forse ho trovato il pezzo di codice che mi da problemi, cioè senza di quello riesco a caricare immagini anche più grandi... il codice è questo:
    codice:
    	public void ottimizza(GraphicsConfiguration cfg) {
    		BufferedImage newBuffer = cfg.createCompatibleImage(imm.getWidth(),imm.getHeight(),imm.BITMASK);
    		//BufferedImage newBuffer = cfg.createCompatibleImage(imm.getWidth(),imm.getHeight(),imm.TRANSLUCENT);
    		newBuffer.createGraphics().drawImage(imm, 0, 0, null);
    		imm.flush();
    		imm = null;
    		imm = newBuffer;
    	}
    Mi serve per accelerare le immagini e disegnarle molto velocemente a video, non posso farne a meno.
    Allora imm è un bufferedImage delle dimensioni di 4000x3000 che contiene l'immagine non ancora accelerata, il problema come si può vedere è che ne creo un'altro delle stesse dimensioni, e due in memoria così grandi non ci stanno...
    C'è un modo per accelerare le immagini a "pezzi"?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.