IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Principe des miniatures sous Windows, Mac, Linux


Sujet :

Java

  1. #1
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut Principe des miniatures sous Windows, Mac, Linux
    Bonjour à tous

    J'aimerais realiser des miniatures de fichiers (tif jpg pdf word txt ..) un peu comme sous linux , mac ou seven.
    Quel est le principe qui est utilisé?

    Pour ma part pour les pdf je suis obligé de convertir la 1ere page en png pour pouvoir l'afficher

    N'existerait il pas une autre methode pour avoir un apercu de tous ces types de fichiers sans realiser de conversions en image sous Java?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ca dépend fortement du type de fichier. Certains types, comme opendocument, possèdent dans leur format une vignette toute prête pour ce genre d'usage. Pour les autres types de fichier, il faudra faire un rendu de ce fichier vers une image, qu'elle soit en mémoire ou sur le disque.

  3. #3
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Merci de me repondre

    J'ai crée une petite appli test pour essayer de faire le maximum de miniature avec les differents fichiers
    J'ai fais le plus facile pour l'instant les images PNG, JPG, GIF, BMP

    J'aimerais essyer de le completer avec le plus de format possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package miniature;
     
    import javax.swing.SwingUtilities;
     
    public class Main
    {
        public static void main(String[] args) 
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    Fenetre fen = new Fenetre();
                    fen.setVisible(true);
                }
            });
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    package miniature;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileFilter;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.SwingConstants;
     
    public class Fenetre extends JFrame implements ActionListener
    {
        private JButton BOU_Directory;
        private JPanel PAN_Droit; private JScrollPane SCR_Image;
        private Miniature[] miniature;
        private int nbFile = 0;
     
        public Fenetre()
        {
            super("Miniature");
            this.setSize(800, 450);
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
     
            Container c = getContentPane();
            c.setLayout(new BorderLayout(0, 0));
     
            //Panel Gauche
            JPanel PAN_Gauche = new JPanel();
            PAN_Gauche.setPreferredSize(new Dimension(200, 450));
            PAN_Gauche.setBackground(new Color(0x6a6a6a));
            PAN_Gauche.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 15));
            c.add(PAN_Gauche, BorderLayout.WEST);
            //Texte
            JLabel LAB_Texte = new JLabel("<html><center>SELECTION</center>DU REPERTOIRE</html>");
            LAB_Texte.setPreferredSize(new Dimension(200, 60));
            LAB_Texte.setFont(new Font("Serif", Font.BOLD, 20));
            LAB_Texte.setHorizontalAlignment(SwingConstants.CENTER);
            PAN_Gauche.add(LAB_Texte);
            //Bouton vers JFileChooser
            BOU_Directory = new JButton("GO");
            BOU_Directory.setBackground(new Color(0x8c8c8c));
            BOU_Directory.setPreferredSize(new Dimension(70, 25));
            BOU_Directory.setContentAreaFilled(false);
            BOU_Directory.setOpaque(true);
            BOU_Directory.setFocusable(false);
            BOU_Directory.addActionListener(this);
            PAN_Gauche.add(BOU_Directory);
     
            //Panel Droit
            PAN_Droit = new JPanel();
            PAN_Droit.setBackground(new Color(0xbcbcbc));
            PAN_Droit.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
            //JScrollPane
            SCR_Image = new JScrollPane(PAN_Droit,
                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            SCR_Image.setPreferredSize(new Dimension(600, 450));
            c.add(SCR_Image);
        }
     
        public void actionPerformed(ActionEvent e)
        {
            Object source = e.getSource();
            if(source == BOU_Directory)
            {
                //lancement JFileChooser
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.showOpenDialog(this);
     
                //Recuperation des informations
                File homeDir = chooser.getSelectedFile();
                System.out.println("***** Dossier Racine : " + homeDir + " *****");
                if(homeDir != null)
                {
                    //Suppression des anciennes miniatures
                    for (int i = 0; i < nbFile; i++)
                    {
                        miniature[i].setVisible(false);
                        miniature[i] = null;
                    }
     
                    System.out.println("***** Ajout des Miniatures *****");
                    File[] listFile = homeDir.listFiles(new FileFilter()
                    {
                        public boolean accept(File pathname)
                        {
                            return pathname.isFile();
                        }
                    });
     
                    //Nombre de Fichier + Hauteur Panel
                    nbFile = listFile.length;
                    System.out.println(getHauteurPanel());
                    PAN_Droit.setPreferredSize(new Dimension(600, getHauteurPanel()));
                    miniature = new Miniature[nbFile];
                    System.out.println("***** Nombre de Fichier : " + nbFile + " *****");
     
                    //Ajout des miniatures
                    for (int i = 0; i < nbFile; i++)
                    {
                        System.out.println(listFile[i]);
                        miniature[i] = new Miniature(100, 150, listFile[i]);
                        PAN_Droit.add(miniature[i]);
                        PAN_Droit.revalidate();
                    }
                }
            }
        }
        private int getHauteurPanel()
        {
            if((nbFile % 5) == 0)
                return 10 + ((nbFile / 5) * 160);
            else
                return 170 + ((nbFile / 5) * 160);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    package miniature;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.io.File;
    import javax.swing.JPanel;
    import javax.swing.SwingWorker;
     
    public class Miniature extends JPanel
    {
        private int width, height;
        private JPanel panel;
        private File pathname;
     
        public Miniature(int width, int height, File pathFile)
        {
            this.width = width;
            this.height = height;
            this.pathname = pathFile;
            this.setPreferredSize(new Dimension(this.width, this.height));
            this.setBackground(Color.white);
            this.setLayout(new BorderLayout(0, 0));
            panel = new JPanel();
            panel.setPreferredSize(new Dimension(width, height));
            panel.setOpaque(false);
            panel.setLayout(new BorderLayout());
            this.add(panel);
     
            //Miniature JPG, GIF, BMP et PNG
            if(pathFile.toString().toLowerCase().endsWith(".jpg")
                    || pathFile.toString().toLowerCase().endsWith(".jpeg")
                    || pathFile.toString().toLowerCase().endsWith(".gif")
                    || pathFile.toString().toLowerCase().endsWith(".bmp")
                    || pathFile.toString().toLowerCase().endsWith(".png"))
                createJPEG();
        }
        private void createJPEG()
        {
            new SwingWorker()
            {
                @Override
                protected Object doInBackground() throws Exception 
                {
                    panel.add(new AfficheurImage(width, height, pathname));
                    panel.revalidate();
                    return null;
                }
            }.execute();   
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    package miniature;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsEnvironment;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    public class AfficheurImage extends JPanel
    {
        private BufferedImage image = null;
        private int width, height;
        private double imageHeightPosition, imageWidthPostion;
     
        public AfficheurImage (int width, int height, File imagePath)
        {
            this.width = width; this.height = height;
            this.setBackground(Color.white);
            try
            {
                image = ImageIO.read(imagePath);
                image = createCompatibleImage(this.image);
                image = createThumbnail(this.image, this.width);
     
                //Centrage de l'image
                double imageHeight = this.image.getHeight() * (this.width / this.image.getWidth());
                imageHeightPosition = (this.height - imageHeight) / 2;
                imageWidthPostion = (this.width - this.image.getWidth()) / 2;
            }
            catch (IOException ex)
            {
                Logger.getLogger(AfficheurImage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        @Override
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(this.image, (int) imageWidthPostion, (int) imageHeightPosition, null);
            this.image.flush();
            g.dispose();
        }
     
        public static BufferedImage createCompatibleImage(BufferedImage image)
        {
            GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
                    getDefaultScreenDevice().getDefaultConfiguration();
     
            if (image.getColorModel().equals(gc.getColorModel()))
            {
                return image;
            }
            else
            {
                BufferedImage compatibleImage = gc.createCompatibleImage(image.getWidth(), image.getHeight(),
                        image.getTransparency());
     
                Graphics g = compatibleImage.getGraphics();
                g.drawImage(image, 0, 0, null);
                g.dispose();
     
                return compatibleImage;
            }
        }
     
        public static BufferedImage createThumbnail(BufferedImage image, int requestedThumbSize)
        {
            float ratio = (float) image.getWidth() / (float) image.getHeight();
            int width = image.getWidth();
            BufferedImage thumb = image;
            BufferedImage temp = null;
            do
            {
                width /= 2;
                if (width < requestedThumbSize)
                {
                    width = requestedThumbSize;
                }
     
                temp = new BufferedImage(width, (int) (width / ratio), BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2 = temp.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2.drawImage(thumb, 0, 0, temp.getWidth(), temp.getHeight(), null);
                g2.dispose();
     
                thumb = temp;
            } while (width != requestedThumbSize);
            temp = null;
            return thumb;
        }
    }
    A tous ceux qui veulent y participer pour essayer de le completer avec le plus de format possible, MERCI

  4. #4
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Bon apparemment il n'y a pas beaucoup d'amateur

    J'integre cette fois ci des miniatures pdf avec ghostscript et ghost4j dans mon appli test
    voici les deux classes que j'ai modifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package miniature;
     
    import javax.swing.SwingUtilities;
    import org.apache.log4j.PropertyConfigurator;
     
    public class Main
    {
        public static void main(String[] args) 
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    //Initialisation de log4j pour les log de debuggage
                    PropertyConfigurator.configure("log4j.properties");
                    Fenetre fen = new Fenetre();
                    fen.setVisible(true);
                }
            });
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    package miniature;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.io.File;
    import javax.swing.JPanel;
    import javax.swing.SwingWorker;
    import net.sf.ghost4j.Ghostscript;
    import net.sf.ghost4j.GhostscriptException;
     
    public class Miniature extends JPanel
    {
        private int width, height;
        private JPanel panel;
        private File pathname;
     
        public Miniature(int width, int height, File pathFile)
        {
            this.width = width;
            this.height = height;
            this.pathname = pathFile;
            this.setPreferredSize(new Dimension(this.width, this.height));
            this.setBackground(Color.white);
            this.setLayout(new BorderLayout(0, 0));
            panel = new JPanel();
            panel.setPreferredSize(new Dimension(width, height));
            panel.setOpaque(false);
            panel.setLayout(new BorderLayout());
            this.add(panel);
     
            //Miniature JPG, GIF, BMP et PNG
            if(pathFile.toString().toLowerCase().endsWith(".jpg")
                    || pathFile.toString().toLowerCase().endsWith(".jpeg")
                    || pathFile.toString().toLowerCase().endsWith(".gif")
                    || pathFile.toString().toLowerCase().endsWith(".bmp")
                    || pathFile.toString().toLowerCase().endsWith(".png"))
                createJPEG();
            //Miniature PDF
            if(pathFile.toString().toLowerCase().endsWith(".pdf"))
                createPDF();
        }
        private void createJPEG()
        {
            new SwingWorker()
            {
                @Override
                protected Object doInBackground() throws Exception 
                {
                    panel.add(new AfficheurImage(width, height, pathname));
                    panel.revalidate();
                    return null;
                }
            }.execute();
        }
        private void createPDF()
        {
            new SwingWorker() 
            {
                @Override
                protected Object doInBackground() throws Exception 
                {
                    Ghostscript gs = Ghostscript.getInstance();
     
                    //Paramètres ligne de commandes
                    String[] gsArgs = new String[9];
                    gsArgs[0] = "-dSAFER";
                    gsArgs[1] = "-dBATCH";
                    gsArgs[2] = "-dNOPAUSE";
                    gsArgs[3] = "-dFirstPage=1";
                    gsArgs[4] = "-dLastPage=1";
                    gsArgs[5] = "-sDEVICE=png16m";
                    gsArgs[6] = "-r50";
                    gsArgs[7] = "-sOutputFile=" + pathname.getName() +".png";
                    gsArgs[8] = pathname.getPath();
     
                    try
                    {
                        gs.initialize(gsArgs);
                        gs.exit();
                    }
                    catch (GhostscriptException e)
                    {
                        System.out.println("ERROR: " + e.getMessage());
                    }
                    panel.add(new AfficheurImage(width, height,new File(pathname.getName() +".png")));
                    panel.revalidate();
                    new File(pathname.getName() +".png").delete();
                    return null;
                }
            }.execute();
     
        }
    }
    Si quelqu'un peux me conseiller des optimisations codes et niveau ressources

    Merci

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je n'ai pas grand chose à dire sur la création des miniatures (en vrai j'ai à peine survolé cette partie du code).

    Par contre je trouve le reste un peu trop complexe et trop lié...


    La classe AfficheurImage est chargé de créer la miniature, mais c'est en même temps un composant graphique chargé de l'afficher !?

    La classe Miniature est un composant graphique (assez complexe d'ailleurs, avec pour une raison que j'ignore 2 niveau de JPanel), qui est chargé d’appeler l'AfficheurImage et de l'afficher...


    A mon avis, tout ceci n'est pas très souple !




    Perso je commencerais par définir une interface Java représentant un objet pouvant créer une miniature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    interface FileThumbnail {
    	public boolean canCreateThumb(File file);
     
    	public BufferedImage createThumb(File file, int width, int height) throws IOException;
    }
    La méthode canCreateThumb() devra retourner true si cet objet peut créer une miniature pour le fichier indiqué, tandis que la méthode createThumb() se chargera de créer cette image...


    Ensuite, il faut créer les classes implémentant cette interface pour chaque type de fichier, par exemple pour les images :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class ImageFileThumbnail implements FileThumbnail {
    	@Override
    	public boolean canCreateThumb(File file) {
    		return Tools.endsWith(file, ".jpg", ".jpeg", ".gif", ".bmp", ".png");
    	}
     
    	@Override
    	public BufferedImage createThumb(File file, int width, int height)
    			throws IOException {
    		BufferedImage image = ImageIO.read(file);
    		return Tools.createThumbnail(image, width);
    	}
    }
    Avec Tools.endsWith() une méthode défini comme ceci (afin d'éviter les if en pagaille) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static boolean endsWith(File file, String... suffixes) {
    		final String fileName = file.getName().toLowerCase();
    		for (String suffix : suffixes) {
    			if (fileName.endsWith(suffix)) {
    				return true;
    			}
    		}
    		return false;
    	}

    Enfin, j'utiliserais une fabrique qui gérerait les différents FileThumbnail pour créer les images pour n'importe quel fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    class ThumbFactory {
     
    	/** La liste des implémentations */
    	private final List<FileThumbnail> creators;
    	/** Le créateur par défaut */
    	private final FileThumbnail defaultCreator = new NoFileThumbnail();
     
    	public ThumbFactory() {
    		this.creators = new ArrayList<FileThumbnail>();
    		// On ajoute toutes les implémentations par défaut :
    		this.creators.add(new ImageFileThumbnail());
    	}
     
    	/** Ajout d'un ThumbCreator */
    	public synchronized void add(FileThumbnail creator) {
    		if (creator == null) {
    			throw new NullPointerException("creator");
    		}
    		this.creators.add(creator);
    	}
     
    	/** Méthode privée permettant de recherche le ThumbCreator pour un fichier */
    	private synchronized FileThumbnail searchCreator(File file) {
    		for (FileThumbnail creator : this.creators) {
    			if (creator.canCreateThumb(file)) {
    				return creator;
    			}
    		}
    		return defaultCreator;
    	}
     
    	/** Création d'une miniature pour un fichier : */
    	public BufferedImage createThumb(File file, int width, int height, boolean compatible) {
    		FileThumbnail creator = searchCreator(file);
    		try {
    			BufferedImage image = creator.createThumb(file, width, height);
    			if (compatible) {
    				image = Tools.createCompatibleImage(image);
    			}
    			return image;
    		} catch (IOException e) {
    			return null;
    		}
    	}
     
    	/** Création d'une miniature pour un fichier : */
    	public BufferedImage createThumb(File file, int width, int height) {
    		return createThumb(file, width, height, true);
    	}
     
    	/** Création d'une miniature pour un fichier : */
    	public BufferedImage createThumb(File file, int size) {
    		return createThumb(file, size, size);
    	}
     
    	/** Création d'une miniature pour un fichier : */
    	public BufferedImage createThumb(File file) {
    		return createThumb(file, 64);
    	}
     
    }
    Le tout en utilisant un "NoFileThumbnail" qui génèrerait une miniature par défaut pour les fichiers qui ne sont pas supportés...



    Reste le cas du composant graphique. Comme je l'ai dit je n'ai pas compris l'intérêt de tes multiples composants et des multiples JPanel...
    Pourquoi ne pas simplement utiliser un JLabel ???

    Il suffit pour cela de compléter notre factory via une méthode de ce genre-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /** Créer un composant pour afficher la miniature.
             * Cette méthode peut être appelée depuis l'EDT
             */
    	public JLabel createThumbComponent(final File file, final int width, final int height, final boolean compatible) {
    		final JLabel label = new JLabel();
    		new SwingWorker<ImageIcon, Void>() {
    			@Override
    			protected ImageIcon doInBackground() throws Exception {
    				return new ImageIcon(createThumb(file, width, height, compatible));
    			}
     
    			@Override
    			protected void done() {
    				try {
    					label.setIcon(get());
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				} catch (ExecutionException e) {
    					e.printStackTrace();
    				}
    			}
    		}.execute();
    		return label;
    	}
    Et on obtient un joli JLabel avec notre miniature


    Et pour supporter un nouveau type de fichier, il suffit d'ajouter une nouvelle implémentation de FileThumbnail...


    a++


    PS : Petite remarque pour finir : ta méthode createThumbnail() redimensionne uniquement sur la largeur. Il faudrait peut-être gérer aussi la hauteur... non ?

  6. #6
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Salut

    Je te remercie pour tes precieux conseils

    J'ai fait un premier jet avec ce que tu m'as donné et c'est beaucoup mieux, pas au niveau de la rapidite mais au niveau des ressources
    Je passe pour 20 images JPG de 200Mo à 60Mo au niveau gestionnaire

    J'ai besoin d'un peu de temps pour mieux etudier ton code et l'implementer pour d'autre type de fichier et je reviens avec d'autre remarque


  7. #7
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Me revoila

    J'ai eu enfin le temps d'etudier ton code et je gagne reelement en performance
    J'ai pu implementer l'apercu pour le PDF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    package miniature;
     
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import net.sf.ghost4j.Ghostscript;
    import net.sf.ghost4j.GhostscriptException;
     
    public class PdfFileThumbnail implements FileThumbnail
    {
     
        public boolean canCreateThumb(File file)
        {
            return Tools.endsWith(file, ".pdf");
        }
     
        public BufferedImage createThumb(File file, int width, int height) throws IOException
        {
            Ghostscript gs = Ghostscript.getInstance();
     
            //Paramètres ligne de commandes
            String[] gsArgs = new String[9];
            gsArgs[0] = "-dSAFER";
            gsArgs[1] = "-dBATCH";
            gsArgs[2] = "-dNOPAUSE";
            gsArgs[3] = "-dFirstPage=1";
            gsArgs[4] = "-dLastPage=1";
            gsArgs[5] = "-sDEVICE=png16m";
            gsArgs[6] = "-r150";
            gsArgs[7] = "-sOutputFile=" + file.getName() +".png";
            gsArgs[8] = file.getPath();
     
            try
            {
                gs.initialize(gsArgs);
                gs.exit();
            }
            catch (GhostscriptException e)
            {
                System.out.println("ERROR: " + e.getMessage());
            }
            BufferedImage image = ImageIO.read(new File(file.getName() +".png"));
            new File(file.getName() +".png").delete();
            return Tools.createThumbnail(image, width);
        }
    }
    Par contre pour l'affichage de ces vignettes voila comment j'ai procede
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    package miniature;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileFilter;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.SwingConstants;
     
    public class Fenetre extends JFrame implements ActionListener
    {
        private JButton BOU_Directory;
        private JPanel PAN_Droit; private JScrollPane SCR_Image;
        private ThumbFactory factory = new ThumbFactory();
        private JLabel[] miniature;
        private int nbFile = 0;
     
        public Fenetre()
        {
            super("Miniature");
            this.setSize(800, 450);
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
     
            Container c = getContentPane();
            c.setLayout(new BorderLayout(0, 0));
     
            //Panel Gauche
            JPanel PAN_Gauche = new JPanel();
            PAN_Gauche.setPreferredSize(new Dimension(200, 450));
            PAN_Gauche.setBackground(new Color(0x6a6a6a));
            PAN_Gauche.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 15));
            c.add(PAN_Gauche, BorderLayout.WEST);
            //Texte
            JLabel LAB_Texte = new JLabel("<html><center>SELECTION</center>DU REPERTOIRE</html>");
            LAB_Texte.setPreferredSize(new Dimension(200, 60));
            LAB_Texte.setFont(new Font("Serif", Font.BOLD, 20));
            LAB_Texte.setHorizontalAlignment(SwingConstants.CENTER);
            PAN_Gauche.add(LAB_Texte);
            //Bouton vers JFileChooser
            BOU_Directory = new JButton("GO");
            BOU_Directory.setBackground(new Color(0x8c8c8c));
            BOU_Directory.setPreferredSize(new Dimension(70, 25));
            BOU_Directory.setContentAreaFilled(false);
            BOU_Directory.setOpaque(true);
            BOU_Directory.setFocusable(false);
            BOU_Directory.addActionListener(this);
            PAN_Gauche.add(BOU_Directory);
     
            //Panel Droit
            PAN_Droit = new JPanel();
            PAN_Droit.setBackground(new Color(0xbcbcbc));
            PAN_Droit.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
            //JScrollPane
            SCR_Image = new JScrollPane(PAN_Droit,
                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            SCR_Image.setPreferredSize(new Dimension(600, 450));
            c.add(SCR_Image);
        }
     
        public void actionPerformed(ActionEvent e)
        {
            Object source = e.getSource();
            if(source == BOU_Directory)
            {
                //lancement JFileChooser
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.showOpenDialog(this);
     
                //Recuperation des informations
                File homeDir = chooser.getSelectedFile();
                System.out.println("***** Dossier Racine : " + homeDir + " *****");
                if(homeDir != null)
                {
     
                    //Suppression des anciennes miniatures
                    for (int i = 0; i < nbFile; i++)
                    {
                        miniature[i].setVisible(false);
                        miniature[i] = null;
     
                    }
     
                    System.out.println("***** Ajout des Miniatures *****");
                    File[] listFile = homeDir.listFiles(new FileFilter()
                    {
                        public boolean accept(File pathname)
                        {
                            return pathname.isFile();
                        }
                    });
     
                    //Nombre de Fichier + Hauteur Panel
                    nbFile = listFile.length;
                    System.out.println(getHauteurPanel());
                    PAN_Droit.setPreferredSize(new Dimension(600, getHauteurPanel()));
                    miniature = new JLabel[nbFile];
                    System.out.println("***** Nombre de Fichier : " + nbFile + " *****");
     
                    //Ajout des miniatures
                    for (int i = 0; i < nbFile; i++)
                    {
                        System.out.println(listFile[i]);
                        miniature[i] = factory.createThumbComponent(listFile[i], 100, 150, true);
                        PAN_Droit.add(miniature[i]);
                        PAN_Droit.revalidate();
                    }
                }
            }
        }
        private int getHauteurPanel()
        {
            if((nbFile % 5) == 0)
                return 10 + ((nbFile / 5) * 160);
            else
                return 170 + ((nbFile / 5) * 160);
        }
    }
    Je pense qu'ily a moyen d'optimiser sur ce point la aussi tout en gardant les refences car j'aimerais appliquer du dnd dessus et aussi pour la suppression de ces miniatures.

    Sinon quelqu'un aurait il une idee pour l'implementation de TIF, j'ai vu qu'il etait possible de le faire avec JAI mais impossible de le faire fonctionner.

Discussions similaires

  1. [Lazarus] Format d'affichage des dates sous Windows et Linux
    Par ChPr dans le forum Lazarus
    Réponses: 2
    Dernier message: 24/11/2009, 12h16
  2. Réponses: 0
    Dernier message: 13/07/2009, 17h28
  3. Comment gérer des reps sous Windows & Linux ?
    Par Sylver--- dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2007, 14h04
  4. Réponses: 9
    Dernier message: 05/11/2006, 01h33
  5. [Sécurité] Execution des include() sous windows/Linux
    Par secteur_52 dans le forum Langage
    Réponses: 27
    Dernier message: 14/11/2005, 19h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo