2012-06-29 15 views
6

Tôi đã có một UIImagePickerController cho phép người dùng chọn một hình ảnh từ thư viện hình ảnh và đang nhận kết quả của mình thông qua phương thức didFinishPickingMediaWithInfo.Sử dụng UIImagePickerController để tải hình ảnh - cách biết có lưu PNG hoặc JPEG không?

Tôi cần lưu hình ảnh kết quả vào đĩa (trong thư mục tài liệu của ứng dụng) và tải lại sau.

Vấn đề là tôi không thể biết lưu trữ dưới dạng PNG hay JPEG. Tôi không thể luôn luôn lưu trữ nó như là một PNG, bởi vì đối với hình ảnh lớn hơn nó chậm chạp rất chậm (chưa kể đến sau đó tôi phải đối phó với việc lưu trữ định hướng hình ảnh riêng biệt). Tôi không thể luôn lưu trữ nó dưới dạng JPEG, vì trong một số trường hợp, hình ảnh có độ trong suốt, điều này sẽ bị mất nếu tôi làm như vậy.

Tôi đã kiểm tra khóa UIImagePickerControllerMediaType trong từ điển thông tin được bộ chọn hình ảnh trả về và bất kể tôi đã chọn PNG hay JPEG, cái nào được trả lại là "image.public".

Vì vậy, ...

Có cách nào để biết liệu người dùng đã chọn PNG không? Có lẽ một số phương pháp chỉ kiểm tra xem hình ảnh có minh bạch hay gì đó không?

Cảm ơn.

Trả lời

2

trong từ điển các UIImagePickerControllerReferenceURL chính sẽ cung cấp cho bạn thông tin về loại

(gdb) po thông tin

{ 
    UIImagePickerControllerMediaType = "public.image"; 
    UIImagePickerControllerOriginalImage = "<UIImage: 0x5cfd00>"; 
    UIImagePickerControllerReferenceURL = "assets-library://asset/asset.JPG?id=EFC44C3C-9C82-4669-924B-A2B9DE6F1F45&ext=JPG"; 
} 

Trong trường hợp này nó là một jpg như thể hiện bởi ext = JPG

+0

tôi đã kết thúc với giải pháp tôi đã nêu chi tiết ở trên, tuy nhiên đây là thông tin tuyệt vời và sẽ khiến nhiệm vụ của tôi trở nên đơn giản hơn một chút. Cảm ơn! – DanM

6

OK, vì vậy tôi đã tìm ra. Điều này có thể không hoạt động đối với mọi trường hợp, nhưng nó đủ cho tôi:

CGImageAlphaInfo imgAlpha = CGImageGetAlphaInfo(theImage.CGImage); 

    // Is this an image with transparency (i.e. do we need to save as PNG?) 
    if ((imgAlpha == kCGImageAlphaNone) || (imgAlpha == kCGImageAlphaNoneSkipFirst) || (imgAlpha == kCGImageAlphaNoneSkipLast)) { 
     // save as a JPEG 
    } else { 
     // save as a PNG 
    } 

... tất nhiên bạn cần nhớ loại hình ảnh bạn đã lưu, cung cấp cho tiện ích mở rộng tệp thích hợp và tải lại hình ảnh phù hợp trong ... nhưng về cơ bản điều này sẽ giải quyết nó. Hình ảnh có độ trong suốt sẽ được lưu dưới dạng PNG, mọi thứ khác dưới dạng JPEG.

Nếu có bất kỳ phương pháp nào tốt hơn, tôi rất muốn nghe chúng. Cảm ơn!