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

Graphisme Java Discussion :

Transformation pour limiter la taille d'une image


Sujet :

Graphisme Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    septembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2006
    Messages : 552
    Points : 184
    Points
    184
    Par défaut Transformation pour limiter la taille d'une image
    Bonjour,
    Je veux limiter la taille d'une image en kO. J'utilise
    net.coobird.thumbnailator.Thumbnails;
    Voici les 2 liens necessaires:
    http://thumbnailator.googlecode.com/...humbnails.html
    et
    https://thumbnailator.googlecode.com...s.Builder.html

    disons que j'ai une image de 879*675 en pixel de poids 159 kB et que je veux limiter la taille à 100kB
    Je calcule la largeur et hauteur pour obtenir mon résultat:
    newWidth= oldWidth * sqrt(100/159) = 697
    newHeight= oldHeight * sqrt(100/159) = 535

    Et je code en Java
    Thumbnails.of(targetStreamOriginalImageFile).size((int)(Math.sqrt(100*1.0/159)*879), (int)(Math.sqrt(100*1.0/159)*675)).useOriginalFormat().toFile(destinationImageFile);

    Bien que j'obtienne la largeur et hauteur voulu pour destinationImageFile, son poids n'est pas 100 kB, mais 139 kB.

    Avez vous une idée pour que j'obtienne un poids de 100 kB ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 794
    Points : 27 818
    Points
    27 818
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les fichiers images sont pour la plupart du temps compressés (JPEG, PNG, GIF...), avec des algorithmes qui font qu'il n'y a pas de rapport linéaire entre la taille de l'image et le poids du fichier.
    Si les fichiers ne sont pas compressé, il y aura souvent d'autres informations que les informations d'image (ne serait-ce qu'une entête), comme des métadonnées, par exemple : même si le poids de ces données peut être relativement négligeable par rapport au poids de l'image non compressée, cela peut être à prende en compte.

    Il se peut même qu'il n'y ait pas de rapport direct entre le poids du fichier et la taille de l'image : imagine un algorithme trivial qui stockerait une liste de couples (nombre de points,couleur), avec pour seulle entête la largeur et la hauteur (avec mettons toutes les info sur 4 octets). La couleur étant formée de 3 composantes (rouge, vert, bleu) plus éventuellement une composant d'alpha (pour la transparence), souvent dans des valeurs de 0 à 255, elle prend 4 octets. Une image de 100 x 100 points rouges, prendrais 4 + 4 (la largeur et la hauteur), + 4 (le nombre 100X100=10000), + 4 (pour stocker la couleur rouge) = 16 octets. Si on utilisait ta formule pour la réduire à 10 octets, la taille serait 100x100x10/16=6250, qui tient, forcément, toujours sur 4 octets : le poids de l'image serait donc toujours de 16 octets.

    Pour une image compressée, réaliser ce que tu cherches à faire, en une passe (pas forcément avec une simple formule), demanderais d'être capable de déterminer un algorithme de calcul entre le poids du fichier et le poids de l'image non compression, ce qui dépend du format d'image, mais aussi des paramètres de compression (le JPEG permet d'obtenir un taux de 3 à 100 (2 à 8 en JPEG-LS) selon le paramétrage), et qui n'est forcément simple (sans parler du fait que chaque algorithme a son propre algorithme, et donc bien les connaitre chacun). Sinon, on pourrait utiliser un algorithme multipasse, dichotomique, qui réduit plusieurs fois l'image, jusqu'à ce que la taille voulue soit obtenue, mais avec un temps d'exécution non prévisible (et probablement long). Par contre, pas la peine de créer des fichiers physiques, on peut compresser en mémoire, avec un ByteArrayOutputStream, avec toOutputStream() dans la bibliothèque que tu utilises.
    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.

Discussions similaires

  1. Expression pour limiter la largeur d'une image
    Par Fooshi dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 08/02/2011, 19h49
  2. limiter la taille d'une image
    Par cotojo12 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/07/2010, 16h12
  3. Utiliser l'api GDi+ pour réduire la taille d'une image
    Par deepshark dans le forum WinDev
    Réponses: 3
    Dernier message: 04/06/2010, 09h31
  4. Script VBS pour connaitre taille d'une image
    Par fredoh dans le forum Windows
    Réponses: 2
    Dernier message: 24/02/2006, 14h27
  5. [FLASH MX] taille d'une image
    Par matN59 dans le forum Flash
    Réponses: 2
    Dernier message: 10/06/2004, 10h51

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