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

2D Java Discussion :

générer une image de bonne qualité


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut générer une image de bonne qualité
    Salut!

    J'utilise une méthode que j'ai trouvée quelque part sur ces forums pour imprimer un JPanel. La technique utilisée est de d'abord transformer le JPanel en un fichier image temporaire, pour ensuite imprimer cette image. Ca fonctionne très bien, le seul souci est que l'image générée est de qualité plutot médiocre...
    Est-ce que qqn sait par hasard comment améliorer cette qualité ?

    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
    public void Impression(JPanel tp) {
    		File fileTemp = new File("temp");
    		BufferedImage image = new BufferedImage(tp.getWidth(), tp.getHeight(),
    	     	BufferedImage.TYPE_INT_RGB);		
    	    	Graphics2D g2 = image.createGraphics();
    	    	tp.paint(g2);
    	    	g2.dispose();
    	    	try {
    			ImageIO.write(image, "jpeg", fileTemp);
    		} catch (IOException e) {		
    			e.printStackTrace();
    		}
    		InputStream is = null;
    		try {
    			is = new BufferedInputStream(new FileInputStream(fileTemp));
    		} catch (FileNotFoundException e1) {				
    			e1.printStackTrace();
    		}
    		DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
    		Doc myDoc = new SimpleDoc(is, flavor, null);	
     
    		PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
                    // l'ajout d'attribut par défaut permet de ne pas devoir els //sélectionner dans la boite de dialogue d'impression.
    		aset.add(new Copies(1));
    		aset.add(MediaSizeName.ISO_A4); 
     
    		PrintService[] printService = PrintServiceLookup.lookupPrintServices(flavor, aset);
    		PrintService defaultService = 
    		PrintServiceLookup.lookupDefaultPrintService();
    		PrintService service = ServiceUI.printDialog(null, 200, 200,
    		printService, defaultService, flavor, aset);
    		if (service != null) {
    			DocPrintJob job = service.createPrintJob();
    			try {
    				job.print(myDoc, aset);
    			} catch (PrintException e) {					
    				ta.append(e.toString() + "\n");
    			}
    			}								
    		fileTemp.delete();
    	}
    Merci !

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 814
    Points : 7 642
    Points
    7 642
    Par défaut
    Salut,

    Citation Envoyé par ratakses
    le seul souci est que l'image générée est de qualité plutot médiocre...
    Tu sauves en quoi? JPEG à 75% de compression?

    Si tu ne veux pas perdre en qualité, essaie en enlevant la compression, ou utilises un format sans perte (BMP, PNG, ...)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    ben en fait justement je me demandais si il yavait peut-être un paramètre pour préciser le taux de compression du jpeg... Je n'ai rien trouvé.

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    De toute façon le JPEG pour des captures d'écran... c'est vraiment pas adapté... Autant au niveau qualité qu'au niveau ratio de compression...
    Le mieux pour ça c'est PNG...

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    Euh mais pourquoi faire une image (qu'il n'est pas necessaire de sauvegarder sur le disque d'ailleurs, on peut la conserver en memoire) alors qu'on peut imprimer directement en fournissant le graphics fournis par le Printable a la methode print ou paint du JPanel pour lui demander de se dessiner dessus.

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par bouye
    Euh mais pourquoi faire une image (qu'il n'est pas necessaire de sauvegarder sur le disque d'ailleurs, on peut la conserver en memoire) alors qu'on peut imprimer directement en fournissant le graphics fournis par le Printable a la methode print ou paint du JPanel pour lui demander de se dessiner dessus.
    C'est quoi la différence entre print et paint()?

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par ®om
    C'est quoi la différence entre print et paint()?
    Je ne suis pas expert, mais je vois plusieurs différences :
    - le Graphics utilisé par paint va écrire dans la mémoire graphique partagée (et si possible utiliser une accélération matérielle), alors que le Graphics utilisé par print va écrire sur le driver de l'imprimante, donc deux adresses mémoire système différentes (ce qui est invisible au niveau Java).
    - selon la qualité du driver de l'imprimante, il arrive que print utilise un Graphics qui ne soit pas de type Graphics2D (alors que paint toujours).

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    En general print() appelle paint() et printComponent() appelle paintComponent() (cf Javadoc).
    Le seul interret est de laisser la possibilite de faire des traitement particuliers lors de l'impression (par exemple utiliser une police plus petite, des couleurs plus lisibles, etc... ou imprimer un truc completement different avec un layout specifique).

    Citation Envoyé par xavlours
    - le Graphics utilisé par paint va écrire dans la mémoire graphique partagée (et si possible utiliser une accélération matérielle), alors que le Graphics utilisé par print va écrire sur le driver de l'imprimante, donc deux adresses mémoire système différentes (ce qui est invisible au niveau Java).
    Ca c'est le comportement par defaut quand paint() est appele depuis la thread d'affichage. Mais apres on peut appeler paint() de n'importe ou, et avec n'importe quel graphics pour par exemple exporter dans une image.

    Citation Envoyé par xavlours
    - selon la qualité du driver de l'imprimante, il arrive que print utilise un Graphics qui ne soit pas de type Graphics2D (alors que paint toujours).
    Meme depuis Java 2 ? Il me semblait que depuis Java 2 tous les Graphics etaient des Graphics2D (hors DebugGraphics mais je n'ai jamais utilise cette classe). Ah ca peut etre genant alors car en me basant sur l'affichage j'ai utilise des Graphics2D partout... Hum, il est vrai que rien n'est vraiment specifie a ce sujet dans la doc ou les livres. ... ca va en faire des tests a rajouter dans les methodes de rendu...

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par bouye
    Meme depuis Java 2 ? Il me semblait que depuis Java 2 tous les Graphics etaient des Graphics2D
    J'ai répondu il y a peu à quelqu'un qui avait un ClassCastException (Graphics2D) lors de l'impression, mais je ne sais pas quelle version il utilisait.

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Mais, quel est l'intérêt de print()?
    Imprimer le panel sur une imprimante???

  11. #11
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Ok alors il me semble que print sert à faire des ajustements avant d'appeler paint, de manière à "customiser" le rendu. Mais je ne sais pas de quel ordre sont ces changements (j'ai entendu parler de changements de Layout !).

    Par exemple si un composant est écrit blanc sur noir, on préfèrera peut-être l'imprimer noir sur blanc. Ou remplacer une bordure compliquée avec dégradés par un simple trait noir. Ou ne pas imprimer des tas de petits ToolTips qui apparaissent à l'écran.

    En gros, si tu crées une Bufferedimage et que tu y dessines ton composant avec paint ou print, ça ne donnera pas forcément le même résultat.

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    S'il utilisait du Java 1.1 c'est normal. Apres il faut verifier, c'etait peut-etre un bug ou un pilote d'impression foireux (j'ignore quel est le niveau d'integration de Java2D et des pilotes d'imprimante). Je sais juste que au tout debut de Java 1.2 et des premieres beta de la 1.3, durant mon stage, j'avais une Epson sur laquelle il m'etait absolument impossible d'imprimer alors qu'il n'y avait acun probleme sur la HP laser. Aucune exception, juste rien ne sortait depuis Java.

    Tu peux faire... tous les changements que tu veux, du moment que tu ne "casses" pas le composant (donc verifier les interractions entre la thread d'impression et l'EDT qui peuvent ne pas etre la meme). Dans mon cas particulier j'avais un lib de graphe qui quand on appelait print() divisait toutes les tailles des polices par deux histoire que les labels soient moins gros a l'impression. Evidement il ne faut pas oublier de restaurer le composant a son etat initial apres le rendu, a la fin du print().

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Merci de vos réponses...

    En fait en ce qui concerne la génération de l'image, c'est bon c'est du PNG maintenant, donc plus de perte de qualité à ce niveau la, mais j'ai encore un problème...

    Cette méthode est destinée à imprimer une image sur laquelle du texte a été généré, donc en gros j'affiche une image dans mon JPanel, puis du texte par dessus, et enfin je le fournis en argument à ma méhtode d'impression pour l'imprimer.
    Le souci est que la qualité d'impression est carrément assez mauvaise, alors que la qualité de l'image de départ ne l'est pas... La qualité est assez acceptable sur une imprimant d'entrée de gamme pour laquelle on peut choisir d'imprimer en qualité haute dans la boite de dialogue, mais sur l'imprimante sur laquelle le programme est destiné à "entrer en production" ce choix n'est pas présent, et la qualité n'est pas bonne. (alors qu'il s'agit d'une laser couleur assez haut de gamme, installée dans les règles de l'art sur le poste qui fait tourner le programme).

    Comme ce programme est destiné à générer des cartes de membres assez jolies et pas trop pixelisées, je me demandais si qqn avait par hasard une idée de la source de mon petit problème.... Je connais pas grand chose à l'impression avec java.

    Merci pour votre aide!

  14. #14
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Si tu imprimes l'image de taille "affichée" à l'écran, c'est normal que la qualité ne soit pas bonne (72dpi), pour une impression il faut bien 300dpi voire 600dpi... Il faut donc une image "plus grande"...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    ok jusque la jte suis, mais comment je fais pour qu'une image plus grande apparaisse de la bonne taille dans le JPanel, et soit imprimée de la bonne taille ?

    Il me manque 2-3 notions jcrois bien héhé...

Discussions similaires

  1. [VB6] Afficher une image de bonne qualité dans un form
    Par hpfx dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/05/2006, 12h23
  2. Comment générer une image dynamiquement ?
    Par K20 dans le forum Langage
    Réponses: 12
    Dernier message: 19/11/2005, 01h27
  3. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32
  4. [ImageMagick] Comment générer une image d'un code à entrer ?
    Par MiJack dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 16/01/2005, 21h29
  5. Réponses: 6
    Dernier message: 30/09/2004, 12h21

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