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

Multimédia Java Discussion :

Redimensioner image JPEG


Sujet :

Multimédia Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 68
    Par défaut Redimensioner image JPEG
    Bonjour à tous,

    voici mon problème... Je parviens à redimensionner une image (ce qui n'est pas un grand exploit) cependant je constate une perte de qualité. L'image en sortie est pixelisée alors que la source ne l'est pas. Voici les deux moyens que j'ai essayé :

    1er moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public BufferedImage executePlugin(BufferedImage image) {
    	BufferedImage resized = image;
     
    	Dimension dim = computeDimension(resizeInfo, image);
    	resized = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), image.getType());
     
            Graphics2D graphics2D = resized.createGraphics();
            graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    	graphics2D.drawImage(image, 0, 0, (int)dim.getWidth(), (int)dim.getHeight(), null);			
    	return resized;
    }
    Commentaire : computeInfo(...) calcule le ratio entre la hauteur et la largeur et retourne les futures dimensions que devra avoir l'image.

    2ème moyen :

    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
    public BufferedImage executePlugin(BufferedImage image) {
    	Dimension dim = computeDimension(resizeInfo, image);
            // getScaledInstance(...) return an java.awt.image wich will be converted to a BufferedImage by createBufferedImage
    	Image resized = image.getScaledInstance((int) dim.getWidth(), (int) dim.getHeight(), ToolkitImage.SCALE_REPLICATE);
    	return createBufferedImage(resized, new Label());
    }
     
     
    static private BufferedImage createBufferedImage(Image imageIn, Component comp) {
        return createBufferedImage(imageIn, BufferedImage.TYPE_INT_RGB, comp);
    }
     
     
    static private BufferedImage createBufferedImage(Image imageIn,
    		      int imageType, Component comp) {
        MediaTracker mt = new MediaTracker(comp);
        mt.addImage(imageIn, 0);
        try {
          mt.waitForID(0);
        } catch (InterruptedException ie) {
        }
        BufferedImage bufferedImageOut = new BufferedImage(imageIn.getWidth(null), imageIn.getHeight(null), imageType);
        Graphics g = bufferedImageOut.getGraphics();
        g.drawImage(imageIn, 0, 0, null);
     
        return bufferedImageOut;
    }


    Voilà, je ne sais pas trop ce qu'il se passe Comme je l'ai dit, je souhaite garder la même qualité d'image en sortie qu'en entrée.

    Un grand merci à ceux qui auront réussi ou du moins qui auront tenté de m'aider.

    Coyote

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Tu devrais essayer :
    RenderingHints.Key KEY_INTERPOLATION,
    avec les differentes valeurs possibles

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 68
    Par défaut j'ai déjà essayé
    Merci pour ta réponse rapide

    mais j'ai déjà essayé l'interpolation et çà n'a rien donné. Oui effectivement j'obtiens un meilleur résultat mais ce n'est malheureusement pas encore çà. Le projet est destiné à un usage professionel, je ne peux pas donc pas me permettre d'avoir une image pixelisée...

    J'ai aussi essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double scaleValue = (double) image.getHeight() / (double) image.getWidth();
    AffineTransform tx = new AffineTransform();
    tx.scale(scaleValue, scaleValue);
    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    BufferedImage biNew = new BufferedImage( (int) (image.getWidth() * scaleValue), (int) (image.getHeight() * scaleValue), image.getType());
    return op.filter(image, biNew);
    sans succès ....

  4. #4
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut bilinear
    Salut,

    si tu agrandis ton image, le paramètre BILINEAR ne devrait pas pixeliser ton image. Peux-tu poster un de tes résultats ?

    Je pense à une méthode qui ressemble à ta première méthode, c'est d'utiliser les classes AffineTransform et en particulier regarder AffineTransform.getScaleInstance()
    C'est avec ces opérations que le paramètre BILINEAR est utilisé, je n'ai pas testé la méthode drawImage pour changer la taille mais ça ne m'inspire pas, vu tes commentaires. J'ai eu à agrandir des images et ça fonctionne sans pixeliser avec les AffineTransform et BILINEAR. Tu peux aussi essayer BICUBIC, c'est un autre filtre, censé rendre l'agrandissement plus net, mais la seule chose dont je sois sûr à ce propos, c'est que c'est plus lent.

    Sinon, toujours pour une image agrandie, tu peux faire un filtre de flou ou d'adoucissement après avoir fait l'agrandissement.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout ce que vous avez toujours voulu savoir sur le redimensionnement d'images en java sans jamais avoir osé le demander
    http://today.java.net/pub/a/today/20...dinstance.html

Discussions similaires

  1. [SGBD] affichage d'image jpeg depuis une base mysql
    Par eric_300 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/09/2005, 12h27
  2. [DBase][BDE]Insérer des images JPeg dans un table.u
    Par migauvin dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/08/2004, 12h03
  3. Compression d'une série d'images jpeg
    Par Tchello dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2003, 19h59
  4. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

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