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 :

[swing] redimensionner une image


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut [swing] redimensionner une image
    Bonjour,

    Je sais que le sujet a était déjà abordé pas mal de fois mais je suis dans un impasse.

    J'ai développé une application ou il faut que je redimensionne des images pour les envoyer sur un serveur.

    J'ai déjà fait ça mais en envoyant l'image tel quel pour la redimensionner directement sur le serveur en php, seulement voilà quand l'image et immense et de très bonne qualité le serveur n'est plus assez puissant pour la redimensionner (et c'est extrêmement long si on a un connexion en carton). je voudrais donc maintenant changer ma façon faire pour redimensionner les images en local avant de les envoyer au serveur.

    j'ai regarder pas mal de post sur le net mais je tombe très très souvent (voir tout le temps) sur un redimensionnement a en "ratio" du genre rétrécir de X%. Ce que je voudrais c'est redimensionner pour que les image fasse toute la même largeur maximum et hauteur maximum. j'avais trouver une librairie pour le faire en php mais je ne trouve rien pour le faire en swing. (ou je suis mauvais). je sais pas si vous avez des idées a me soumettre.

    en attendant votre réponse je continu de chercher et je vous fait la bise :p

    Cordialement

    Pyromanprod

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Citation Envoyé par pyromanprod Voir le message
    Ce que je voudrais c'est redimensionner pour que les image fasse toute la même largeur maximum et hauteur maximum.
    Sans respecter les proportions c'est bien ça ? (pas une bonne idée à mon avis)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    si si justement c'est pour ça que je précise "maxi".

    en fait en php j'ai fait un script qui redimensionne pour que l'image ne dépasse pas 50pixel ni en hauteur ni en largeur mais elle ce redimensionne en gardant les proportion. donc sur un image format paysage c'est la largeur qui dépasse pas les 50pixel et la hauteur et adapté pour garder la proption.


    exemple : une image 500x400 elle seras redimensionné en 50x40 tu vois?
    une image 300x500 sera elle redimensionné en 30x50

    et tous sa est calculer dans le script.

    en gros avec ça + une librairie (imagine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $image->resize(new Box(15, 25))
     
       ->save('/path/to/new/image.jpg');
    on redimensione en maxi 15 sur maxi 25 en gardant les proportions (j'ai épurer le code hein)

    je cherche pas forcément un code tous fait mais au moins une piste du genre "fouille dans tel ou tel librairie tu trouveras ton bonheur"

    mais la je sais pas du par ou commencer.
    en attendant votre réponse
    Je vais aller revoir la faq et les tutos mais il me semble bien avoir déjà regardé

    cordialement

    Pyromanprod

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Ok je me disait bien aussi

    Regarde par ici : https://java.developpez.com/faq/gui/...nner-une-image
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    merci beaucoup,

    BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

    c'est ça qui fait qu'on garde les proportions ? en rouge

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Le 3ème paramètre est pour le type d'image. Rien avoir avec les proportions.

    Les dimension sont données par les 2 premier paramètres, il faut donc faire un petit calcul.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    ok ok j'ai trouver un petit algorythme je vais essayer ça et je te tiens au courant. merci beaucoup

  8. #8
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    avan de lancer l'algorythme j'ai voulu vérifié si j'enregistrer bien l'image avec ce code.


    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
    /* On crée une nouvelle image aux bonnes dimensions. */
            BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
     
            /* On dessine sur le Graphics de l'image bufferisée. */
            Graphics2D g = buf.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(source, 0, 0, width, height, null);
     
            g.dispose();
     
            try {
                File f = new File("pouet.png");
                ImageIO.write(buf, type , new File("C:\\Users\\Pyromanprod\\Desktop\\pouet."+type));
     
            } catch (IOException ex) {
                Logger.getLogger(ScaleImage.class.getName()).log(Level.SEVERE, null, ex);
            }
    pour l'instant très mal organiser car je fait des test.

    l'image et bien créer sur mon bureau ou presque.

    il y a bien un fichier qui s'appelle "pouet.leTypeDeFichier" mais je ne peux pas l'ouvrir j'ai cette erreur : "l'objet invoqué s'est déconnecté de ses clients" qu'and j'essaie de l'ouvrir.

    je suis un peu perdu la

    cordialement
    Pyromanprod


    ps : ImageIO.write(buf, type , new File("C:\\Users\\Pyromanprod\\Desktop\\pouet."+type)); ici le "type" et un string créer a partir du type de fichier de l'image choisi dans un jfilechooser

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String type = "PNG";
    File f = new File("C:\\Users\\Pyromanprod\\Desktop\\pouet."+type);
    ImageIO.write(buf, type, f);
    https://docs.oracle.com/javase/tutor...saveimage.html
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    Je ne comprend pas trop ce qui change puisque mon "type" a moi c'est un string qui sort dans un System.out.println : "PNG"

    donc si je suis ce que te ma écris ceci reviens au même a la différence pret que mon type seras respecter par rapport au type de l'image d'originie enfin ..... si j'ai bien compris

  11. #11
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Oui c'est à peu près ça.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    Merci pour tous je viens enfin d'avoir eu un peu de temps pour rebosser dessus.

    j'ai avancé mais c'est pas encore ça

    image de base :
    Nom : bannièreTS.png
Affichages : 1304
Taille : 163,2 Ko

    image redimenssioné

    Nom : pouet.PNG
Affichages : 1258
Taille : 321 octets

    comme tu peux le voir .... elle est transparente.

    et parfois elle est bien et parfois elle a des couleurs chelous c'est un peu aléatoire....


    voila le code l'appel de la classe de redimenssionement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Image img =  Toolkit.getDefaultToolkit().getImage(uf.getFileDirectory());
     
                si.scale(img, 250, 250, uf.getFileType());
    et le code :

    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
     /* On crée une nouvelle image aux bonnes dimensions. */
            BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
     
            /* On dessine sur le Graphics de l'image bufferisée. */
            Graphics2D g = buf.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(source, 0, 0, width, height, null);
     
            g.dispose();
     
            try {
                File f = new File("C:\\Users\\Renaud\\Desktop\\pouet."+type);
                ImageIO.write(buf, type , f);
     
            } catch (IOException ex) {
                Logger.getLogger(ScaleImage.class.getName()).log(Level.SEVERE, null, ex);
            }
            /* On retourne l'image bufferisée, qui est une image. */
            return buf;

  13. #13
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Et pourquoi forcement mettre TYPE_INT_ARGB ? si tu travailles qu'avec des images sans transparence, ça ne sert a rien d'avoir le canal Aplha.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut
    ok je viens de tester avec

    BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    il y a quelque chose de bizarre je pense ne pas être loin de la vérité mais je trouve pas exactement.

    ça fonction très bien mais ....; seulement si j'essaie de redimensionner l'image 2fois de suite. la première fois ça fait un image transparente

    et la deuxième fois c'est niquel. (si je ne relance pas le logiciel entre temps)

    je pensais a mon "g.dispose" qui serais appeler peut être un peu trop tôt mais apparemment non car je l'ai décaler et ça fait toujours pareil. je dois surement appeler un fonction trop tôt et qui ferais que l'image et prise en charge seulement a seconde tour. je cherche de mon coté mais si tu as une idée je veux bien prendre.
    la ou j’appelle la class de redimensionnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UploadFile uf = new UploadFile();
            if(uf.FileChoser()){
                ScaleImage si = new ScaleImage();
                String typeFile = uf.getFileType();
                parcourirLabel.setText(" "+uf.getFileName());
                Image img =  Toolkit.getDefaultToolkit().getImage(uf.getFileDirectory());
     
                si.scale(img, 250, 250, typeFile);
     
            }else{
                parcourirLabel.setText(" Pas de fichier choisi");
            }
    la class de redimensionnement
    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
    public Image scale(Image source, int width, int height, String type) {
            File f = new File("C:\\Users\\Renaud\\Desktop\\pouet."+type);
            /* On crée une nouvelle image aux bonnes dimensions. */
            BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     
            /* On dessine sur le Graphics de l'image bufferisée. */
            Graphics2D g = buf.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(source, 0, 0, width, height, null);
     
     
     
            try {
     
                ImageIO.write(buf, type , f);
     
            } catch (IOException ex) {
                Logger.getLogger(ScaleImage.class.getName()).log(Level.SEVERE, null, ex);
            }
     
            g.dispose();
            /* On retourne l'image bufferisée, qui est une image. */
            return buf;
        }
    merci pour tout


    [EDIT] j'ai re le bug de "media deconnecter de ses clients...." que je n'avais plus hier soir ......

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est difficile de te répondre précisemment, parce qu'on a pas tout ton code. En particulier, on ne sait pas ce que retourne of.getFileDirectory() (le nom n'est pas logique par ailleurs, un fichier image étant un fichier, et pas un répertoire).

    Il faut savoir que Toolkit.getDefaultToolkit().getImage(chemin, String ou URL) te renverra toujours une instance d'image, même si le fichier n'existe pas. Sauf que drawImage() ne dessinera rien. Utilise plutôt ImageIO.read() qui te retournera une erreur si le fichier n'existe pas.

    Le dispose() sert à libérer les ressources mémoires utilisées pour construire l'image. Il faut le faire lorsqu'on a finit de construire l'image. Mais, en tout logique, avant de sauvegarder le fichier (difficile de savoir s'il n'y a pas des cas où l'image ne serait pas complète dans le cas contraire).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Les images chargées avec Toolkit ne le sont-elle pas de manière asynchrone en plus ? Si c'est le cas elle n'est peut-être pas complètement chargée au moment ou il essaie de faire son 1er redimensionnement. Préférer ImageIcon ou ImageIO pour des chargements synchrone/bloquants.
    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

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bouye Voir le message
    Les images chargées avec Toolkit ne le sont-elle pas de manière asynchrone en plus ?
    C'est le cas en effet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre averti
    Homme Profil pro
    developpeur débutant
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : developpeur débutant

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Par défaut un peu de retard
    HEY salut !!

    Je reviens avec un peu de retard mais j'ai eu pas mal de soucis en ce moment j'ai donc enfin pu tester !!! et en effet avec ImageIO tous fonctionne parfaitement !!! MERCI MERCI MERCII !!!!

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

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