web-dev-qa-db-ja.com

画像をiOSデバイスにローカルに保存する

IOSの写真関連のアプリの中には、アプリで作成した画像を写真ライブラリ以外の場所に保存するものがあります。たとえば、Fat Boothは、アプリの起動時にアプリで作成された写真のスクロールリストを表示します。これらの写真は、ユーザーが写真ライブラリに明示的に保存しなくても保持されることに注意してください。 iOSアプリケーション内で画像を保存および保持する最も簡単な方法は何ですか?

私がよく知っている永続ストアはNSUserDefaultsとキーチェーンだけです。ただし、画像などの大きなデータを格納するために使用されることを聞いたことはありません。今、Core Dataが最も簡単な方法かどうか疑問に思っています。

43
SundayMonday

最も簡単な方法は、アプリのDocumentsディレクトリに保存し、NSUserDefaultsを使用してパスを保存することです。

NSData *imageData = UIImagePNGRepresentation(newImage);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];

NSLog(@"pre writing to file");
if (![imageData writeToFile:imagePath atomically:NO]) 
{
    NSLog(@"Failed to cache image data to disk");
}
else
{
    NSLog(@"the cachedImagedPath is %@",imagePath); 
}

次に、NSUserDefaultsのディクショナリまたは希望する方法でimagePathを保存し、それを取得するには次のようにします。

 NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"];
 UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath];
64
Tommy Devoy

Swiftの場合:

let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")

if !imageData.writeToFile(imagePath, atomically: false)
{
   println("not saved")
} else {
   println("saved")
   NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}

Swift 2.1:

let imageData = UIImagePNGRepresentation(selectedImage)
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let imageURL = documentsURL.URLByAppendingPathComponent("cached.png")

if !imageData.writeToURL(imageURL, atomically: false)
{
    print("not saved")
} else {
    print("saved")
    NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "imagePath")
}

stringByAppendingPathComponentはSwift 2.1では利用できないため、URLByAppendingPathComponent.詳細情報を取得 ここ

35
Segev

canバイナリデータを保存することでコアデータでそれを行う、ただし推奨されない。特に写真の場合は、はるかに優れた方法があります。アプリケーションには、アプリケーションのみがアクセスできるドキュメント/ファイルディレクトリがあります。概念とそのアクセス方法については、ここから始めることをお勧めします。その比較的簡単です。これをコアデータと組み合わせて、ファイルパス、メタデータなどを保存できます。 http://developer.Apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html

6
Sean