82

NSUserDefaults画像をオブジェクトとして保存し、後で使用するために取得することはできますか?

4

13 に答える 13

139

イメージを NSUserDefaults に保存するには:

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:key];

NSUserDefaults から画像を取得するには:

NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:key];
UIImage* image = [UIImage imageWithData:imageData];
于 2011-07-11T10:06:25.640 に答える
85

注意!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]];
}

ドキュメントパスのファイル名:

- (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 と xcode 6 のインストール プロセスの違いは、xcode で実行するたびに xcode6がアプリの UUIDを変更することです (パスの強調表示された部分を参照してください: /var/mobile/Containers/Data/Application/ B0D49CF5-8FBE-4F14-87AE-FA8C16A678B1 /Documents/画像.jpg)。

したがって、2 つの回避策があります。

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

ボーナスとしてコードの迅速なバージョンを次に示します(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)
}

ドキュメントパスのファイル名:

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

    return fullPath
}
于 2014-02-16T11:16:44.223 に答える
30

UIImageに保存することは可能NSUserDefaultsですが、画像を保存する最も効率的な方法ではないため、多くの場合推奨されません。より効率的な方法は、画像をアプリケーションのDocuments Directory.

この質問の目的のために、あなたの質問への回答と、より効率的なUIImage.


NSUserDefaults (非推奨)

NSUserDefaults への保存

UIImageこのメソッドを使用すると、任意のファイルをに保存できますNSUserDefaults

-(void)saveImageToUserDefaults:(UIImage *)image ofType:(NSString *)extension forKey:(NSString *)key {
    NSData * data;

    if ([[extension lowercaseString] isEqualToString:@"png"]) {
        data = UIImagePNGRepresentation(image);
    } else if ([[extension lowercaseString] isEqualToString:@"jpg"]) {
        data = UIImageJPEGRepresentation(image, 1.0);
    }

    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:data forKey:key];
    [userDefaults synchronize];
}

これはあなたがそれを呼び出す方法です:

[self saveImageToUserDefaults:image ofType:@"jpg" forKey:@"myImage"];
[[NSUserDefaults standardUserDefaults] synchronize];

NSUserDefaults からの読み込み

UIImageこのメソッドを使用すると、から任意のものをロードできますNSUserDefaults

-(UIImage *)loadImageFromUserDefaultsForKey:(NSString *)key {
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    return [UIImage imageWithData:[userDefaults objectForKey:key]];
}

これはあなたがそれを呼び出す方法です:

UIImage * image = [self loadImageFromUserDefaultsForKey:@"myImage"];

より良い代替手段

ドキュメント ディレクトリへの保存

このメソッドを使用すると、アプリ内に任意UIImageのファイルを保存できます。Documents Directory

-(void)saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    if ([[extension lowercaseString] isEqualToString:@"png"]) {
        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];
    } else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) {
        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];
    } else {
        NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
    }
}

これはあなたがそれを呼び出す方法です:

NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
[self saveImage:image withFileName:@"Ball" ofType:@"jpg" inDirectory:documentsDirectory];

ドキュメント ディレクトリから読み込み中

このメソッドを使用するとUIImage、アプリケーションのDocuments Directory.

-(UIImage *)loadImageWithFileName:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.%@", directoryPath, fileName, [extension lowercaseString]]];

    return result;
}

これはあなたがそれを呼び出す方法です:

NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
UIImage * image = [self loadImageWithFileName:@"Ball" ofType:@"jpg" inDirectory:documentsDirectory];

別の選択肢

UIImage をフォト ライブラリに保存する

UIImageこのメソッドを使用すると、デバイスのに任意のものを保存できます。次のPhoto Libraryように呼び出されます。

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

複数の UIImage をフォト ライブラリに保存する

UIImagesこの方法では、デバイスの に複数保存できますPhoto Library

-(void)saveImagesToPhotoAlbums:(NSArray *)images {
    for (int x = 0; x < [images count]; x++) {
        UIImage * image = [images objectAtIndex:x];

        if (image != nil) UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }
}

これはあなたがそれを呼び出す方法です:

[self saveImagesToPhotoAlbums:images];

で構成されている場所imagesはどこですか。NSArrayUIImages

于 2015-02-10T02:43:06.037 に答える
11

