如何在iOS中保存图片
我有一个数组,其中存储的图片是从相机中获取的,但是当应用程序closures或最小化时,下次应用程序启动时都会消失。 解决这个问题的最好方法是什么?
而不是将图像添加到数组为什么不把图像保存到您的应用程序文档文件夹,如下所示:
//Save Image to Documents Directory UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; NSString *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/image.jpg"]]; [UIImageJPEGRepresentation(image, 1.0) writeToFile:imagePath atomically:YES];
现在,您随时可以使用应用程序随时访问图像。
更新#1:
好吧,说你有多个图片,你不想覆盖保存在你的文档目录中的图像。 我会做如下的事情:
首先创build一个返回当前date和时间的方法
- (NSString *)currentDateandTime { NSDate *today = [NSDate date]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"MMddyyyy_HHmmssSS"]; NSString *dateString = [dateFormat stringFromDate:today]; [dateFormat release]; return dateString; }
正如你所看到的date是毫秒,这可以防止覆盖图像的机会。 调用方法见下面:
//Set Photo Date NSString *date = [self currentDateandTime]; Now onto saving the image: //Save Image to Documents Directory UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; NSString *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@_image.jpg",date]]; [UIImageJPEGRepresentation(image, 1.0) writeToFile:imagePath atomically:YES];
通过执行上述操作,您已经为图像创build了一个唯一的文件名。 例如:10212012_12182245_image.jpg
现在检索图像。 例如,在保存图像时,还需要将文件名保存到.PLIST文件中。 您可以创build一个文件名的数组,并将其作为PLIST文件保存到磁盘。 然后你做按datesorting所有图像或按date加载的东西。
更新#2:
好的,所以你想创build并保存到PLIST。 您可以在图像选取器加载时调用它。
- (void)createPLIST NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; NSString *plistPath = [documentsDirectory stringByAppendingString:@"/images.plist"]; //Check to see if the file exists, if not create the file. if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]){ //Creating empty Image Files Array for later use NSMutableArray *imageArray = [[NSMutableArray alloc] init]; [imageArray writeToFile:plistPath atomically:YES]; [imageArray release]; } }
现在你已经创build了PLIST,你需要在保存图像时加载它,然后写入数据。 我build议创build一个单独的方法,每次拍摄图片时都会被调用。 将要发生的事情是这样的:1.)拍照2.)将附有date和时间的图片保存到文件名3.)将该date对象传递给下面的方法。 下面的方法将添加值到字典并将字典保存到文档目录。 另外,由于我们将所有内容保存到文档文件夹中,因此所有信息均已备份,因此用户在升级应用程序时不会丢失图像。
- (void)createNewGalleryObject:(NSString *)date { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; NSString *plistPath = [NSString stringWithFormat:@"%@/images.plist", documentsDirectory]; //Load PLIST into mutable array NSMutableArray *imageArray = [NSMutableArray arrayWithContentsOfFile:plistPath]; //Create a dictionary for each image captured that saves basic information about the file for later use NSMutableDictionary *newEntry = [[NSMutableDictionary alloc] init]; [imageArray addObject:newEntry]; //This is where we write to the dictionary, it is up to you what values to save. //Based on what you told me I would save the information shown below. //For example Later you can do things like sort by date. [newEntry setValue:[NSDate date] forKey:@"Date"]; [newEntry setValue:[NSString stringWithFormat:@"Documents/%@_originalImage.jpg",date] forKey:@"Original Image"]; //Now save the array back to the PLIST, the array now contains a new dictionary object. //Every time you take a picture a new dictionary object is created [imageArray writeToFile:path atomically:YES]; [newEntry release]; }
好吧,让我们说你现在已经拍了一堆照片,并将图像信息存储到您的文档目录。 你可以像加载数组中的所有图像一样。
-(void)loadImages { //Load PLIST NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [path objectAtIndex:0]; NSString *plistPath = [NSString stringWithFormat:@"%@/images.plist", documentsDirectory]; //Load PLIST into mutable array NSMutableArray *imageArray = [NSMutableArray arrayWithContentsOfFile:plistPath]; for (NSDictionary *dict in imageArray) { //Do whatever you want here, to load an image for example NSString *imageFilePath = [NSHomeDirectory() stringByAppendingPathComponent:[dict objectForKey:@"Original Image"]]; UIImage *image = [UIImage imageWithContentsOfFile:imageFilePath]; } }
摇滚。
您可以将图像保存为一个NSData对象内的一个NSDictionary与Pictue Name作为关键字,每当应用程序转到后台的NSDictionary得到的NSUserDefaults对象保存在一个NSUserDefaults对象稍后重新加载到应用程序init。
在AppDelegate.m中
-(void) applicationDidEnterBackground:(UIApplication*)application { NSUserDefaults *infoSaved = [NSUserDefaults standardUserDefaults]; [infoSaved setObject:imagesDictionary forKey:@"imagesFile"]; [infoSaved:synchronize]; }
这将您的NSDictionary保存在设备上的应用程序文件夹中的文件中。
从相机拍摄新照片后,用新的图像对象“
在你的viewController
-(void) updateImageDictionary { NSData *imageNSData = UIImagePNGRepresentation(theUIImage); [imagesDictionary addObject:imageNSData forKey:@"TheImageName"]; }
当你需要刷新图像列表时,可能在你的app init中,从NSUserDefaults中的这个对象中加载它们:
在你的viewController
-(void) loadImagesDictionary { imagesDictionary = [infoSaved objectForKey:@"imagesFile"]; }
您还需要find一种方法来共享您的视图控制器中的imagesDictionary对象与AppDelegate中的imagesDictionary对象。 一种方法是使用全局variables,一个更简单的方法是使用NSUserDefault对象。