2011-01-11 19 views
8

Có thể ai đó vui lòng giải thích hoặc hiển thị một số mã mẫu về cách tôi có thể sử dụng để có hình thu nhỏ được đưa vào UIImageView sau khi người dùng chọn ảnh có UIImagePickerController không?Làm cách nào để có hình thu nhỏ hoặc đường dẫn có thể tìm kiếm được từ UIImagePickerController để sử dụng cho UIImageView?

Giả sử tôi muốn đặt hình thu nhỏ làm hình ảnh của ô xem bảng. Khi người dùng nhấn vào ô, bộ chọn hình ảnh sẽ được hiển thị và người dùng chọn một hình ảnh đã có trên thiết bị của họ. Tôi cũng muốn lưu đường dẫn đến hình thu nhỏ đó để lần xem tiếp theo được hiển thị, hình thu nhỏ thích hợp có thể được hiển thị.

Tôi có thể hiển thị bộ chọn hình ảnh và đại biểu của tôi có được hình ảnh được chọn chính xác, nhưng tôi muốn đường dẫn đến hình thu nhỏ và tôi muốn tải hình thu nhỏ bằng đường dẫn đó (tức là tôi muốn lưu đường dẫn). Tôi đã tìm kiếm giờ hôm nay và không tìm ra điều này. Có lẽ tôi không hiểu ALAsset, hoặc có thể nó là cái gì khác, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào đang giúp tôi. Tôi chưa bao giờ sử dụng bộ chọn hình ảnh hoặc ALAsset trước đây, vì vậy tôi hoàn toàn mới ở đây.

Trả lời

15

// Nếu bạn đang đọc và xem các nhận xét bên dưới và suy nghĩ? WTF ?? đó là vì tôi đang chỉnh sửa Trả lời ban đầu của mình thay vì đăng hai câu trả lời với hy vọng mọi thứ sẽ sạch hơn. Điều quan trọng là phải biết rằng ALAssetsLibrary là một điều iOS 4.x.

Mã bên dưới sẽ hoạt động để lấy URL của thư viện nội dung và sau đó tạo UII ra khỏi đại diện hình thu nhỏ. Mặc dù tôi sử dụng trực tiếp url thư viện nội dung nhưng không có lý do gì mà mã tương tự này không thể bắt đầu bằng cách chuyển đổi biểu diễn chuỗi thành NSURL để thỏa mãn việc gán imageURL. Disclaimer: mã này có thể bị rò rỉ hoặc một cái gì đó tồi tệ hơn, nhưng nó trả lời câu hỏi của poster ban đầu và hy vọng giá trị.

Mã dưới đây vay nặng nề trên t his Stack Overflow question bao gồm về cơ bản cùng chủ đề này. Ngoài các mã ở đây, tôi đã bao gồm AssetsLibrary.framework và ALAssetsLibrary typedefs được tham chiếu trong câu hỏi khác.

Toàn bộ mẹo là bạn không thể tham chiếu NSURL trực tiếp từ thư viện tài sản. Tôi nghĩ rằng (mặc dù tôi không biết) rằng nó bằng cách nào đó tham khảo một kho dữ liệu thay vì một tập tin để dữ liệu trả về từ URL không phải là NSData thẳng vì vậy bạn không thể sử dụng nó theo cách cũ.

Có UIImageView trong mã được gọi là photo. Hy vọng rằng tất cả mọi thứ khác là dễ dàng để tìm ra.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
    NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL]; 
    NSLog(@"%@",imageURL); 
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
    { 
     CGImageRef iref = [myasset thumbnail]; 
     if (iref) { 
      UIImage *theThumbnail = [UIImage imageWithCGImage:iref]; 
      [[self photo] setImage:theThumbnail]; 

     } 
    }; 


    ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) 
    { 
     NSLog(@"booya, cant get image - %@",[myerror localizedDescription]); 
    }; 

    if(imageURL) 
    { 
     ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
     [assetslibrary assetForURL:imageURL 
         resultBlock:resultblock 
         failureBlock:failureblock]; 
    } 

    [self dismissModalViewControllerAnimated:YES]; 
} 

Nếu bạn không muốn hình thu nhỏ nhưng làm muốn ảnh đầy đủ, bạn sẽ chỉ cần thay đổi mã trong khối AssetForURLResult một cái gì đó như thế này:

 ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 

Chúng ta có thể rời khỏi exercize rằng cho người dùng.

Chúc may mắn, hy vọng điều này sẽ giúp mọi thứ rõ ràng cho bạn.

+0

Nếu người dùng xóa hình ảnh khỏi cuộn camera, sẽ không có vấn đề gì, ảnh trong chế độ xem của tôi sẽ chỉ để trống. Hình ảnh không cần thiết cho phần còn lại của chế độ xem. – viperacr99

