2012-02-02 72 views
1

在我的應用程序中,用戶可以拍攝圖片或從圖庫中選擇一個,然後以小圖像視圖顯示。我需要將生成的圖像url保存到數據庫中,然後使用該URL將圖像發送到服務器(只有當沒有可用的Internet連接時才這樣做)。這一切工作我有這樣的代碼:iphone圖像選擇器結果網址

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
UIImage *image=[info objectForKey:@"UIImagePickerControllerOriginalImage"]; 

NSURL *url=[info objectForKey:@"UIImagePickerControllerReferenceURL"]; 
NSLog(@"%@",url); 

//(.....) 
} 

當我保存的網址數據庫中,我只是把它當作好像它是一個字符串參數和它的作品,我已經在數據庫中查找的URL是有形式:

資產庫://asset/asset.JPG ID = 5A900026-5994-4F93-8A49-D2C96BDA2659 & EXT = JPG

我的問題是,當我嘗試使用這個網址既可以得到圖像或獲取數據,它會給我錯誤或空對象:

NSData *dataForFile =[[NSData alloc] initWithContentsOfURL:[url path]]; 
UIImage *img=[[UIImage alloc] initWithContentsOfFile:[url path]]; 

URL路徑= asset.JPG /怪....

我也試過這樣:

NSData *dataForFile =[[NSData alloc] initWithContentsOfURL:url]; 
UIImage *img=[[UIImage alloc] initWithContentsOfFile:url]; 

,但它也不起作用。我只需要其中一個數據對象或一個圖像(從圖像我可以獲取數據),我怎麼能這樣做?非常感謝

回答

2

我相信你需要使用assetForURL:resultBlock:failureBlock:。我沒有測試過,但我確定這是你需要的,因爲那是一個資產URL(你需要鏈接ALAssetsFramework到項目目標)。

然後,您可以從ALAsset獲取圖像數據。

編輯:這應該得到從給定的URL中的全分辨率圖像(如果該URL仍然有效):

__block UIImage *image=nil; 
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){ 
    ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    image = [UIImage imageWithCGImage:[rep fullResolutionImage]]; 
}; 
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
    NSLog(@"Cannot get image - %@",[myerror localizedDescription]); 
    // 
}; 
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock]; 
NSLog(@"%@", image); 

我在一些項目中使用幾乎相同的代碼,但我避風港」 t測試了這一個。

編輯2:今天進行了幾項測試。看起來這些塊是異步運行的,這意味着在調用[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock];後圖像將不可用。相反,您可以使用resultblock中的圖像。還有沒有更多的理由宣佈image作爲block變量,因此代碼將變爲:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){ 
    ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]]; 
    #warning todo: use image here, or call a method and pass 'image' to it 
}; 
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ 
    NSLog(@"Cannot get image - %@",[myerror localizedDescription]); 
}; 
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
NSURL *url=[info objectForKey:UIImagePickerControllerReferenceURL]; 
[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock]; 
+0

THKS它看起來有點複雜。幸運的是我找到了一個教程:http://www.icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/ – vallllll 2012-02-02 15:11:56

+0

它不是很複雜,除了它使用塊。我更新了一些我認爲可以正常工作的代碼。 – 2012-02-02 15:24:30

+0

對我不起作用我把它放在 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {}方法和我使用從信息dic得到的url,但圖像保持空所以我想它在iphone 5中不起作用,或者我失去了一些東西 – vallllll 2012-02-02 16:33:05