Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70

    Zoom in file tiff

    ciao a tutti, sto realizzando un lettore di immagini tiff (Multilevello) in java, per ora vorrei iniziare ad implementare una funzione di zoom leggendo i vari livelli della foto solo che non riesco a capire perchè non me lo fa...
    Se qualcuno fosse così gentile da aiutarmi!!!
    Posto il codice

    codice:
    import java.awt.Button;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Panel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.renderable.RenderableImage;
    import java.io.File;
    import java.io.IOException;
    import java.awt.Frame;
    import java.awt.image.RenderedImage;
    import javax.media.jai.widget.ScrollingImagePanel;
    import javax.media.jai.NullOpImage;
    import javax.media.jai.OpImage;
    import com.sun.media.jai.codec.SeekableStream;
    import com.sun.media.jai.codec.FileSeekableStream;
    import com.sun.media.jai.codec.TIFFDecodeParam;
    import com.sun.media.jai.codec.ImageDecoder;
    import com.sun.media.jai.codec.ImageCodec;
    
    public class MultiPageRead extends Frame {
    
        Panel pnlGenerale;
        ScrollingImagePanel panel;
        int imageToLoad;
        ImageDecoder dec;
        RenderedImage op;
    
    
        public MultiPageRead(String filename) throws Exception {
    
            setTitle("Multi page TIFF Reader");
    
            File file = new File(filename);
            SeekableStream s = new FileSeekableStream(file);
    
            TIFFDecodeParam param = null;
    
            dec = ImageCodec.createImageDecoder("tiff", s, param);
    
            System.out.println("Number of images in this TIFF: " +
                               dec.getNumPages());
    
            // Which of the multiple images in the TIFF file do we want to load
            // 0 refers to the first, 1 to the second and so on.
            imageToLoad = dec.getNumPages() - 3;
    
            /*
            RenderedImage op =
                new NullOpImage(dec.decodeAsRenderedImage(imageToLoad),
                                null,
                                OpImage.OP_IO_BOUND,
                                null);
             */
            
            panel = VisualizzaImmagine(dec,imageToLoad);
            // Display the original in a 800x800 scrolling window
            //panel = new ScrollingImagePanel(op, 800, 800);
            //add(panel);
            
            Panel pnl = new Panel();
            pnl.setSize(new Dimension(800,20));
            Button btnZoomIn = new Button("Zoom In");
            Button btnZoomOut = new Button("Zoom Out");
            Button btnExit = new Button("Exit");
            
            btnZoomIn.addActionListener(new ActionListener(){
    			 
    			public void actionPerformed(ActionEvent e) {
    			 	try{
                                        panel = VisualizzaImmagine(dec,imageToLoad++);
                                        //gestire la visualizzazione con lo zoom
                                    } catch (Exception ex) {
                                        ex.printStackTrace();
                                    }
    			}
    		});
                    
             btnZoomOut.addActionListener(new ActionListener() {
                
                 public void actionPerformed(ActionEvent e) {
                        
                                    //DeZoomare l'immagine
                 }
            });
            
            btnExit.addActionListener(new ActionListener() {
                
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            
            pnl.add(btnZoomIn);
            pnl.add(btnZoomOut);
            pnl.add(btnExit);
            this.setLayout(new GridLayout(2,1));        
            add(panel);
            add(pnl);
        }
        
        public ScrollingImagePanel VisualizzaImmagine(ImageDecoder dec, int imageToLoad) throws Exception {
            
            RenderedImage op =
                new NullOpImage(dec.decodeAsRenderedImage(imageToLoad),
                                null,
                                OpImage.OP_IO_BOUND,
                                null);
            panel = new ScrollingImagePanel(op, 800, 800);
            return panel;
        }
    
        public static void main(String [] args) {
    
            String filename = "c:"+File.separator+"file.tif"; //args[0];
    
            try {
                MultiPageRead window = new MultiPageRead(filename);
                window.pack();
                window.show();
            } catch (Exception ioe) {
                System.out.println(ioe);
            }
        }
    }
    alla prezzione del bottone zoom in dovrebbe scalare di un livello e farmelo vedere... ma non me lo fa vedere... l'immagine rimane sempre al livello di quando la carica per la prima volta...
    Ho messo un pò di repaint qui e là ma non funziona...

    Grazie a tutti per l'aiuto!

    Simone

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Prova a fare una cosa del genere:
    Aggiungi una classe privata all'interno della classe principale:
    codice:
    private class zoomActionListener implements ActionListener {
            private MultiPageRead mpr;
                    
            public zoomActionListener(MultiPageRead mpr) {
                this.mpr = mpr;
            }
            
            public void actionPerformed(ActionEvent ae) {
                try {
                    panel = VisualizzaImmagine(dec,imageToLoad++);
                    //gestire la visualizzazione con lo zoom
                } 
                catch (Exception ex) {
                    ex.printStackTrace();
                }
                mpr.validate();
            }
        }
    e poi al bottone di zoom ci appiccichi il listener in questo modo:
    codice:
    btnZoomIn.addActionListener(new zoomActionListener(this));
    Non ho provato, per cui, assicurati che le variabili abbiano la giusta visibilità.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    Purtroppo il comportamento è sempre lo stesso, è come se non facesse il refresh del pannellone (che contiene il reader e i bottoni) e quindi l'immagine è sempre quella.

    La lettura del tiff dovrebbe essere giusta perchè se premo 3 volte il bottone di zoom, partendo dal 3° livello ed avendo il tiff solo 5 livelli poi mi va in eccezione, cercando di leggere il 6° livello che non c'è...

    se riuscissi a provare il codice mi daresti una grossa mano... perchè intuisco che è una cacchiata ma non ne riesco a venire a capo...

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Allora prova ad eliminare il vecchio panel e a ricrearlo ex-novo
    codice:
    private class zoomActionListener implements ActionListener {
            private MultiPageRead mpr;
                    
            public zoomActionListener(MultiPageRead mpr) {
                this.mpr = mpr;
            }
            
            public void actionPerformed(ActionEvent ae) {
                try {
                    mpr.remove(panel)
                    panel = VisualizzaImmagine(dec,imageToLoad++);
                    mpr.add(panel, 0);
                    //gestire la visualizzazione con lo zoom
                } 
                catch (Exception ex) {
                    ex.printStackTrace();
                }
                mpr.validate();
            }
        }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    perfetto!!!
    Ti ringrazio tantissimo!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    70
    e ora next step...

    Riesco ad andare in giù ed in su con i livelli (manca il controllo per non far saltare l'eccezione una volta arrivato all'ultimo livello ma vabbè...) ora devo implementare lo zoom vero e proprio...
    Andando un pò a naso in giro ho visto la classe Graphics2D che ha il metodo scale() e mi è venuta una bellissima idea (bellessima ma eccezionale, nel senso di eccezioni a manetta... )

    ecco il codice:
    codice:
    private class zoomIn implements ActionListener {
            private MultiPageRead mpr;
            
            public zoomIn(MultiPageRead mpr) {
                this.mpr = mpr;
            } 
        
            public void actionPerformed(ActionEvent ae) {
                try {
                    mpr.remove(panel);
                
                    panel = VisualizzaImmagine(dec,imageToLoad);
                
                    Graphics2D g = (Graphics2D)panel.getGraphics();
    
                    //quando premo il pulsante l'eccezione salta a questa riga qui sotto
                    g.scale(2.0,2.0);
    
                    mpr.add(panel, 0);
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
                mpr.validate();
            }
        }
    ... quindi penso che non mi prenda l'oggetto Graphics2D dal pannello... any ideas? oppure proprio ho sbagliato l'approccio e non devo prendere l'oggetto Graphics2D dal pannello???

    ah dimenticavo, la fantastica eccezione è un null pointer...

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non ne ho idea, però, prima di reinventare la ruota, prova a dare un occhio a questo:

    http://java.sun.com/developer/JDCTec...04/tt0406.html
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.