1. ホーム
  2. ios

[解決済み] NSUserDefaultsで画像を保存する?

2023-06-22 22:13:41

質問

画像を NSUserDefaults に保存し、さらに使用するために取り出すことは可能ですか?

どのように解決するのですか?

注意! iOS8/XCODE6 で動作している場合は、以下の私のアップデートを参照してください。

まだ答えを探している人のために、NSUserDefaults に画像を保存するための推奨される方法のコードを以下に示します。画像データを直接NSUserDefaultsに保存してはいけません!

データを書き込む。

// Get image data. Here you can use UIImagePNGRepresentation if you need transparency
NSData *imageData = UIImageJPEGRepresentation(image, 1);

// Get image path in user's folder and store file with name image_CurrentTimestamp.jpg (see documentsPathForFileName below)
NSString *imagePath = [self documentsPathForFileName:[NSString stringWithFormat:@"image_%f.jpg", [NSDate timeIntervalSinceReferenceDate]]];

// Write image data to user's folder
[imageData writeToFile:imagePath atomically:YES];

// Store path in NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:imagePath forKey:kPLDefaultsAvatarUrl];

// Sync user defaults
[[NSUserDefaults standardUserDefaults] synchronize];

データを読み取ります。

NSString *imagePath = [[NSUserDefaults standardUserDefaults] objectForKey:kPLDefaultsAvatarUrl];
if (imagePath) {
    self.avatarImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:imagePath]];
}

documentsPathForFileNameです。

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

    return [documentsPath stringByAppendingPathComponent:name];
}

iOS8/XCODE6用 tmrさんやDevCさんが以下のコメントで述べているように、xcode6/iOS8で問題があります。xcode5とxcode6のインストール方法の違いですが、xcode6では がアプリのUUIDを変更することです。 をxcodeで実行するたびに変更することです(パスのハイライト部分を参照してください。/var/mobile/Containers/Data/Application/ B0D49CF5-8FBE-4F14-87AE-FA8C16A678B1 /Documents/image.jpg)です。

というわけで、2つの回避策があります。

  1. アプリが実際のデバイスにインストールされると UUID が変更されないため、この問題をスキップする (実際には変更されるが、新しいアプリである)
  2. 必要なフォルダーへの相対パスを保存します (私たちの場合はアプリのルートに)。

おまけでswift版のコードです(2番目のアプローチで)。

データを書き込む。

let imageData = UIImageJPEGRepresentation(image, 1)
let relativePath = "image_\(NSDate.timeIntervalSinceReferenceDate()).jpg"
let path = self.documentsPathForFileName(relativePath)
imageData.writeToFile(path, atomically: true)
NSUserDefaults.standardUserDefaults().setObject(relativePath, forKey: "path")
NSUserDefaults.standardUserDefaults().synchronize()

データを読み取ります。

let possibleOldImagePath = NSUserDefaults.standardUserDefaults().objectForKey("path") as String?
if let oldImagePath = possibleOldImagePath {
    let oldFullPath = self.documentsPathForFileName(oldImagePath)
    let oldImageData = NSData(contentsOfFile: oldFullPath)
    // here is your saved image:
    let oldImage = UIImage(data: oldImageData)
}

documentsPathForFileNameです。

func documentsPathForFileName(name: String) -> String {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true);
    let path = paths[0] as String;
    let fullPath = path.stringByAppendingPathComponent(name)

    return fullPath
}