이미지를 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).
따라서 두 가지 해결 방법이 있습니다.
다음은 보너스로 빠른 코드 버전입니다 (두 번째 접근 방식).
데이터 쓰기 :
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에 저장
이 방법을 사용하면 모든 파일 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당신입니다 NSArray구성 UIImages.
inDirectory:(NSString *)directoryPath수 있습니까? "myAppData"와 같이 원하는대로 호출 할 수 있습니까 ??
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...
}
대한 스위프트 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 클래스는 float, double, 정수, 부울 및 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];
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]];
네, 사용할 수 있습니다. 그러나 환경 설정 저장을위한 것이므로 문서 폴더에 이미지를 더 잘 저장할 수 있습니다.
NSUserDefaults필요한 경우에 경로를 가질 수 있습니다 .
이 질문은 Google 검색 색인이 높기 때문에 오늘 날과 시대에 @NikitaTook의 답변, 즉 Swift 3 및 4 (예외 처리 포함)가 있습니다.
참고 :이 클래스는 파일 시스템에서 JPG 형식의 이미지를 읽고 쓰는 용도로만 작성되었습니다. 그만큼Userdefaults물건은 외부를 처리해야한다.
writeFile(.JPG 확장자)하여 JPG 이미지의 파일 이름에 취해 UIImage자체 진정한 수익을 당신이 이미지를 저장할 수있는 시점에서,이 이미지를 기록 할 수없는 경우는 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
}
}
Swift 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
}