2009-04-01 10 views
19

Có thư viện Java nào để xoay các tệp JPEG với số gia là 90 độ mà không làm giảm sự xuống cấp ảnh không?Xoay JPEG không bị mất (90/180/270 độ) trong Java?

+0

không có trong Java, nhưng http://jpegclub.org/jpegtran/ phải là tiện ích dòng lệnh tốt nhất để quay số không bị mất (Windows/Linux) – Henry

+0

Xin chào nếu bạn đã sử dụng giải pháp dưới đây tôi muốn yêu cầu trợ giúp của bạn nếu bạn có thể. Tôi gặp khó khăn khi tìm nơi nhập java.awt.Rectangle; Tôi đã thử một số lọ trong web nhưng tôi không thể sử dụng chúng với Android Studio. Bạn có thể giúp tôi với cái lọ mà bạn đã nhập khẩu không. Cảm ơn –

Trả lời

-3

Bạn không cần một thư viện bên ngoài để loại điều, đó là tất cả được xây dựng vào SE. Cách dễ nhất là hàm rotate() của đối tượng Graphics2D.

Ví dụ:

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

không mất!

Hoặc, nếu bạn muốn cẩn thận hơn, chỉ cần sử dụng BufferedImage.getRGB (x, y) và dịch pixel theo pixel sang hình ảnh mới.

+6

Điều đó sẽ không bị mất, vì bạn phải giải mã và tái mã hóa hình ảnh, điều này sẽ dẫn đến mất dữ liệu. Các ảnh JPEG có thể được xoay không bị mất trong các bước 90 độ, khi được thực hiện chính xác. –

+0

Điều này là tốt cho PNG/GIF tôi đoán, nhưng không thua lỗ với JPEG không may. – Henry

+0

Tôi không hiểu tại sao bạn sẽ nói điều này là không mất mát? Đặc biệt là nếu bạn đang thực hiện pixel này theo pixel? –

6

Xây dựng về câu trả lời của Henry, đây là một ví dụ về cách sử dụng MediaUtil để thực hiện luân chuyển JPEG lossless dựa trên các dữ liệu 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

Tôi đã chạy một thử nghiệm với lấy thẻ quay EXIF ​​với cả Sanselan và MediaUtil, nhưng phương pháp MediaUtil ở trên không thành công cho tôi tại llj.getImageInfo(); bước (không tìm thấy bất kỳ siêu dữ liệu EXIF ​​nào), nơi tiếp cận Sanselan không tìm thấy siêu dữ liệu EXIF. Có vẻ như LLJtran không hỗ trợ đọc tất cả các ảnh JPEG hiện đại. – JeroenHoek

+0

Tôi không thể xem hình ảnh đã lưu trong thư viện của mình..có cùng mã chính xác .. – therealprashant

+0

Tôi gặp khó khăn trong việc tìm nơi nhập java.awt.Rectangle; Tôi đã thử một số lọ trong web nhưng tôi không thể sử dụng chúng với Android Studio. Bạn có thể giúp tôi với cái lọ mà bạn đã nhập khẩu không. Cảm ơn –

6

Về vấn đề dữ liệu EXIF ​​không nhất thiết phải được xử lý một cách chính xác, vì dữ liệu EXIF là không thích hợp trong nhiều trường hợp, đây là mã ví dụ chứng minh chỉ có tính năng LLJTran lossless xoay JPEG (với nhờ 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(); 
} 

Nếu bạn thực hiện các đầu vào và đầu ra File đối tượng refe r vào cùng một tệp, bạn có thể chạy lặp đi lặp lại và quan sát thấy hình ảnh không bị suy giảm, cho dù có bao nhiêu lần lặp lại nó được đặt qua.

+0

Tôi không thể lưu hình ảnh và xem hình ảnh trong thư viện bằng phương pháp này ... Xin hãy giúp – therealprashant