[ios] NSUserDefaults에 이미지를 저장 하시겠습니까?

이미지를 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와 xcode 6 설치 프로세스의 차이점은 xcode6 은 xcode에서 실행될 때마다 앱 UUID를 변경 한다는 것입니다 (경로에서 강조 표시된 부분 참조 : / var / mobile / Containers / Data / Application / B0D49CF5-8FBE-4F14-87AE-FA8C16A678B1 / Documents / image.jpg).

따라서 두 가지 해결 방법이 있습니다.

  1. 앱이 실제 기기에 설치되면 UUID가 변경되지 않으므로 해당 문제를 건너 뜁니다 (실제로 변경되지만 새로운 앱임).
  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
}


답변

NSUserDefaults에 이미지를 저장하려면 :

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

NSUserDefaults에서 이미지를 검색하려면 :

NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:key];
UIImage* image = [UIImage imageWithData:imageData];


답변

을 저장할 수 있지만 UIImage할 수 NSUserDefaults는 이미지를 저장하는 가장 효율적인 방법이 아니다, 그것은 자주 사용하지 않는 것이 좋습니다; 더 효율적인 방법은 이미지를 응용 프로그램의 Documents Directory.

이 질문의 목적을 위해 귀하의 질문에 대한 답변과 함께 UIImage.


NSUserDefaults (권장하지 않음)

NSUserDefaults에 저장

이 방법을 사용하면 모든 파일 UIImageNSUserDefaults.

-(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당신입니다 NSArray구성 UIImages.


답변

Swift 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")!


답변

신속한 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...
}


답변

예, 기술적으로 가능합니다.

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

그러나 plist는 큰 이진 데이터, 특히 사용자 환경 설정에 적합한 장소가 아니기 때문에 권장되지 않습니다. 이미지를 사용자 문서 폴더에 저장하고 해당 개체에 대한 참조를 URL 또는 경로로 저장하는 것이 좋습니다.


답변

대한 스위프트 3JPG 형식

기본 이미지 등록 :

UserDefaults.standard.register(defaults: ["key":UIImageJPEGRepresentation(image, 100)!])

이미지를 저장 :

UserDefaults.standard.set(UIImageJPEGRepresentation(image, 100), forKey: "key")

로드 이미지 :

let imageData = UserDefaults.standard.value(forKey: "key") as! Data
let imageFromData = UIImage(data: imageData)!