2012-06-13 17 views
34

Theo tài liệu, setRotation(90) nên xoay hình ảnh chụp JPEG (takePicture trong chế độ phong cảnh.setRotation (90) để chụp hình ở chế độ dọc không hoạt động trên các thiết bị samsung

này hoạt động tốt trên điện thoại HTC, nhưng không hoạt động trên Samsung Google Nexus S và Samsung Galaxy S3.Đây có phải là lỗi không?

Tôi biết rằng tôi có thể sử dụng phép biến đổi ma trận, nhưng muốn hệ điều hành có thể thực hiện điều này hiệu quả hơn và không muốn rủi ro quay quá nhiều trên một số thiết bị khác.

chỉnh sửa

Đặt camera.setDisplayOrientation(90); làm cho chế độ xem trước ở chế độ dọc, tuy nhiên nó không ảnh hưởng đến ảnh chụp.

Hơn nữa, bên cạnh setRotation, tôi cũng đã cố gắng đặt kích thước hình ảnh - nơi tôi lật h với w: parameters.setPictureSize(1200, 1600);. Điều này cũng không có bất kỳ ảnh hưởng nào.

giải pháp

Rõ ràng điện thoại Samsung thiết lập các thẻ định hướng EXIF, chứ không phải là quay pixel riêng lẻ. Theo đề xuất ariefbayu, việc đọc Bitmap bằng cách sử dụng BitmapFactory không hỗ trợ thẻ này. Mẫu mã của ông là giải pháp, và giải pháp này cũng tương thích với việc sử dụng inSampleSize.

+0

bạn có gặp phải bất kỳ lỗi nào không? – kosa

+0

Xem câu trả lời này vì nó có thể hữu ích: http://stackoverflow.com/questions/3841122/android-camera-preview-is-sideways/5110406 ​​ –

+0

@thinksteep: không - tôi không thấy bất kỳ lỗi nào thông qua bảng điều khiển Android . – tofi9

Trả lời

33

Tôi cố gắng trả lời câu hỏi này liên quan đến thẻ Exif. Đây là những gì tôi đã làm:

Bitmap realImage = BitmapFactory.decodeStream(stream); 

ExifInterface exif=new ExifInterface(getRealPathFromURI(imagePath)); 

Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION)); 
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){ 

    realImage=ImageUtil.rotate(realImage, 90); 
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){ 
    realImage=ImageUtil.rotate(realImage, 270); 
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){ 
    realImage=ImageUtil.rotate(realImage, 180); 
} 

Các ImageUtil.rotate():

public static Bitmap rotate(Bitmap bitmap, int degree) { 
    int w = bitmap.getWidth(); 
    int h = bitmap.getHeight(); 

    Matrix mtx = new Matrix(); 
    mtx.postRotate(degree); 

    return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true); 
} 
+0

Chỉ cần thực hiện một số thử nghiệm khác. Hóa ra rằng phần cứng Samsung không xoay các pixel, và chỉ đặt thẻ định hướng exif thành số 6. Tôi sẽ sử dụng tiện ích của bạn khi đọc bitmap. Điều tốt về giải pháp này là tôi vẫn có thể tiếp tục sử dụng thuộc tính inSampleSize để tải chỉ một phiên bản hình thu nhỏ và để ngăn chặn OutOfMemoryExceptions – tofi9

+0

hi, tôi gặp vấn đề tương tự, tôi đang cố gắng thực hiện câu trả lời nhưng tôi không t hiểu mã này ở đâu. Luồng biến là gì? Không có gì tương tự trong mã của tôi! – lisovaccaro

+0

Xin chào, nó hoạt động tốt cho tôi, có cách nào khác thay vì tạo bitmap mới (Bitmap.createBitmap (bitmap, 0, 0, w, h, mtx, true);), nó có thể kích hoạt OutOfMemoryException. –

3

Liso22, dòng biến không tạo sự khác biệt, chỉ cần cắm vào bitmap của bạn, tuy nhiên bạn đã nhận nó (decodeFile vv). Và nếu bạn gặp sự cố với 'ImageUtil.rotate(), chỉ cần viết' bitmap tĩnh công cộng xoay() 'làm phương thức có cùng tham số và làm cho' hình ảnh thực 'bằng nhau. Dù sao, giải pháp này dường như không được làm việc cho tôi, các thẻ exif trả về 1 (bình thường) cho dù trong bức chân dung hoặc phong cảnh.

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