2009-04-01 9 views
19

Existe-t-il une bibliothèque Java pour faire pivoter les fichiers JPEG par incréments de 90 degrés, sans dégradation de l'image?JPEG sans perte Rotation (90/180/270 degrés) en Java?

+0

pas en Java, mais http://jpegclub.org/jpegtran/ devrait être le meilleur utilitaire de ligne de commande pour la rotation sans perte jpeg (Windows/Linux) – Henry

+0

Bonjour si vous avez utilisé la solution ci-dessous, je voudrais demander votre aide si vous pouvez. J'ai des difficultés à trouver où importer java.awt.Rectangle; J'ai essayé quelques pots dans le web mais je ne peux pas les utiliser avec Android Studio. Pouvez-vous m'aider avec le pot que vous avez importé. Merci –

Répondre

-3

Vous n'avez pas besoin d'une bibliothèque externe pour ce genre de chose, il est tout construit en SE. La plus simple étant la fonction rotate() de l'objet Graphics2D.

Par exemple:

Image rotatedImage = new BufferedImage(imageToRotate.getHeight(null), imageToRotate.getWidth(null), BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics(); 
    g2d.rotate(Math.toRadians(90.0)); 
    g2d.drawImage(imageToRotate, 0, -rotatedImage.getWidth(null), null); 
    g2d.dispose(); 

aucune perte! Ou, si vous voulez faire très attention, utilisez simplement BufferedImage.getRGB (x, y) et traduisez-le pixel par pixel sur la nouvelle image.

+6

Ce ne serait pas lossles, comme vous auriez à décoder et à re encoder l'image, ce qui entraînera une perte de données. Les images JPEG peuvent être pivotées sans perte par pas de 90 degrés lorsqu'elles sont effectuées correctement. –

+0

C'est bien pour PNG/GIF, je suppose, mais pas sans perte de JPEG malheureusement. – Henry

+0

Je ne comprends pas pourquoi vous diriez que ce n'est pas sans perte? Surtout si vous faites cette opération pixel par pixel? –

6

Miser sur la réponse de Henry, voici un exemple de la façon d'utiliser MediaUtil pour effectuer la rotation JPEG sans perte en fonction des données EXIF:

try { 
    // Read image EXIF data 
    LLJTran llj = new LLJTran(imageFile); 
    llj.read(LLJTran.READ_INFO, true); 
    AbstractImageInfo<?> imageInfo = llj.getImageInfo(); 
    if (!(imageInfo instanceof Exif)) 
     throw new Exception("Image has no EXIF data"); 

    // Determine the orientation 
    Exif exif = (Exif) imageInfo; 
    int orientation = 1; 
    Entry orientationTag = exif.getTagValue(Exif.ORIENTATION, true); 
    if (orientationTag != null) 
     orientation = (Integer) orientationTag.getValue(0); 

    // Determine required transform operation 
    int operation = 0; 
    if (orientation > 0 
      && orientation < Exif.opToCorrectOrientation.length) 
     operation = Exif.opToCorrectOrientation[orientation]; 
    if (operation == 0) 
     throw new Exception("Image orientation is already correct"); 

    OutputStream output = null; 
    try { 
     // Transform image 
     llj.read(LLJTran.READ_ALL, true); 
     llj.transform(operation, LLJTran.OPT_DEFAULTS 
       | LLJTran.OPT_XFORM_ORIENTATION); 

     // Overwrite original file 
     output = new BufferedOutputStream(new FileOutputStream(imageFile)); 
     llj.save(output, LLJTran.OPT_WRITE_ALL); 

    } finally { 
     IOUtils.closeQuietly(output); 
     llj.freeMemory(); 
    } 

} catch (Exception e) { 
    // Unable to rotate image based on EXIF data 
    ... 
} 
+0

J'ai effectué un test avec la récupération de la balise de rotation EXIF ​​avec Sanselan et MediaUtil, mais l'approche MediaUtil ci-dessus échoue pour moi au llj.getImageInfo(); step (ne trouvant aucune métadonnée EXIF), où l'approche Sanselan trouve les métadonnées EXIF. Il semble que LLJtran ne supporte pas la lecture de tous les fichiers JPEG modernes. – JeroenHoek

+0

Je ne suis pas en mesure d'afficher l'image enregistrée dans ma galerie..tried exactement le même code .. – therealprashant

+0

J'ai des difficultés à trouver où importer java.awt.Rectangle; J'ai essayé quelques pots dans le web mais je ne peux pas les utiliser avec Android Studio. Pouvez-vous m'aider avec le pot que vous avez importé. Remerciements –

6

En ce qui concerne la question des données EXIF ​​pas nécessairement être manipulé correctement, car les données EXIF est dénué de pertinence dans de nombreuses situations, voici un exemple de code montrant que la fonction de rotation JPEG sans perte LLJTran (remerciements à user113215):

final File    SrcJPEG = new File("my-input.jpg"); 
final File    DestJPEG = new File("my-output.jpg"); 
final FileInputStream In  = new FileInputStream(SrcJPEG); 

try { 
    final LLJTran   LLJT = new LLJTran(In); 

    LLJT.read(LLJTran.READ_ALL, true); 
    LLJT.transform(LLJTran.ROT_90); 

    final FileOutputStream Out = new FileOutputStream(DestJPEG); 

    try { 
     LLJT.save(Out, LLJTran.OPT_WRITE_ALL); 
    } finally { 
     Out.close(); 
    } 

} finally { 
    In.close(); 
} 

Si vous faites l'entrée et de sortie File objets REFE r dans le même fichier, vous pouvez l'exécuter encore et encore, et observer que l'image ne se dégrade pas, quel que soit le nombre d'itérations.

+0

Je ne suis pas en mesure de sauvegarder l'image et de le voir dans la galerie en utilisant cette méthode ... S'il vous plaît aider – therealprashant

Questions connexes