+0

Hình ảnh không cần thiết cho phần còn lại của chế độ xem. Tôi đang nhắm mục tiêu IOS 4.0 trở lên. Để làm cho nó dễ dàng, hãy nói rằng tôi muốn đặt hình ảnh kích thước đầy đủ vào một UIImageView. Làm thế nào tôi có thể làm điều đó nếu tôi chỉ có đối tượng NSURL từ từ điển thông tin? Những điều tôi đã cố gắng cho đến nay đã không làm việc, tôi cho rằng tôi đang thiếu một cái gì đó hiển nhiên. – viperacr99

+0

Đối tượng NSURL sẽ trỏ đến hình ảnh và sau đó bạn có thể tải xuống. Vì bạn đang nhắm mục tiêu IOS 4.0, bạn có tùy chọn truy cập Thư viện nội dung. Có một hướng dẫn tại blog iCode (http://icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/) nhưng có lẽ bạn đã thấy nó? Khi bạn có tài sản trong tay, bạn có thể sử dụng phương thức valueForPropery và lấy ALAssetPropertyURLs là một từ điển chứa URL của tệp. – Walter

0

Bạn có thể lưu hình ảnh bạn chọn từ imagePicker vào Thư mục tài liệu được instaed tham chiếu nó từ bộ chọn Đây là mã bạn có thể sử dụng để lưu hình ảnh.Thực hiện phương pháp này trong phương thức callback được gọi khi người dùng chọn một bức ảnh từ bộ chọn

NSFileManager fileManager = [NSFileManager defaultManager]; 

    NSArray* output_PDF_paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 

    NSString* output_PDF_documentsDirectory = [output_PDF_paths objectAtIndex:0]; 
    NSString* output_PDF_ABSOLUTE_PATH = [output_PDF_documentsDirectory stringByAppendingPathComponent:@"ImageName.png"]; 

    BOOL success_new = [UIImagePNGRepresentation(ProfilePhotoselected) writeToFile:previewPagePath atomically:YES]; 

// Ở đây, "ProfilePhotoselected" là hình ảnh mà bạn nhận được từ bộ chọn như một đối số trong phương pháp callabck bạn

+0

Đây là một cách để làm điều đó, nhưng vấn đề là tôi cũng sẽ phải thực hiện mã có thể xóa hình ảnh từ thư mục tài liệu mà không còn được sử dụng, chưa kể nó sẽ chỉ đòi hỏi nhiều không gian hơn. Lý tưởng nhất, tôi muốn hình ảnh chỉ được lưu trữ trong cuộn camera và nếu người dùng xóa hình ảnh từ đó, không có vấn đề gì lớn, mã của tôi sẽ không hiển thị hình ảnh. – viperacr99

2

Tôi đã có nó chủ yếu là tìm ra ngay bây giờ. Khó khăn mà tôi có là hiểu Blocks, chủ yếu là cú pháp của Blocks khiến họ khó hiểu chúng là gì và cách chúng hoạt động.

Trong các đại biểu cho UIImagePickerController, khi người dùng đã lựa chọn một hình ảnh, bạn có thể lấy đường dẫn đến hình ảnh trong thư viện tài sản sử dụng:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL]; 

Với đối tượng đó, bạn có thể nhận được kích thước đầy đủ hình ảnh hoặc hình ảnh thu nhỏ bằng cách sử dụng đoạn mã sau:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
{ 
    ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 
    if (iref) { 
     // Gets the full size image 
     self.fullSizeImage = [UIImage imageWithCGImage:iref]; 
    } 

    // Gets the thumbnail 
    self.thumbnail = [UIImage imageWithCGImage:[myasset thumbnail]]; 
}; 

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) 
{ 
    NSLog(@"in failureblock, got an error: %@",[myerror localizedDescription]); 
}; 

ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init]; 
[assetsLib assetForURL:urlForImage resultBlock:resultblock failureBlock:failureblock]; 

trang này thực sự giúp tôi hiểu Blocks: Blocks in iOS 4
Xem thêm display image from URL retrieved from ALAsset in iPhone

1

Tiết kiệm URL có thể có vấn đề:

  1. ít nhất trong iOS 4.x, các URL không đảm bảo là duy nhất. Chúng có thể được tái sử dụng nếu người dùng xóa/thêm ảnh, điều này rõ ràng là phổ biến. Vì vậy, URL bạn lưu giữ có thể trỏ đến một hình ảnh khác trong tương lai!
  2. Khi người dùng cập nhật lên iOS 5, các URL không còn giá trị. UGH !!! Apple đã viết lại Thư viện ảnh, không có khả năng tương thích ngược.
Các vấn đề liên quan