programing

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

muds 2023. 8. 4. 23:23
반응형

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

를 이지를저수있까니로 할 수 ?NSUserDefaults나중에 사용할 수 있도록 검색하시겠습니까?

NSUserDefaults에 이미지를 저장하는 방법

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

NSUserDefaults에서 이미지를 검색하는 방법

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

주의! 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 Astmr 및 DevC의 경우 아래 설명에 xcode6/ios8에 문제가 있습니다.xcode5 설치 프로세스와 xcode6 설치 프로세스의 차이점은 xcode6에서 실행할 때마다 앱 UUID가 변경된다는 것입니다(경로의 강조 표시된 부분: /var/mobile/Containers/Data/Application/B0D49CF5-8FBE-4F14-87 참조).AE-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
}

한 동안.UIImageNSUserDefaults이미지를 저장하는 가장 효율적인 방법이 아니기 때문에 권장되지 않는 경우가 많습니다. 보다 효율적인 방법은 이미지를 응용프로그램에 저장하는 것입니다.Documents Directory.

질문의 , 질문에 더 답을 첨부했습니다.UIImage.


NSUser 기본값(권장되지 않음)

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에서 로드

이 메서드를 사용하면 다음을 로드할 수 있습니다.UIImageNSUserDefaults.

-(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];

다른 대안

UI 이미지를 사진 라이브러리에 저장하는 중

이 메서드를 사용하면 다음 항목을 저장할 수 있습니다.UIImage장의위지로Photo Library다음과 같이 호출됩니다.

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

여러 UI 이미지를 사진 라이브러리에 저장

하면 여러 개의 파일을 할 수 .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];

에▁where디images의 신의입니다.NSArray로성된으로 UIImages.

스위프트 4용

저는 이 질문에서 거의 모든 것을 시도했지만 아무도 저를 위해 일하지 않습니다. 그리고 저는 제 해결책을 찾았습니다.먼저 아래와 같이 UserDefaults에 대한 확장을 만든 다음 get and set methods라고 불렀습니다.

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)
    } 
}

설정에서 이미지를 배경으로 설정하는 방법VCI는 아래 코드를 사용했습니다.

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

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

메인 VC:

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는 특히 User Prefs와 같은 큰 이진 데이터 블롭에 적합하지 않기 때문에 권장되지 않습니다.이미지를 사용자 문서 폴더에 저장하고 해당 개체에 대한 참조를 URL 또는 경로로 저장하는 것이 좋습니다.

Swift 3 및 JPG 형식의 경우

기본 이미지 등록:

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

기술적으로는 가능하지만, 권장하지는 않습니다.대신 이미지를 디스크에 저장합니다.NSUserDefaults는 큰 이진 데이터 파일이 아닌 작은 설정에 사용됩니다.

사과 문서에서,

NSUserDefaults 클래스는 float, double, 정수, Boolean 및 URL과 같은 일반적인 유형에 액세스할 수 있는 편리한 방법을 제공합니다.기본 개체는 속성 목록, 즉 NSData, NSString, NSNumber, NSDate, NSRray 또는 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];

이미지를 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]];

NSUser에서 이미지 로드기본값:

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]];

네, 이용하실 수 있습니다.그러나 기본 설정을 저장하기 위한 것이므로 이미지를 문서 폴더에 저장하는 것이 좋습니다.

그리고 당신은 그 경로를 가질 수 있습니다.NSUserDefaults필요한 경우에는

이 질문은 구글 검색 지수가 높기 때문에 - 여기 @Nikita가 있습니다.오늘의 요일과 나이에 대한 Take의 답변.스위프트 3 및 4(예외 취급).

참고: 이 클래스는 JPG 형식의 이미지를 파일 시스템에 읽고 쓰기 위해 작성됩니다.Userdefaults물건들은 그것 밖에서 처리되어야 합니다.

writeFile이미지의 포함과 jpg 파일 이름(.jpg 파일 이름)을 .UIImage이미지를 저장할 수 있으면 true를 반환하고, 쓸 수 없으면 false를 반환합니다. 이때 이미지를 저장할 수 있습니다.Userdefaults백업 계획을 세우거나 한 번 더 시도할 수 있습니다.readFile함수는 이미지 파일 이름을 사용하고 반환합니다.UIImage이 함수에 전달된 이미지 이름을 찾으면 해당 이미지를 반환합니다. 그렇지 않으면 앱의 자산 폴더에서 기본 자리 표시자 이미지를 반환합니다. 이렇게 하면 심각한 충돌이나 기타 이상한 동작을 방지할 수 있습니다.

import Foundation
import UIKit

class ReadWriteFileFS{

    func writeFile(_ image: UIImage, _ imgName: String) -> Bool{
        let imageData = UIImageJPEGRepresentation(image, 1)
        let relativePath = imgName
        let path = self.documentsPathForFileName(name: relativePath)

        do {
            try imageData?.write(to: path, options: .atomic)
        } catch {
            return false
        }
        return true
    }

    func readFile(_ name: String) -> UIImage{
        let fullPath = self.documentsPathForFileName(name: name)
        var image = UIImage()

        if FileManager.default.fileExists(atPath: fullPath.path){
            image = UIImage(contentsOfFile: fullPath.path)!
        }else{
            image = UIImage(named: "user")!  //a default place holder image from apps asset folder
        }
        return image
    }
}

extension ReadWriteFileFS{
    func documentsPathForFileName(name: String) -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let path = paths[0]
        let fullPath = path.appendingPathComponent(name)
        return fullPath
    }
}

스위프트 4.x
Xcode 11.x

func saveImageInUserDefault(img:UIImage, key:String) {
    UserDefaults.standard.set(img.pngData(), forKey: key)
}

func getImageFromUserDefault(key:String) -> UIImage? {
    let imageData = UserDefaults.standard.object(forKey: key) as? Data
    var image: UIImage? = nil
    if let imageData = imageData {
        image = UIImage(data: imageData)
    }
    return image
}

언급URL : https://stackoverflow.com/questions/6648518/save-images-in-nsuserdefaults

반응형