スイフト 4 の場合

私はこの質問でほとんどすべてを試しましたが、誰も私のために働いていません. そして私は自分の解決策を見つけました。まず、以下のように UserDefaults の拡張機能を作成し、次に get メソッドと set メソッドを呼び出しました。

extension UserDefaults {
    func imageForKey(key: String) -> UIImage? {
        var image: UIImage?
        if let imageData = data(forKey: key) {
            image = NSKeyedUnarchiver.unarchiveObject(with: imageData) as? UIImage
        }
        return image
    }
    func setImage(image: UIImage?, forKey key: String) {
        var imageData: NSData?
        if let image = image {
            imageData = NSKeyedArchiver.archivedData(withRootObject: image) as NSData?
        }
        set(imageData, forKey: key)
    } 
}

settingsVC で画像を背景として設定するには、以下のコードを使用しました。

let croppedImage = cropImage(selectedImage, toRect: rect, viewWidth: self.view.bounds.size.width, viewHeight: self.view.bounds.size.width)

imageDefaults.setImage(image: croppedImage, forKey: "imageDefaults")

mainVC で:

let bgImage = imageDefaults.imageForKey(key: "imageDefaults")!
于 2018-04-19T22:09:02.310 に答える
8

スイフト2.2の場合

保存するには:

NSUserDefaults.standardUserDefaults().setObject(UIImagePNGRepresentation(chosenImage), forKey: kKeyImage)

取得するには:

if let imageData = NSUserDefaults.standardUserDefaults().objectForKey(kKeyImage),
            let image = UIImage(data: imageData as! NSData){
            // use your image here...
}
于 2016-04-01T12:25:27.720 に答える
6

はい、技術的に可能です

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:@"foo"];

しかし、plist はバイナリ データの大きなブロブ、特にユーザー設定には適していないため、お勧めできません。画像をユーザー ドキュメント フォルダーに保存し、そのオブジェクトへの参照を URL またはパスとして保存することをお勧めします。

于 2011-07-11T10:12:52.543 に答える
3

技術的には可能ですが、お勧めできません。代わりに、イメージをディスクに保存してください。NSUserDefaultsは、大きなバイナリデータファイルではなく、小さな設定を対象としています。

于 2011-07-11T12:32:18.033 に答える
3

アップルのドキュメントから、

NSUserDefaults クラスは、float、double、integer、Boolean、URL などの一般的な型にアクセスするための便利なメソッドを提供します。デフォルト オブジェクトはプロパティ リスト、つまり、NSData、NSString、NSNumber、NSDate、NSArray、または NSDictionary のインスタンス (またはコレクションの場合はインスタンスの組み合わせ) である必要があります。他のタイプのオブジェクトを保存する場合は、通常、アーカイブして NSData のインスタンスを作成する必要があります。

次のように画像を保存できます:-

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation([UIImage imageNamed:@"yourimage.gif"])forKey:@"key_for_your_image"];

そして、このように読んでください:-

 NSData* imageData = [[NSUserDefaults standardUserDefaults]objectForKey:@"key_for_your_image"];
    UIImage* image = [UIImage imageWithData:imageData];
于 2014-02-13T09:06:40.473 に答える
1

はい、ご利用いただけます。ただし、設定の保存用であるため、画像をドキュメントフォルダーに保存することをお勧めします。

また、必要に応じて にパスを含めることができますNSUserDefaults

于 2011-07-11T10:07:14.597 に答える
1

イメージを NSUserDefault に保存します。

NSData *imageData; 
// create NSData-object from image
imageData = UIImagePNGRepresentation([dic objectForKey:[NSString stringWithFormat:@"%d",i]]); 
// save NSData-object to UserDefaults
[[NSUserDefaults standardUserDefaults] setObject:imageData forKey:[NSString stringWithFormat:@"%d",i]];

NSUserDefault からイメージをロードします。

NSData *imageData;
// Load NSData-object from NSUserDefault
imageData = [[NSUserDefaults standardUserDefaults] valueForKey:[NSString stringWithFormat:@"%d",i]];
// get Image from NSData
[image setObject:[UIImage imageWithData:imageData] forKey:[NSString stringWithFormat:@"%d",i]];
于 2011-07-11T10:23:44.240 に答える