2012-02-26 33 views
6

Dưới đây bạn sẽ thấy một hình ảnh của bánh ngọt đẹp gọi là "simit" từ Thổ Nhĩ Kỳ. Nó được lấy từ iPad 2, do đó nó là một JPEG với kích thước 720 * 960.Javax.imageio.ImageIO có bị hỏng không? Nó nhập khẩu một số hình ảnh như xoay

Picture from iPad 720x960

Vấn đề là, khi tôi sử dụng phương pháp javax.imageio.ImageIO.read, hình ảnh nó lạ nhập khẩu là một BufferedImage xoay sang trái và trở thành 960 * 720.

Tôi đã sao chép điều này trong Sun JVM 1.6.0_29 trên OS X và Sun JVM 1.6.0_26 trên Debian. Dưới đây là các mã:

public class Main { 
    public static void main(String[] args) throws Exception { 
     FileInputStream stream = new FileInputStream(new File("IMG_0159.JPG")); 
     BufferedImage img = ImageIO.read(stream); 
     System.out.println("width:" + img.getWidth() + " height:" 
       + img.getHeight()); 
    } 
} 

Nó ra width:960 height:720, và khi tôi tiết kiệm hình ảnh đầu ra này, nó có thể xoay sang trái như tôi đã nói trước đó. Nếu bạn muốn tái sản xuất này, mã tải về và hình ảnh từ here và chạy các lệnh sau để xây dựng và chạy:

javac Main.java && java Main 

LƯU Ý: Bạn có thể thấy JPG trong kho lưu trữ như đã xoay, tuy nhiên nó xuất hiện 720 * 960 trên OS X, iPad, iPhone và như bạn thấy ở trên, nó được tải lên chính xác đến imgur.com. Và nó cũng được mở chính xác trong Adobe Photoshop, được tải lên Facebook chính xác, v.v.

Điều gì có thể là vấn đề ở đây?

Trả lời

9

Ảnh có thể được chụp bằng iPad ở chế độ dọc và do đó có chứa thông tin định dạng EXIF, mà ImageIO bỏ qua, nhưng bạn có thể sử dụng các thư viện khác, như Apache Sanselan để xử lý chính xác.

Vì vậy, hình ảnh chính nó là 960x720, nhưng MacOS, ImgUR, Facebook v.v. chính xác lấy thông tin EXIF ​​vào tài khoản.

Và mô phỏng trông rất ngon :)

+0

Có thể bạn đã đúng. Tôi vừa xác nhận nó từ một số Exif Viewer http://regex.info/exif.cgi Tuy nhiên Apache Sanselan nói rõ rằng nó KHÔNG hỗ trợ JPEG. Xấu hổ về ImageIO, vẫn đang tìm kiếm một giải pháp. –

+0

Với Sanselan bạn có thể đọc thông tin định hướng EXIF, và sau đó xoay Bitmap bạn đã đọc với ImageIO .. Tất nhiên một giải pháp tích hợp sẽ tốt hơn, nhưng tôi thấy không có Java thuần túy ... Luôn có jMagick nếu JNI thư viện là OK –

+1

http://stackoverflow.com/questions/5905868/am-i-making-this-too-complicated-image-rotation –

Các vấn đề liên quan