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

avec Java Discussion :

Afficher une Image, et vite !


Sujet :

avec Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Afficher une Image, et vite !
    Bonjours,

    Comme dit dans un précédent post, gestion-memoire/, je travail actuellement sur un projet de visualisation de photos. J'ai rencontré quelque souci au niveau de la RAM utilisé, ce qui m'a poussé a tester mon application sur un petit PC (l'apps est destiné a tourner sur du matos datant de 2002 (soit env : 1go ram, proco 2ghz, hdd d’époque))
    Et là, c'est le drame.

    Autant Java gère admirablement bien la mémoire vive, autant pour simplement lire une image et l'afficher, il me faut énormément de temps.

    Pour simplement ouvrir une image et l'afficher, tel que le fait windows en 2sec quand je double clique dessus, il m'en faut ici plus de 10...
    La création des miniatures, déja tres lente sur mon pc de travail (3sec) est interminable.

    J'utilise pour cela le bien connu Toolkit.getDefaultToolkit().getImage("c:\\...");
    Pour un exemple j'utilise ceci (modifié pour benchmark)
    Mes photos de test sont au format JPEG et pèsent entre 3 et 4mo.

    Si la génération des miniatures est lente, ce n'est pas encore trop grave, mais sans l'affichage des photo, l'application perd totalement de son intérêt...

    J’espère vraiment que vous pourrez m'aider sur ce point

    Merci d'avance pour vos réponses !

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Commence par tester avec les méthodes modernes de chargement d'image, à savoir celles issues d'ImageIO.

    Les méthodes du Toolkit sont antédiluviennes et datent des toutes premières versions de java.

    Secondement, il va te falloir faire en sorte que toutes les méthodes de chargement et manipulation d'images se fassent dans un Thread séparé, en effet, charger un image dans le thread principal de ton application graphique va totalement la bloquer, de même pour les redimensionnement.

    De plus, comment t'y prends tu pour faire tes miniatures? La méthode getScaledInstancce par exemple étant à éviter à tout prix car excessivement lente.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Candidat au Club
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Excellente réponse !

    Je savais que ces méthodes étaient vielles et poussiéreuse, mais hélas, par recherche sur notre ami, je ne tombe que la dessus, meme sur des post de 2011...

    Bref, ImageIO semble bine plus rapide (semble, car j'ai du mal a savoir a quel point tellement ça va vite sur cet ordi ^^', je donnerais mes stats des que possible )

    Merci donc pour ce point !

    Pour les miniature, je procède ainsi :

    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
    final File file = new File(entity.getPath());
    final BufferedImage image = ImageIO.read(file);
    final Image drawImage;
     
    if (image.getWidth() > image.getHeight()) {
    	final int width = 100;
    	final int height = 100 * image.getHeight() / image.getWidth();
    	buffer = new BufferedImage(width, height, image.getType());
    	drawImage = image.getScaledInstance(width, height, Image.SCALE_FAST);
    } else {
    	final int width = 100 * image.getWidth() / image.getHeight();
    	final int height = 100;
    	buffer = new BufferedImage(width, height, image.getType());
    	drawImage = image.getScaledInstance(width, height, Image.SCALE_FAST);
    }
     
    buffer.createGraphics().drawImage(drawImage, 0, 0, null);
     
    ImageIO.write(buffer, "jpg", source);
    Ha !! getScaledInstancce()... Bah zut ^^
    Bien vu donc pour avoir lu mon code avant même que je le publie (mais ce qui veut dire que je suis pas le 1er a tomber dans le panneau, j'aurai du mieux fouiller ce forum...)

    Du coup, quelle méthode me conseillerez vous ?

    Encore merci pour cette réponse, aussi rapide que pertinente !

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    LE problème de getScaledInstance, c'est que vous obtenez d'abord une image pleine taille que vous réduisez. Le but est de décoder le jpeg directement dans la taille voulue. De plus, le JPEG contient peut être déjà une miniature que vous pourriez utiliser de suite.

    Donc à regarder, les méthodes:
    ImageReader.readThumbnail() et hasThumbnail()

    et éventuellement (je ne suis pas certain) IIOParam.setSourceSubsampling(), pour changer la taille de lecture.

Discussions similaires

  1. [VB.NET] afficher une image stockée dans une table
    Par matonfire dans le forum ASP.NET
    Réponses: 4
    Dernier message: 19/03/2004, 11h21
  2. Afficher une image JPG qui se trouve dans une bdd
    Par Harry dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/02/2004, 10h51
  3. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59
  4. Réponses: 2
    Dernier message: 04/02/2004, 22h32
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13

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