2011-07-25 75 views
102

我有一個UIImageView,允許用戶放置和保存圖像,直到它可以保存。問題是,我無法弄清楚如何實際保存並檢索放置在視圖中的圖像。從iOS上的UIView保存圖像到應用程序文檔文件夾

我已經取回,並放置在圖像中的UIImageView這樣的:

//Get Image 
- (void) getPicture:(id)sender { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = YES; 
    picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo { 
    myPic.image = image; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

它顯示在我的UIImageView就好選定的圖像,但我不知道如何保存它。我將所有其他視圖片段(主要是UITextfield)保存在Core Data中。我已經搜索並搜索過,並且嘗試了許多人建議的代碼,但是我沒有正確輸入代碼,或者這些建議與我設置代碼的方式無關。這可能是前者。我想使用相同的操作(保存按鈕)將圖像保存在UIImageView中,用於將文本保存到UITextField中。下面是我如何救了我的UITextField信息:

// Handle Save Button 
- (void)save { 

    // Get Info From UI 
    [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"]; 

就像我剛纔說的,我嘗試了好幾種方法來得到這個工作,但它不能得到一個把握。這是我一生中第一次想要對無生命的物體造成身體傷害,但我設法剋制自己。

我希望能夠將用戶放入應用程序的文檔文件夾中的UIImageView的圖像保存到應用程序的文檔文件夾中,然後能夠檢索它並將其放置在另一個UIImageView中以供用戶將該視圖壓入疊加。任何幫助是極大的讚賞!

回答

323

這一切都很好,男人。不要傷害你自己或他人。

您可能不希望將這些圖像存儲在覈心數據中,因爲如果數據集變得太大,可能會影響性能。最好將圖像寫入文件。

NSData *pngData = UIImagePNGRepresentation(image); 

這會提取所拍攝圖像的PNG數據。從這裏,你可以把它寫到一個文件中:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name 
[pngData writeToFile:filePath atomically:YES]; //Write the file 

以後讀它的方式是一樣的。構建路徑就像我們剛纔上面那樣的話:

NSData *pngData = [NSData dataWithContentsOfFile:filePath]; 
UIImage *image = [UIImage imageWithData:pngData]; 

你可能會想要做的是使,爲您創建路徑字符串,因爲你不想到處散落的代碼的方法。它可能看起來像這樣:

- (NSString *)documentsPathForFileName:(NSString *)name 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 

    return [documentsPath stringByAppendingPathComponent:name]; 
} 

希望有幫助。

+2

完全正確的 - 只是想提一下蘋果貯藏指南,以便根據圖像的性質,應該在高速緩存 –

+0

我存儲遵循你的建議和代碼。但它沒有出現在照片部分。這怎麼發生的? – NovusMobile

+0

@DaniloCampos如何在Documents Directory中創建一個文件夾,然後將該文件保存在該文件夾中? –

0

在斯威夫特:

let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true) 
if let path = paths[0]?.stringByAppendingPathComponent(imageName) { 
    do { 
     try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic) 
    } catch { 
     return 
    } 
} 
2

雨燕3.0的版本

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 

let img = UIImage(named: "1.jpg")!// Or use whatever way to get the UIImage object 
let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg"))// Change extension if you want to save as PNG 

do{ 
    try UIImageJPEGRepresentation(img, 1.0)?.write(to: imgPath, options: .atomic)//Use UIImagePNGRepresentation if you want to save as PNG 
}catch let error{ 
    print(error.localizedDescription) 
} 
相關問題