2011-01-11 12 views
8

有人請解釋或顯示一些示例代碼,我可以如何使用UIImagePickerController用戶選擇一張照片後,將縮略圖放入UIImageView?如何從UIImagePickerController獲取用於UIImageView的縮略圖或可保存路徑?

比方說,我想設置一個縮略圖作爲表格視圖單元格的圖像。當用戶按下單元格時,將顯示圖像選擇器並且用戶選擇已經在其設備上的圖像。我還想保存縮略圖的路徑,以便下次顯示視圖時,可以顯示正確的縮略圖。

我能夠顯示一個圖像選擇器,我的代表正確地選擇了圖像,但我想要縮略圖的路徑,並且我想使用該路徑加載縮略圖(即我想保存路徑)。 我今天搜索了幾個小時,並沒有想通了。也許我不理解ALAsset,或者它可能是別的,但我找不到任何幫助我的例子。我之前從未使用圖像選擇器或ALAsset,因此我對此完全陌生。

回答

15

//如果你正在閱讀本文,請看下面的評論,並認爲?? WTF ??這是因爲我編輯我原來的答案,而不是發佈兩個答案,希望事情會更乾淨。瞭解ALAssetsLibrary是iOS 4.x的一點很重要。

下面的代碼將執行資產庫URL,然後將UIImage製作爲縮略圖表示形式。雖然我直接使用資產庫url,但沒有理由認爲,爲了滿足imageURL賦值,相同的代碼無法通過將字符串表示轉換爲NSURL開始。免責聲明:此代碼可能泄漏或更糟糕的,但它回答了原來的海報的問題,並希望有價值。

下面的代碼大量借鑑了t his Stack Overflow question,涵蓋了基本上相同的主題。除了這裏的代碼之外,我還包含了AssetsLibrary.framework和另一個問題中引用的ALAssetsLibrary typedefs。

整個技巧是你不能直接從資產庫中引用NSURL。我認爲(雖然我不知道)它是以某種方式引用數據存儲而不是文件,所以從URL返回的數據不是直的NSData,因此您不能以舊的方式使用它。

代碼中有一個名爲photo的UIImageView。希望其他一切都很容易理解。

- (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]; 
} 

如果你不想縮略圖,但又希望在整幅照片,你只是在AssetForURLResult塊中的代碼更改爲類似這樣:

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

我們可以留下exercize爲用戶。

祝你好運,希望這有助於爲你解決問題。

+0

如果用戶從相機膠捲中刪除圖像,這不會是一個問題,我的視圖中的圖片將只是留空。這張照片對其餘的觀點來說不是必要的。 – viperacr99 2011-01-12 14:34:58

+0

該圖片對其餘視圖來說不是必需的。我的目標是iOS 4.0及更高版本。爲了簡單起見,我們假設我想將全尺寸圖像放入UIImageView中。我如何才能做到這一點,如果我只有信息字典中的NSURL對象?到目前爲止我嘗試過的東西都沒有奏效,我想我錯過了一些明顯的東西。 – viperacr99 2011-01-12 14:42:21

0

您可以將您從imagePicker中選擇的圖像保存到從拾取器引用它的文檔目錄中 以下是可用於保存圖像的代碼。當用戶從選擇器中的照片

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]; 

//這裏的「ProfilePhotoselected」是你的選擇器作爲參數得到您的callabck方法圖像實現調用回調方法這個方法

2

我現在主要了解它。我遇到的困難是理解塊,主要是塊的語法使得很難理解它們是什麼以及它們是如何工作的。

在委託中的UIImagePickerController,當用戶選擇的圖像,你可以用得到的路徑,在資產庫中的圖片:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL]; 

與該對象,你可以得到全尺寸圖像或者使用下面的代碼縮略圖:

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]; 

此頁面確實幫助我理解塊:Blocks in iOS 4
參見display image from URL retrieved from ALAsset in iPhone

1

保存URL可能是有問題:

  1. 至少在IOS x,在網址不能保證是唯一的。如果用戶刪除/添加圖片,它們可以重複使用,這顯然很常見。所以,您保存的URL可以指向未來的不同圖片!
  2. 當用戶更新到iOS 5時,這些URL不再有效。啊!!!蘋果已經改寫了Photo Library,沒有向後兼容性。
相關問題