2009-04-01 31 views
19

¿Hay una biblioteca Java para rotar archivos JPEG en incrementos de 90 grados, sin incurrir en la degradación de la imagen?Lossless JPEG ¿Girar (90/180/270 grados) en Java?

+0

no en Java, pero http://jpegclub.org/jpegtran/ debe ser la mejor utilidad de línea de comandos para la rotación sin pérdida JPEG (Windows/Linux) – Henry

+0

Hola si ha utilizado a continuación solución me gustaría solicitar su ayuda si usted puede. Tengo dificultades para encontrar dónde importar java.awt.Rectangle; He intentado algunas jarras en la web pero no puedo usarlas con Android Studio. ¿Puedes ayudarme con el frasco que has importado? Gracias –

Respuesta

-3

Usted no necesita una biblioteca externa para este tipo de cosas, es todo montado en SE. Lo más fácil es la función de rotación() del objeto Graphics2D.

Por ejemplo:

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(); 

sin pérdida!

O, si quiere tener mucho cuidado, simplemente use BufferedImage.getRGB (x, y), y traduzca pixel por pixel a la nueva imagen.

+6

Eso no sería desastroso, ya que tendría que decodificar y volver codificar la imagen, lo que dará como resultado la pérdida de datos. Los archivos JPEG pueden girar sin pérdida en pasos de 90 grados, cuando se realizan correctamente. –

+0

Esto está bien para PNG/GIF, supongo, pero no sin pérdida de JPEG por desgracia. – Henry

+0

No entiendo por qué diría que esto no es sin pérdidas? ¿Especialmente si está haciendo esta operación píxel por píxel? –

6

Sobre la base de la respuesta de Henry, aquí está un ejemplo de cómo utilizar MediaUtil para llevar a cabo la rotación JPEG sin pérdida basada en los datos 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

He realizado una prueba para recuperar la etiqueta de rotación EXIF ​​con Sanselan y MediaUtil, pero el enfoque anterior de MediaUtil me falla en llj.getImageInfo(); paso (sin encontrar ningún metadato EXIF), donde el enfoque de Sanselan encuentra los metadatos EXIF. Parece que LLJtran no es compatible con la lectura de todos los archivos JPEG modernos. – JeroenHoek

+0

No puedo ver la imagen guardada en mi galería ... intenté exactamente el mismo código ... – therealprashant

+0

Tengo dificultades para encontrar dónde importar java.awt.Rectangle; He intentado algunas jarras en la web pero no puedo usarlas con Android Studio. ¿Puedes ayudarme con el frasco que has importado? Gracias –

6

En cuanto a la cuestión de los datos EXIF ​​no necesariamente se maneja correctamente, ya que los datos EXIF es irrelevante en muchas situaciones, esto es código de ejemplo que demuestra solamente la función de rotación LLJTran sin pérdida JPEG (con gracias a 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 hace refe la entrada y salida de objetos File r al mismo archivo, puede ejecutar esto una y otra vez, y observar que la imagen no se degrada, no importa cuántas iteraciones se realice.

+0

No puedo guardar la imagen y verla en la galería con este método ... Por favor ayuda – therealprashant

Cuestiones relacionadas