이미지를 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).
두 가지 해결 방법이 있습니다.
- 한 번 앱이 실제 장치에 설치되면 UUID가 변경되지 않으므로 이 문제는 건너뜁니다(사실 변경되지만 새 앱입니다).
- 필요한 폴더에 상대 경로 저장(우리의 경우 앱 루트)
다음은 보너스로 코드의 빠른 버전입니다(두 번째 접근 방식 포함).
데이터 쓰기:
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
}
한 동안.UIImage
NSUserDefaults
이미지를 저장하는 가장 효율적인 방법이 아니기 때문에 권장되지 않는 경우가 많습니다. 보다 효율적인 방법은 이미지를 응용프로그램에 저장하는 것입니다.Documents Directory
.
질문의 , 질문에 더 답을 첨부했습니다.UIImage
.
NSUser 기본값(권장되지 않음)
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];
다른 대안
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
'programing' 카테고리의 다른 글
Spring Boot : 'jpaMappingContext' 이름의 bone을 만드는 중 오류가 발생했습니다. java.lang.Null 포인터예외. (0) | 2023.08.04 |
---|---|
MySQL EXPLE: "인덱스 사용" vs."인덱스 조건 사용" (0) | 2023.08.04 |
web.config의 단일 폴더에 대해 익명 인증을 허용하시겠습니까? (0) | 2023.08.04 |
Oracle FIRST/LAST에서 KEEP에 대한 설명 (0) | 2023.08.04 |
주어진 HTML을 사용하여 동적으로 iframe 만들기 (0) | 2023.08.04 |