Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JAVA] Estrarre Thumbnails da jpeg

    Salve a tutti,
    come da titolo vorrei capire se c'è un modo per estrapolare le thumbnail da Jpeg..In pratica sto sviluppando un File browser (simile ad una cartella) x le immagini...
    Per adesso su una SwingWorker prendo il file jpeg lo riduco e lo inserisco nel model di una Jlist così:
    codice:
    public class ThumbLoader extends SwingWorker<Void, Void> {    private DefaultListModel<ImageThubInfo> model;
        private int indexModel;
        private int imageSize;
        private ImageThubInfo tubInfo;
        
        protected ThumbLoader(DefaultListModel<ImageThubInfo> model,int indexModel,ImageThubInfo tub){
            this.model = model;
            this.indexModel=indexModel;
            tubInfo=tub;
            
            if(tub.getImageSize()==1){
            	imageSize=128;
            }else{
            	imageSize=256;
            }
        }
        @Override
        protected Void doInBackground() {
        	long before=System.currentTimeMillis();
        	BufferedImage thumbnail = null;
        	try {	
        		Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpeg");
    			ImageReader reader = (ImageReader)readers.next();
    			ImageInputStream iis = ImageIO.createImageInputStream(new File( tubInfo.getPath()) );
    
    
    			reader.setInput(iis, true);
    			ImageReadParam param = reader.getDefaultReadParam();
    			
    			int width = reader.getWidth(0);
    			int	height = reader.getHeight(0);
    
    
            	int ratio;
            	if(width>height)
            		ratio=width/imageSize;
            	else
            		ratio=height/imageSize;
            	
            	param.setSourceSubsampling(ratio,ratio, 0, 0);
            	thumbnail=reader.read(0, param);
            	if(thumbnail!=null)
            		tubInfo.setThumbIco(null);		
            	
            	tubInfo.setThumbnail(thumbnail);
    
    
            	long after=System.currentTimeMillis();
            	tubInfo.setSize((int) (after-before));
            	
            	model.set(indexModel, tubInfo);
            	
            	iis.close();
        	} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    
    
        }
    }
    Il codice funziona solo che quando iniziano ad essere parecchie immagini tipo 1500/2000 oppure le foto sono 5/6 Mb ognuna il tempo di resizing inizia ad aumentare rispetto ad esempio a quando apri una cartella con molte immagini che Windows "genera" molto velocemente...

    Nella documentazione c'è scritto che tramite la classe ImageReader è possibile estrarre la thumbnail tramite il metodo readThumbnail ma non funziona, o meglio, reader.getNumThumbnails(imageIndex) da sempre 0.

    Qualcuno saprebbe dirmi come si fa a prendere queste benedette thumbnail?? anche utilizzando qualche DLL.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da DamianoBaffoni Visualizza il messaggio
    Nella documentazione c'è scritto che tramite la classe ImageReader è possibile estrarre la thumbnail tramite il metodo readThumbnail ma non funziona, o meglio, reader.getNumThumbnails(imageIndex) da sempre 0.
    Sul ImageReader, readerSupportsThumbnails() ti restituisce true o false?

    Con questo di test:

    codice:
    import java.util.*;
    import javax.imageio.*;
    import javax.imageio.spi.*;
    
    public class Prova {
        public static void main(String[] arg) {
            Iterator<ImageReader> readerItr = ImageIO.getImageReadersByFormatName("jpg");
    
            while (readerItr.hasNext()) {
                ImageReader reader = readerItr.next();
                ImageReaderSpi readerSpi = reader.getOriginatingProvider();
                System.out.format("%s, %s: support thumbnails: %s",
                    readerSpi.getVendorName(), readerSpi.getVersion(),
                    reader.readerSupportsThumbnails());
            }
        }
    }

    a me su un JDK 7/Windows stampa una sola implementazione di reader per "jpg" (quella standard/predefinita del runtime):

    Oracle Corporation, 0.5: support thumbnails: true

    Quindi i thumbnails sono supportati.


    P.S.: una cosa posso notarla subito dal tuo codice: model è un DefaultListModel che viene ricevuto dal costruttore. Da qualche parte nella tua applicazione è sicuramente assegnato ad un JList.
    Nel doInBackground fai un model.set( .... ). Attenzione!! doInBackground non "gira" nel Event Dispatch Thread e siccome Swing non è thread-safe (e nemmeno i model lo sono di per sé), allora il tuo set è inappropriato lì in quel punto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Intanto ti ringrazio per avermi risposto così velocemente!!!
    Ho provato il tuo codice aggiungendo una foto di prova così:
    codice:
     
    public static void main(String[] args) {
    
                    Iterator<ImageReader> readerItr = ImageIO.getImageReadersByFormatName("jpg");
    
    
                    while (readerItr.hasNext()) {
                        ImageReader reader = readerItr.next();
                        ImageReaderSpi readerSpi = reader.getOriginatingProvider();
                        ImageInputStream iis;
                        try {
                            iis = ImageIO.createImageInputStream(new File( "C:\\Users\\Utente\\Desktop\\foto_prova.JPG") );
                            reader.setInput(iis);
                            
                             System.out.format("%s, %s:\nsupport thumbnails: %s \nnumThumb : %s",
                                        readerSpi.getVendorName(), readerSpi.getVersion(),
                                        reader.readerSupportsThumbnails(), reader.getNumThumbnails(0));
                             
                        } catch (IOException e) {e.printStackTrace();}
                        
                       
                    }
    
        }
    Il risultato è questo:
    codice:
    Oracle Corporation, 0.5:
    support thumbnails: true 
    numThumb : 0
    Inizio a perdere le speranze...le ho provate tutte

    P.S.: una cosa posso notarla subito dal tuo codice: model è un DefaultListModel che viene ricevuto dal costruttore. Da qualche parte nella tua applicazione è sicuramente assegnato ad un JList.
    Nel doInBackground fai un model.set( .... ). Attenzione!! doInBackground non "gira" nel Event Dispatch Thread e siccome Swing non è thread-safe (e nemmeno i model lo sono di per sé), allora il tuo set è inappropriato lì in quel punto.
    Intendi che devo aggiungere una cosa di questo tipo nella Swing Worker?
    codice:
     @Override
           protected void done() {
               model.set(indexModel, tubInfo);
    }
    Cmq per intenderci io richiamo la swing worker in questo modo:
    codice:
     private void setListFiles(final File[] files,final int dimensioneIcone) {
    SwingUtilities.invokeLater(new Runnable(){
    
    
                    @Override
                    public void run() {
    
    
                        clearList();
                        ImageThubInfo tubInfo=null;
                        for(File file:files){            
                            tubInfo = new ImageThubInfo(file.getAbsolutePath(), file.getName(),0,0,0,getIconImage(file,dimensioneIcone) );   ///file.length al posto del 3° zero
                            tubInfo.setImageSize(dimensioneIcone);
                            
                            model.addElement(tubInfo);
                            list.revalidate();
                        }
                        caricaIcone();
                        
                    }
                    
                });
    }
    private void caricaIcone(){
             SwingUtilities.invokeLater(new Runnable(){
    
    
                    @Override
                    public void run() {
    
    
                        ImageThubInfo tubInfo=null;
                        int inizio=list.getFirstVisibleIndex();
                        if(inizio!=-1){
                            int fine = list.getLastVisibleIndex();
                            for(int i=inizio;i<=fine;i++){
                                tubInfo= model.get(i);
                                if( isAJpegFile(tubInfo.getPath()) ){
                                    SwingWorker<Void, Void> worker=new ThumbLoader(model,i,tubInfo);
                                    threadPool.execute(worker);    
                                }                            
                            }
                            list.repaint();
                        }
                    
                    }
                });
         }
    Googolando un po' ho trovato questo :
    http://libexif.cvs.sourceforge.net/v....1&view=markup

    L'ho fatto provare ad un mio amico e funziona (con la stessa foto poi che ho utilizzato io nel primo codice che ho postato dove il mio reader dice che non sono presenti thumb)..
    Sarebbe possibile quindi invocare da java un file C e farmi rimandare una BufferdImage col la thumb??
    Cioè, so che è possibile ma non ho capito bene come si fa.
    Grazie ancora per l'aiuto

Tag per questa discussione

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.