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 :

Application Swing -> ImageIO


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Application Swing -> ImageIO
    Bonjour à tous,

    j'ai développer une petite application Swing qui permet de transformer des fichier DICOM en image JPEG. Cette application fonctionne très bien quand je suis dans mon IDE. j'ai généré un jar de cette application et là ça ne fonctionne plus.

    En regardant un peu de plus près, j'ai remarquer qu'il "bloquait" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iterator iterator = ImageIO.getImageReadersByFormatName("DICOM");
    .

    Voici la classe entière :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    public static DicomInfo extractDicomData(File file, File tempDirectory) {
        LogFile.getInstance().log("info", "start extractDicomData method");
        DicomInfo dicomInfo = new DicomInfo();
        try {
          BufferedImage image = null;
          LogFile.getInstance().log("info", "BufferedImage image = null;");
          ImageIO.scanForPlugins();
          LogFile.getInstance().log("info", " ImageIO.scanForPlugins();");
          Iterator iterator = ImageIO.getImageReadersByFormatName("DICOM");
          LogFile.getInstance().log("info", "ImageIO.getImageReadersByFormatName(\"DICOM\");");
          ImageReader reader = (ImageReader) iterator.next();
          DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();
          LogFile.getInstance().log("info", " DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();");
          ImageInputStream iis = ImageIO.createImageInputStream(file);
          reader.setInput(iis, false);
          LogFile.getInstance().log("info", "reader.setInput(iis, false);");
          image = reader.read(0, param);
          iis.close();
     
          if (image == null) {
            LogFile.getInstance().log("error", "couln't read dicom image!");
            return null;
          }
     
          File jpegFile = File.createTempFile("dicom", ".jpg", tempDirectory);
          LogFile.getInstance().log("info", "Temp file : " + jpegFile.getAbsolutePath());
          OutputStream output = new BufferedOutputStream(new FileOutputStream(jpegFile));
     
          ImageWriter writer = null;
          Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
          writer = (ImageWriter) iter.next();
          ImageOutputStream ios = ImageIO.createImageOutputStream(output);
          writer.setOutput(ios);
          ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());
          iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
          iwparam.setCompressionQuality(Float.parseFloat(PropertiesCache.getInstance().getProperty("CompressionQuality")));
          writer.write(null, new IIOImage(image, null, null), iwparam);
          ios.flush();
          writer.dispose();
          ios.close();
          output.close();
          dicomInfo.setImage(jpegFile);
          dicomInfo.setSourcePath(file);
        } catch (Exception ex) {
          LogFile.getInstance().log("error", "No image available in this dicom file " + file.getName());
          LogFile.getInstance().log("Exception", ex.getMessage());
          return null;
        }
     
        try {
          DicomInputStream dicomInputStream = new DicomInputStream(file);
          DicomObject object = dicomInputStream.readDicomObject();
          dicomInfo.setStudyDate((Date) getMetaData(object, "Study Date", Types.DATE));
          dicomInfo.setStudyDescription((String) getMetaData(object, "Study Description", Types.VARCHAR));
          dicomInfo.setPatientName((String) getMetaData(object, "Patient’s Name", Types.VARCHAR));
          dicomInfo.setPatientId((Long) getMetaData(object, "Patient ID", Types.BIGINT));
          dicomInfo.setPatientBirthdate((Date) getMetaData(object, "Patient’s Birth Date", Types.DATE));
          dicomInfo.setPatientSex((String) getMetaData(object, "Patient’s Sex", Types.VARCHAR));
        } catch (IOException ex) {
          LogFile.getInstance().log("error", "unable to get METADATA");
          LogFile.getInstance().log("Exception", ex.getMessage());
        }
     
        return dicomInfo;
      }
    Comme vous pouvez le voir, j'ai ajouter des logs pour voir jusqu’où il va et c'est là que j'ai vu que dès que j'utilise ImageIO, il ne va pas plus loin.

    J'ai également regarder avec ceci ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -verbose -jar dicomUpload.jar
    et voici ce que ça donne (cf pièce jointe) et là je vois des messages d'erreur comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Loaded java.lang.ClassNotFoundException from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.LinkageError from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.NoClassDefFoundError from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.ClassCastException from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.ArrayStoreException from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.VirtualMachineError from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.OutOfMemoryError from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    [Loaded java.lang.StackOverflowError from C:\Program Files\Java\jre1.8.0_77\lib\rt.jar]
    est-ce que quelqu'un a une idée de l'origine du problème ? car ça fait des heures que je suis dessus sans succès.

    Merci d'avance pour vos réponses
    Fichiers attachés Fichiers attachés
    • Type de fichier : 7z log.7z (18,5 Ko, 45 affichages)

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Mouais, ce que tu indiques comme des erreurs, c'est plutot le chargement des classes. Le log que tu as posté ne me semble pas tres pertinent, c'est juste une la liste des classes chargées.

    Citation Envoyé par morakevi Voir le message
    Comme vous pouvez le voir, j'ai ajouter des logs pour voir jusqu’où il va et c'est là que j'ai vu que dès que j'utilise ImageIO, il ne va pas plus loin.
    Ce log la me parait deja beaucoup plus interessant. Mais il n'est pas la. C'est sur quelle ligne que ca bloque ? Et qu'est ce qui se passe exactement ?

    Sans avoir plus d'info, en général, quand ca marche dans l'IDE mais pas avec le jar, c'est souvent un probleme de droit. Il faut verifier que tu as les droits sur le repertoire ou ton programme essaie d'ecrire.
    Il faut aussi t'assurer que tu as bien embarqué dans le jar les ressources dont tu as besoin (et qui sont présentes dans ton IDE).
    Au passage, tu utilises quel IDE ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Il ne passe pas la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Iterator iterator = ImageIO.getImageReadersByFormatName("DICOM");
    étant donné que dans mon fichier de log, je ne vois pas la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LogFile.getInstance().log("info", "ImageIO.getImageReadersByFormatName(\"DICOM\");");
    .

    J'ai tester en mettant une autre ligne comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.scanForPlugins();
    et ça ne passe pas non plus.

    Ce code est exécuter dans un SwingWorker qui boucle sur la liste des documents fourni et pour chaque document fait la conversion.

    Ce que j'ai actuellement, il commence sur le premier document, ensuite quand il arrive à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LogFile.getInstance().log("info", "ImageIO.getImageReadersByFormatName(\"DICOM\");");
    . il passe directement dans la methode done du SwingWorker mais na donc rien fait.

    Voici ce que j'ai dans mon log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [Fri Apr 29 09:49:41 CEST 2016]info > Initialization of the application DONE
    [Fri Apr 29 09:49:41 CEST 2016]info > clean temp directory C:\Users\MORAYKE\AppData\Local\Temp\DICOM_IMG DONE
    [Fri Apr 29 09:49:43 CEST 2016]info > Ouvrir explorateur windows pour choisir un CD/DVD
    [Fri Apr 29 09:49:57 CEST 2016]info > Load all file of the folder O:\Medome\PACS\Samples\85509\4299569\DICOM
    [Fri Apr 29 09:50:00 CEST 2016]info > Number of file found : 333
    [Fri Apr 29 09:50:00 CEST 2016]info > file found : O:\Medome\PACS\Samples\85509\4299569\DICOM\1.2.124.113532.172.22.10.141.20140930.130719.362758139.dcm
    [Fri Apr 29 09:50:00 CEST 2016]info > start extractDicomData method
    [Fri Apr 29 09:50:00 CEST 2016]info > BufferedImage image = null;
    [Fri Apr 29 09:50:00 CEST 2016]info > upload process DONE
    J'utilise NetBeans ainsi que Intellij. pour généré mon jar, j'utilie gradle
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    import org.gradle.api.artifacts.*
     
    apply from: '../fbzgwt.gradle'
     
    apply plugin: 'base' // To add "clean" task to the root project.
     
    subprojects {
        apply plugin: 'java'
        //apply from: rootProject.file('common.gradle')
    }
     
    dependencies {
        // Adding dependencies here will add the dependencies to each subproject.
        //testCompile group: 'junit', name: 'junit', version: '4.10'
        compile 'joda-time:joda-time:1.+'
        testCompile 'junit:junit:4.+'
    }
     
    task mergedJavadoc(type: Javadoc, description: 'Creates Javadoc from all the projects.') {
        title = 'All modules'
        destinationDir = new File(project.buildDir, 'merged-javadoc')
     
        // Note: The closures below are executed lazily.
        source {
           subprojects*.sourceSets*.main*.allSource
        }
        classpath.from {
            subprojects*.configurations*.compile*.copyRecursive({ !(it instanceof ProjectDependency); })*.resolve()
        }
    }
     
     
     
    jar {
        archiveName = "dicomUpload.jar"
     
        from {
            configurations.runtime.collect {
                it.isDirectory() ? it : zipTree(it)
            }
     
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }
     
        dependencies {
            compile project(':application')
        }
     
        manifest {
            attributes 'Main-Class': 'be.fmpfbz.dicomupload.client.DicomUpload'
        }
     
        exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    }
    Comment est-ce que je peux savoir si c'est un problème de droit d'accès ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Après avoir chipoter dans mon code, j'ai enfin réussi a récupéré une exception la voici :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Exception in thread "AWT-EventQueue-0" java.util.ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi: Provider com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi could not be instantiated
            at java.util.ServiceLoader.fail(Unknown Source)
            at java.util.ServiceLoader.access$100(Unknown Source)
            at java.util.ServiceLoader$LazyIterator.nextService(Unknown Source)
            at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
            at java.util.ServiceLoader$1.next(Unknown Source)
            at javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(Unknown Source)
            at javax.imageio.spi.IIORegistry.<init>(Unknown Source)
            at javax.imageio.spi.IIORegistry.getDefaultInstance(Unknown Source)
            at javax.imageio.ImageIO.<clinit>(Unknown Source)
            at be.fmpfbz.dicomupload.client.tools.DicomTools.extractDicomData(DicomTools.java:64)
            at be.fmpfbz.dicomupload.client.tools.DicomTools.loadDicomData(DicomTools.java:186)
            at be.fmpfbz.dicomupload.client.DicomUpload.OpenMenuActionPerformed(DicomUpload.java:214)
            at be.fmpfbz.dicomupload.client.DicomUpload.access$100(DicomUpload.java:27)
            at be.fmpfbz.dicomupload.client.DicomUpload$2.actionPerformed(DicomUpload.java:140)
            at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
            at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
            at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
            at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
            at javax.swing.AbstractButton.doClick(Unknown Source)
            at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
            at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
            at java.awt.Component.processMouseEvent(Unknown Source)
            at javax.swing.JComponent.processMouseEvent(Unknown Source)
            at java.awt.Component.processEvent(Unknown Source)
            at java.awt.Container.processEvent(Unknown Source)
            at java.awt.Component.dispatchEventImpl(Unknown Source)
            at java.awt.Container.dispatchEventImpl(Unknown Source)
            at java.awt.Component.dispatchEvent(Unknown Source)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
            at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
            at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
            at java.awt.Container.dispatchEventImpl(Unknown Source)
            at java.awt.Window.dispatchEventImpl(Unknown Source)
            at java.awt.Component.dispatchEvent(Unknown Source)
            at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
            at java.awt.EventQueue.access$500(Unknown Source)
            at java.awt.EventQueue$3.run(Unknown Source)
            at java.awt.EventQueue$3.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
            at java.awt.EventQueue$4.run(Unknown Source)
            at java.awt.EventQueue$4.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
            at java.awt.EventQueue.dispatchEvent(Unknown Source)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
            at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
            at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            at java.awt.EventDispatchThread.run(Unknown Source)
    Caused by: java.lang.IllegalArgumentException: vendorName == null!
            at javax.imageio.spi.IIOServiceProvider.<init>(Unknown Source)
            at javax.imageio.spi.ImageReaderWriterSpi.<init>(Unknown Source)
            at javax.imageio.spi.ImageReaderSpi.<init>(Unknown Source)
            at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi.<init>(CLibJPEGImageReaderSpi.java:80)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
            at java.lang.reflect.Constructor.newInstance(Unknown Source)
            at java.lang.Class.newInstance(Unknown Source)
            ... 50 more

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Apèrs avoir encore un peu chercher, j'ai enfin trouver ce qu'il manquait. Il s'agit du vendor dans le fichier MANIFEST.MF.

    J'ai donc créé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Manifest-Version: 1.0
    Main-Class: be.fmpfbz.dicomupload.client.DicomUpload
    Built-By: Kevin MORAY
    Created-By: Kevin MORAY
    Specification-Title: Java Advanced Imaging Image I/O Tools
    Specification-Version: 1.1
    Specification-Vendor: Sun Microsystems, Inc.
    Implementation-Title: com.sun.media.imageio
    Implementation-Version: 1.1
    Implementation-Vendor: Sun Microsystems, Inc.
    Mais je suis bloqué un peu plus loin avec cette erreur -> NoSuchElementException sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageReader reader = (ImageReader) iterator.next();
    Il ne trouve donc pas ImageReader pour les DICOM

    J'ai changé mon fichier manifest par ceci mais j'ai toujours la même erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Manifest-Version: 1.0
    Main-Class: be.fmpfbz.dicomupload.client.DicomUpload
    Built-By: Kevin MORAY
    Created-By: Kevin MORAY
    Implementation-Title: dcm4che DICOM toolkit and utilities
    Implementation-Version: 3.3.8-SNAPSHOT
    Implementation-Vendor-Id: org.dcm4che
    Implementation-Vendor: dcm4che.org
    Specification-Title: dcm4che DICOM toolkit and utilities
    Specification-Version: 3.3.8-SNAPSHOT
    Specification-Vendor: dcm4che.org

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut RÉSOLU
    J'ai trouvé une solution à ce problème

    En regardant le code caché dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.scanForPlugins();
    , j'ai remarquer qu'il charge les provider a partir des fichiers ImageReaderSpi situé dans le répertoire META-INF/services/.

    j'ai donc trouvé la classe dédié au DICOM, étant donné que celle-ci ne se charge pas via la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.scanForPlugins();
    , je la charge manuelle dans mon code comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIORegistry.getDefaultInstance().registerServiceProvider(new DicomImageReaderSpi());
    .

    Ensuite j'ai regénéré mon JAR et tout fonctionne enfin .

    Merci pour votre écoute

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

Discussions similaires

  1. Java intégration browser web dans une application swing ....
    Par Manu35 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 23/03/2006, 08h47
  2. Réponses: 10
    Dernier message: 16/03/2006, 11h31
  3. [Stratégie] Mise à jour application SWING
    Par chr_one dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/08/2005, 15h31
  4. [Info][Ecran Tactile]Application Swing
    Par Rampa dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 12/07/2005, 10h09
  5. [JDBC][ARCHITECTURE] application swing
    Par benssj5 dans le forum JDBC
    Réponses: 6
    Dernier message: 31/08/2004, 19h25

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