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 :

Compresser image avant Sérialization


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut Compresser image avant Sérialization
    Bonjour,

    Juste une petite question : j'essaye de compresser une image avant de l'enregistrer. Le cas a déjà été traité plein de fois, mais j'ai un petit problème dans mon cas :

    On trouve facilement comment compresser une image pour l'enregistrer au format png ou jpg. On trouve rarement par contre comment compresser cette image avant de l'enregistrer par le procédé de Sérialization :

    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
    class Truc implements Serializable {
        String nom = "machin";
        transient Panel panel = new Panel();
        ImageIcon img = new ImageIcon(panel.capturerImage());
    }
     
    class Panel extends JPanel {
        ...
        public Image capturerImage() {
            BufferedImage buffer = new BufferedImage(this.getSize().width, this.getSize().height, BufferedImage.TYPE_3BYTE_BGR);//type choisit au hasard
            Graphics g = buffer.createGraphics(); //On crée un Graphic que l'on insère dans tamponSauvegarde
            this.paint(g);
            return buffer;
        }
    }
    Voilà en gros l'idée. Un panel qui capture l'image de ce qu'il affiche, et une classe qui contient l'image comme attribut et qui va être sérialisée.

    Le problème c'est qu'en l'état actuel, l'image générée est assez conséquente. Comme puis-je la réduire avant la sauvegarde ?

    J'ai envisagé plusieurs solutions :
    1) BufferedImage.TYPE_3BYTE_BGR : est-ce le mode le plus adapté ?
    2) Mon panel contient majoritairement du blanc. Je pourrais créer un liste des pixels non blancs ?
    3) Utiliser un algorithme de compression comme celui des images jpg, mais je sais pas faire... Existe-t-il quelque chose de tout fait ?

    Merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Le mieux serait d'enregistrer l'image sous forme de vrai PNG (pas JPEG pour éviter les pertes,) mais dans un byte[] au lieu d'un fichier. La sérialisation enregistrera donc ce byte[].

    Vu que pendant l'exécution un byte[] n'est pas très utile et qu'il vaut mieux un BufferedImage, il vaut mieux régler ce cas avec writeObject()/readObject().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Merci beaucoup pour ta réponse. Malheureusement j'ai pas tout compris...

    tu proposes que j'utilise un ByteArrayOutputStream dans le writer. Càd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    OutputStream out = new ByteArrayOutputStream();
    ImageIO.write(monImage, "png", out);
    byte[] Tbyte = out.toByteArray();
    J'enregistre ensuite le Tbyte comme attribut de ma classe Truc.

    J'ai bien compris ?

    Si c'est ça, est-ce que tu peux éclaircir ces points pour moi ? :
    - comment je récupère mon image à partir du Tbyte ?
    - que veux-tu dire par gérer ce cas avec writeObject/readObject ? A moins que tu ne parles de l'écriture du Tbyte par la sérialization normale.
    - est-ce qu'il y a moyen d'améliorer la compression ?

    Merci encore pour ta réponse

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    J'enregistre ensuite le Tbyte comme attribut de ma classe Truc.

    J'ai bien compris ?
    Non. Le Tbyte sera un paramètre local de la méthode writeObject(), et le but est de balancer ça dans le ObjectOutputStream, à la place de ton ImageIcon non compressé.

    Citation Envoyé par Sharcoux Voir le message
    Si c'est ça, est-ce que tu peux éclaircir ces points pour moi ? :
    - comment je récupère mon image à partir du Tbyte ?
    Même chose en sens inverse. ByteArrayInputStream. ImageIO.read().

    Citation Envoyé par Sharcoux Voir le message
    - que veux-tu dire par gérer ce cas avec writeObject/readObject ? A moins que tu ne parles de l'écriture du Tbyte par la sérialization normale.
    Justement pas avec une sérialisation normale par défaut. Ca n'a pas de sens de se coltiner à la fois l'image non compressée et le tableau de bytes de l'image compressée. Il faut utiliser une sérialisation customisée pour ne sérialiser que ta String et le tableau compressé. La sérialisation customisée se fait avec writeObject(ObjectOutputStream) et readObject(ObjectInputStream), comme indiqué dans la JavaDoc de Serializable. S'il te plaît, lis-la et essaie-la avant de poser des questions.

    Citation Envoyé par Sharcoux Voir le message
    - est-ce qu'il y a moyen d'améliorer la compression ?
    Mieux que PNG ? Ça va être difficile. Les autres formats sont à perte, pas l'idéal pour une sérialisation.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Ok. Pour les deux première questions, c'est ma faute, j'ai mal posé mes questions. On reprend avec juste une seule question qui résume le point qui reste flou pour moi :

    Quand tu dis
    Vu que pendant l'exécution un byte[] n'est pas très utile et qu'il vaut mieux un BufferedImage, il vaut mieux régler ce cas avec writeObject()/readObject().
    Est-ce que simplement écrire ma classe comme ceci (schématiquement) résoudrait le problème que tu soulève :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Truc implements Serializable {
        String nom = "machin";
        transient Panel panel = new Panel();
        transient ImageIcon img = new ImageIcon(panel.capturerImage());//cette fois l'image n'est pas enregistrée
        byte[] Tbyte = monTableauDeBit //récupéré comme décrit dans mon second post
    }
    Ou alors est-ce que je passe à côté de quelque chose ?

    Quant à la dernière, je voulais savoir s'il y avait moyen de profiter du fait que je sais qu'une grande partie de l'image sera blanche pour améliorer encore la compression, mais peut-être que l'algorithme du png fera déjà le travail.

    En tout cas, merci pour tes réponses, merci pour ton temps, et désolé d'avoir posé mes questions un peu vite...

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Ou alors est-ce que je passe à côté de quelque chose ?
    Tu passes à côté de quelque chose. Ce quelque chose s'appelle readObject(ObjectInputStream)/writeObject(ObjectOutputStream) que je t'ai demandé, trois fois, de lire dans la JavaDoc de Serializable. Relis, et ne reviens pas sans quelque chose qui implique readObject(ObjectInputStream)/writeObject(ObjectOutputStream)

    Citation Envoyé par Sharcoux Voir le message
    Quant à la dernière, je voulais savoir s'il y avait moyen de profiter du fait que je sais qu'une grande partie de l'image sera blanche pour améliorer encore la compression, mais peut-être que l'algorithme du png fera déjà le travail.
    C'est en principe le boulot de PNG, oui.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [JavaScript] [FileApi] Compresser une image AVANT d'uploader
    Par O-Zone dans le forum Contribuez
    Réponses: 0
    Dernier message: 15/01/2010, 12h47
  2. Interface JMAGICK ? Qui connait ? (compression image)
    Par ionix dans le forum Multimédia
    Réponses: 5
    Dernier message: 04/05/2006, 16h14
  3. [ImageMagick] Redimensionner une image avant de l'enregistrer
    Par julien.63 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/05/2006, 21h01
  4. swing afficher une image avant la fenetre
    Par gripin dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 25/04/2006, 23h21
  5. Preview d'une image avant upload
    Par nabbo dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 21/12/2005, 01h02

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