2012-01-12 19 views
15

Hiện tại tôi có một ứng dụng sử dụng ALAsssetsLibrary để tìm nạp ảnh. Tôi đã đặt ảnh vào chế độ xem hình ảnh và tôi có thể tải lên máy chủ. Khi tôi thử nghiệm trên thiết bị thực sau khi chụp một số bức ảnh, tôi phát hiện ra những bức ảnh được cho là chụp trong Chân dung trở thành một phong cảnh.Định hướng không hoạt động chính xác với Ảnh trong ALAsset

Vì vậy, tôi gọi là chức năng khác nhau để có được những CGImage như thế này:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage] scale:1.0 orientation:(UIImageOrientation)[representation orientation]]; 

Đầu tiên thử, tôi đã sử dụng này:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage]] 

Tôi nghĩ một với quy mô và định hướng có thể cung cấp tôi định hướng đúng là bức ảnh đã được chụp. Nhưng nó không cho tôi giải pháp đúng.

Tôi có bỏ lỡ bất kỳ thứ gì cần thiết để tạo ra định hướng ảnh chính xác không?

+1

sự cố này xảy ra với ảnh được chụp từ thiết bị – Leena

Trả lời

44

Xử lý định hướng chính xác tùy thuộc vào phiên bản iOS bạn đang sử dụng. Trên iOS4 và iOS 5, hình thu nhỏ đã được xoay đúng cách, vì vậy bạn có thể khởi tạo UIImage mà không chỉ định bất kỳ tham số xoay nào. Tuy nhiên đối với fullScreenImage, hành vi này khác nhau đối với mỗi phiên bản iOS. Trên iOS 5, hình ảnh đã được xoay trên iOS 4 không.

Vì vậy, trên iOS4 bạn nên sử dụng:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
                scale:[defaultRep scale] orientation:(UIImageOrientation)[defaultRep orientation]]; 

On iOS5 đoạn mã sau nên làm việc một cách chính xác:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] scale:[defaultRep scale] orientation:0]; 

Chúc mừng,

Hendrik

+0

Trong trường hợp của tôi, tôi cần fullResolutionImage và đã thử nghiệm trên iOS 6 và 7. Hình ảnh không được tự động xoay nhưng mã ví dụ đầu tiên thực hiện thủ thuật! Cảm ơn người đàn ông! P.S. hãy cẩn thận nếu lưu hình ảnh vào tệp với siêu dữ liệu. Nếu bạn đã xoay hình ảnh thì bạn phải đặt định hướng EXIF ​​thành 0 để tránh các jpeg được xoay lạ;) – Primoz990

+0

Tôi phải sửa lời nhận xét của mình. Ví dụ mã đầu tiên không xoay hình ảnh fullResolution của tôi, tôi phải xoay nó bằng chính bản thân mình. Nhưng đồng ý rằng fullScreenImage được tự động xoay trên iOS 6 và 7. – Primoz990

+0

Tuyệt vời! Nó cũng hoạt động với iOS 7! Cảm ơn rất nhiều ! – Vinestro

4

Hãy thử mã này: -

UIImage* img = [UIImage imageWithCGImage:asset.thumbnail]; 
img = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation:UIImageOrientationUp]; 

Điều này có thể giúp bạn.

+0

Tôi không thể thử ngay bây giờ vì tôi không sở hữu thiết bị. Bạn có nhớ giải thích cho tôi hai dòng mã đó không? Hàm img trên dòng đầu tiên là hình thu nhỏ của nội dung chứ không phải hình ảnh thực. – LittleFunny

+0

tôi đã sử dụng hình thu nhỏ của hình ảnh và tôi đã giữ hướng của hình ảnh trở lên để nó sẽ không được xoay nó hoạt động trong trường hợp của tôi. – Leena

+0

Có lẽ tôi có một vấn đề khác ... Nhưng cảm ơn bạn đã giúp đỡ – LittleFunny

3

Kinh nghiệm của tôi là giới hạn IOS 5.x nhưng tôi có thể cho bạn biết rằng hình thu nhỏ và hình ảnh toàn màn hình được định hướng chuyên nghiệp perly. Đó là fullresolutionimage đó là ngang khi bắn theo chiều dọc. Giải pháp của tôi là sử dụng một loại trên UIImage mà tôi nhận được từ đây:

http://www.catamount.com/forums/viewtopic.php?f=21&t=967&start=0

Nó cung cấp một phương pháp quay đẹp trên UIImage như thế này:

 UIImage *tmp = [UIImage imageWithCGImage:startingFullResolutionImage]; 
     startingFullResolutionImage = [[tmp imageRotatedByDegrees:-90.0f] CGImage]; 
+0

Tôi chỉ sử dụng fullresolutionimage và nó làm việc cho tôi. Cảm ơn. – Ali

0

Đối fullResolutionImage, tôi muốn để cung cấp giải pháp như sau,

ALAssetRepresentation *rep = [asset defaultRepresentation]; 

// First, write orientation to UIImage, i.e., EXIF message. 
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:rep.scale orientation:(UIImageOrientation)rep.orientation]; 
// Second, fix orientation, and drop out EXIF 
if (image.imageOrientation != UIImageOrientationUp) { 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
    [image drawInRect:(CGRect){0, 0, image.size}]; 
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    image = normalizedImage; 
} 
// Third, compression 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

imageData là thứ bạn muốn và chỉ tải lên máy chủ ảnh của bạn.

Nhân tiện, nếu bạn nghĩ EXIF ​​hữu ích, bạn có thể bổ sung nó cho normalizedImage như bạn muốn.

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