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

Graphisme Java Discussion :

[AffineTransform]Qualité de redimensionnement


Sujet :

Graphisme Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut [AffineTransform]Qualité de redimensionnement
    Bonjour,
    j'ai besoin de redimensionner des images de grandes tailles en beaucoup plus petite, le problème est que ces images contiennent essentiellement du texte.
    Hors, le texte devient vite illisible alors qu'il faudrait qu'il reste très clair.

    Par toute logique une image de grande taille devrait me donner des qualités respectables, mais ca n'est pas le cas, je me demande alors si cela vient de ma façon de faire ou alors de l'algorithme du JDK.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    AffineTransform tx = new AffineTransform();
    double ratio = (double)newWidth/srcB.getWidth();
    tx.scale(scaleWidth, scaleHeight);
    AffineTransformOp op = new AffineTransformOp(tx,getHintsByQuality(quality));
    BufferedImage bi = op.filter(srcB, imgType.createBufferedImage(newWidth,newHeight));
     
    return bi;
    J'ai éssayé aussi de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BufferedImage bi = imgType.createBufferedImage(newWidth,newHeight);
    Graphics2D g = bi.createGraphics();
    g.setRenderingHints(getHintsByQuality(quality));
    g.drawImage(srcB, 0, 0 ,newWidth,newHeight, null);
    Voici des exemples d'images, même si c'est un mauvais exemple car le texte est déjà trop fin. En temps normal le texte est bien plus gros, mais le problème est le même, j'ai un rendu de redimensionnement très mauvais par rapport à des outils (Gimp, Photoshop,..) ou avec d'autres librairies (GDLib).
    original.png
    En 1500
    En 1100
    En 1100

    Auriez-vous une idée, une solution ?

    Cordialement,
    Thomas

  2. #2
    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
    Commence par te diriger vers les techniques décrites dans ce tuto:

    http://today.java.net/pub/a/today/20...dinstance.html

    Puis dans le pire des cas dirige toi vers vers un Image.getScaledInstance avec SCALE_SMOOTH comme hint

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    getScaledInstance() c'est poa bien...

    Ca sent le besoin de passer un filtre (sharpen ?) sur l'image apres redimensionnement (voir la classe Kernel).

    Ah vi et quel etaient les rendering hints utilises pour le redimensionnement (et plus specifiquement le RenderingHints.KEY_INTERPOLATION) ?

    En fouillant sur le forum on doit egalement trouver la methode de redimensionnement successifs par 2 en utilisant RenderingHints.VALUE_INTERPOLATION_BILINEAR qui est plus rapide et donne de meilleurs resultats qu'un unique redimensionnement avec RenderingHints.VALUE_INTERPOLATION_BICUBIC. Ah vi il est egalement indique plus bas dans l'article.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Tout d'abord, merci pour vos réponses !

    Effectivement l' article traite très bien le sujet, je vais faire quelques testes autour de la technique de multi-step.
    Et comme la performance n'est pas prioritaire, je vais essayer un "SCALE_SMOOTH" pour voir le rendu.

    Les Hints utilisés dépendent de mon paramètre de qualité, mais aucun ne convient.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    hints.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
    hints.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
    hints.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    ...
    Je suis actuellement, un peu passé au-dessus du problème en prenant des images sources moins large. Mais le résultat n'est pas super satisfaisant quand même.
    Et au contraire de ce que tu me dit bouye, j'avai plutôt pensé à un filtre "ConvolveOp" très faible pour lisser les bords mais je comparerai les deux résultats.

    Je reviendrai dire ce qu'il en est ! Merci !

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Effectivement cette nouvelle méthode de redimensionement produit un rendu plus propre ! De plus, la performance n'est pas mise à défaut, c'est parfait, merci !


    Voilà donc la méthode que j'utilise maintenant :

    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
     
    public static BufferedImage getScaledInstance(final BufferedImage img,final int targetWidth,final int targetHeight,final RenderingHints hint,final boolean higherQuality,final float resizeStepRate)
        {
            int type = (img.getTransparency() == Transparency.OPAQUE) ?
        				BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
            BufferedImage ret = (BufferedImage)img;
            int w, h;
            if (higherQuality) {
                // Use multi-step technique: start with original size, then
                // scale down in multiple passes with drawImage()
                // until the target size is reached
                w = img.getWidth();
                h = img.getHeight();
            } else {
                // Use one-step technique: scale directly from original
                // size to target size with a single drawImage() call
                w = targetWidth;
                h = targetHeight;
            }
     
            do {
                if (higherQuality && w > targetWidth) {
                    w /= resizeStepRate;
                    if (w < targetWidth) {
                        w = targetWidth;
                    }
                }
     
                if (higherQuality && h > targetHeight) {
                    h /= resizeStepRate;
                    if (h < targetHeight) {
                        h = targetHeight;
                    }
                }
     
                BufferedImage tmp = new BufferedImage(w, h, type);
                Graphics2D g2 = tmp.createGraphics();
                g2.setRenderingHints(hint);
                g2.drawImage(ret, 0, 0, w, h, null);
                g2.dispose();
     
                ret = tmp;
            } while (w != targetWidth || h != targetHeight);
     
            return ret;
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GD] Qualité du redimensionnement passable PNG/GIF transparents
    Par max-mag dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 21/05/2010, 11h24
  2. Redimensionnement haute qualité
    Par Pill_S dans le forum Graphisme
    Réponses: 1
    Dernier message: 03/02/2009, 12h35
  3. Perte de qualité du texte quand site redimensionné
    Par popovitch130 dans le forum Flash
    Réponses: 0
    Dernier message: 07/08/2008, 16h27
  4. [GD] Perte de qualité après redimensionnement
    Par daroth dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/07/2008, 21h03
  5. [GD] Galerie et qualité du redimensionnement
    Par elkion dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/12/2006, 23h17

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