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 :

[Morena] Numérisation avec Morena et sauvegarde en TIFF


Sujet :

Multimédia Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut [Morena] Numérisation avec Morena et sauvegarde en TIFF
    Bonjour,

    Je développe une applet destinée à la numérisation de documents en ligne. Pour cela j'utilise le framework Morena (version 6.4, http://www.gnome.sk/Twain/jtp.html). L'application web présente un aperçu des images numérisées et permet d'afficher n'importe quelle page numérisée.

    Mes fonctions de numérisation et de navigation son faites, mais j'ai maintenant besoin de sauvegarder les images numérisées au format TIFF. Pouvez-vous svp me guider? Car je n'arrive pas à m'en sortir même si j'ai lu quelques discussions de forums à ce sujet, qui ne me paraissaient pas assez claires ou étaient trop compliquées par rapport à mon niveau débutant en Java.

    Voici le code de ma fonction de numérisation, qui retourne un objet de type MorenaImage correspondant à la numérisation faite.

    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
     
    /**
         * Fait et retourne la numérisation
         * @return MorenaImage, la numérisation qui vient d'être faite
         * @throws SK.gnome.morena.MorenaException
         */
        protected MorenaImage doScan() throws MorenaException
        {
            // sélection du scanner si pas encore fait
            if(this.source == null)
                this.doScannerPick();
     
            // interruption de la numérisation si sélection du scanner annulée
            if(this.source == null)
                return null;
     
            this.source.setVisible(false); // n'affiche pas la fenêtre de paramétrage d'impression
     
            if(this.colorMode > 0)
                this.source.setColorMode(); // numérisation couleur
            else
                this.source.setGrayScaleMode(); // numérisation noir et blanc
     
            this.currentScan = new MorenaImage(source); // numérisation
            // enregistrement si quelque chose a vraiment été numérisé
            if(this.currentScan.getWidth() > 0)
            {
                // insertion après la page affichée
                if(this.bookInsertAfterCurrent)
                {
                    this.book.add(this.bookIndex+1, this.currentScan); // sauvegarde de la numérisation après la page affichée
                    ++this.bookIndex; // positionnement sur la page numérisée
                }
                // insertion à la dernière page
                else
                {
                    this.bookIndex = this.bookNpages - 1; // positionnement sur la dernière page
                    this.book.add(currentScan); // sauvegarde de la numérisation dans le livre
                    ++this.bookIndex; // positionnement sur la dernière page du livre
                }
                ++this.bookNpages; // incrémentation du nombre de page du livre
            }
     
            return this.currentScan;
        }
    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    juin 2006
    Messages
    7 013
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 7 013
    Points : 9 696
    Points
    9 696
    Par défaut
    Tu es sûr que ton API permet la sauvegarde au format TIFF ?

    En tout cas, l'API standard Java ne permet pas cela, il est nécessaire de passer par une autre API (peut être que la tienne le fait, mais il faudrait voir la documentation) comme JAI. Du coup, il faudra convertir l'image en BufferedImage.
    Je ne répondrai à aucune question technique en privé

  3. #3
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Merci pour ta réponse Millie.

    Je ne suis pas sûr que Morena permet la sauvegarde en TIFF, je me rappelle avoir lu dans mes recherches des bouts de code avec BufferedImage dont tu me parles.

    Par contre j'ai vu que JAI, dont tu me parles également, permet de faire pleins d'opérations sur les images donc je vais essayer de m'en servir car il me faudra implémenter des fonctions telles que le zoom ou la rotation.

    Y-a t-il un tutoriel qui pourrait m'aider à vite me familiariser avec JAI?

    Merci.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    juin 2006
    Messages
    7 013
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 7 013
    Points : 9 696
    Points
    9 696
    Par défaut
    J'avais écrit un truc pour charger du TIFF, mais pas pour sauvegarder :

    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
    private static BufferedImage loadImage(File input) throws IOException {
    		BufferedImage inputImage = null;
     
    		if(input.getName().toLowerCase().endsWith(".tiff") || input.getName().toLowerCase().endsWith(".tif")) {
    			//on charge comme un tiff
    			SeekableStream s = new FileSeekableStream(input);
    	        ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, null);
    	        RenderedImage in = dec.decodeAsRenderedImage(0);
    	        System.err.println("Input image color : " + in.getColorModel());
    	      //suivant le nombre de composant, on choisie une image en niveau de gris ou en niveau de couleur
    	        if(in.getColorModel().getNumColorComponents() == 1)	        	
    	        	inputImage =  new BufferedImage(in.getWidth(), in.getHeight(), BufferedImage.TYPE_BYTE_GRAY); 
    	        else
    	        	inputImage =  new BufferedImage(in.getWidth(), in.getHeight(), BufferedImage.TYPE_INT_RGB);
    	        Graphics2D g = inputImage.createGraphics();
    			g.drawRenderedImage(in, AffineTransform.getTranslateInstance(0, 0));
    			g.dispose();
    		}
    		else {
    			//sinon on utilise la bibliothèque standard
    			inputImage = ImageIO.read(input);
    			if(inputImage==null)
    				throw new IOException("Image " + input + " cannot be read");
    		}
    		return inputImage;
    	}
    Je ne répondrai à aucune question technique en privé

  5. #5
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Ok, je vais essayer la semaine prochaine car je pars en congé pour le nouvel an. En tout cas merci beaucoup pour ton aide et tes réponses rapides.

    Bonnes fêtes de fin d'année à tous

  6. #6
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Bonjour, j'ai trouvé ce tutorial sur JAI https://jaistuff.dev.java.net/docs/jaitutorial.pdf mais je bloque déjà au 1er exemple et plus précisément sur l'import : import javax.media.jai.*; Dans netbeans l'import est souligné en rouge avec l'indication package javax.media.jai does not exists. Pourtant j'ai téléchargé JAI 1.3 (https://jai.dev.java.net/binary-buil...Release_builds) et j'ai importé jai_windows-i586.jar dans les libraires.

    Une idée ?

    Merci d'avance.

  7. #7
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Plus d'erreur, j'ai installé les .exe au lieu du .zip car apparament il me manquait un .jar

  8. #8
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    J'ai rajouté à mon programme une fonction pour convertir les image numérisées du format ArrayList<MorenaImage> au format Image[]. Comment puis-je sauvegarder les numérisations Image[] avec JAI svp? Merci d'avance.

    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
     
    /**
         * Retourne un tableau de type Image contenant l'ensemble des numérisations
         * @param imageTab
         * @return imageTab, tableau contenant les numérisations au format Image
         */
        protected Image[] getScanImages(Image imageTab[])
        {
            imageTab = new Image[this.bookNpages];
            for(int n=0 ; n<this.bookNpages ; n++)
            {
                imageTab[n] = Toolkit.getDefaultToolkit().createImage(this.book.get(n));
            }
     
            return imageTab;
        }

  9. #9
    Nouveau membre du Club
    Inscrit en
    mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    J'ai pu avancer un peu après avoir utilisé BufferedImage pour obtenir des PlanarImage à partir des numérisation MorenaImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Image image = Toolkit.getDefaultToolkit().createImage(morenaImage);
            BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
            bufferedImage.createGraphics().drawImage(image, 0, 0, null);
            PlanarImage planarImage = PlanarImage.wrapRenderedImage(bufferedImage);
    J'ai testé en faisant quelques opérations basiques : inversion et rotation.

    Le résultat s'affiche et j'arrive à sauver dans un fichier avec JAI.create mais 2 problèmes:

    - Dans la console java j'ai cette erreur
    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
     
    Error: Could not find mediaLib accelerator wrapper classes. Continuing in pure Java mode.
    Occurs in: com.sun.media.jai.mlib.MediaLibAccessor
    java.lang.NoClassDefFoundError: com/sun/medialib/mlib/Image
    	at com.sun.media.jai.mlib.MediaLibAccessor$1.run(MediaLibAccessor.java:248)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at com.sun.media.jai.mlib.MediaLibAccessor.setUseMlib(MediaLibAccessor.java:245)
    	at com.sun.media.jai.mlib.MediaLibAccessor.useMlib(MediaLibAccessor.java:177)
    	at com.sun.media.jai.mlib.MediaLibAccessor.isMediaLibCompatible(MediaLibAccessor.java:357)
    	at com.sun.media.jai.mlib.MediaLibAccessor.isMediaLibCompatible(MediaLibAccessor.java:315)
    	at com.sun.media.jai.mlib.MlibInvertRIF.create(MlibInvertRIF.java:49)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at javax.media.jai.FactoryCache.invoke(FactoryCache.java:122)
    	at javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:1674)
    	at javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperationRegistry.java:473)
    	at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:332)
    	at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:819)
    	at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
    	at javax.media.jai.RenderedOp.getColorModel(RenderedOp.java:2242)
    	at javax.media.jai.PlanarImage.getAsBufferedImage(PlanarImage.java:2498)
    	at javax.media.jai.PlanarImage.getAsBufferedImage(PlanarImage.java:2546)
    	at ScanWizard.doViewControlInvert(ScanWizard.java:215)
    	at interscanJava.executeViewControlInvert(interscanJava.java:182)
    	at interscanJava.run(interscanJava.java:226)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: com.sun.medialib.mlib.Image
    	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    	... 24 more
    Caused by: java.io.IOException: open HTTP connection failed:http://192.168.16.108/marcyf/interscanJava/dev/debug/com/sun/medialib/mlib/Image.class
    	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
    	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
    	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	... 28 more
    J'ai donc rajouté le bout de code suivant, que j'ai vu en faisant des recherches sur le forum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static
    {
          System.setProperty("com.sun.media.jai.disableMediaLib", "true");
    }
    L'erreur n'apparaît plus dans la console java, mais avec ou sans ce code j'ai l'autre problème suivant.

    - Le résultat de la rotation (ou inversion) met plusieurs secondes avant de s'afficher.

    Quelqu'un comprend-il l'erreur que j'avais dans la console? C'est quoi mediaLib accelerator? Dois-je l'utiliser?
    Pourquoi le résultat met-il plusieurs secondes avant de s'afficher?

    Merci d'avance

  10. #10
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    juin 2006
    Messages
    7 013
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 7 013
    Points : 9 696
    Points
    9 696
    Par défaut
    Tu réponds sur un message qui a 9 ans... Je pense que cela ne va pas trop fonctionner.
    Je ne répondrai à aucune question technique en privé

Discussions similaires

  1. Problème avec script de sauvegarde
    Par lolo81100 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/01/2012, 22h00
  2. Problème avec logiciel de sauvegarde TapeWare et fichier Mac
    Par boleduch dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 18/04/2008, 09h10
  3. [SQL] Probleme avec script de sauvegarde de BDD
    Par killbrice dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/06/2007, 01h48
  4. Réponses: 2
    Dernier message: 07/04/2007, 12h29
  5. [GD] Image avec GD et sauvegarde
    Par pimpmyride dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/02/2007, 17h23

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