如何在iOS中保存图片

时间:2012-10-21 04:14:20

标签: ios

我有一个存储在其中的图片的数组,这些图片是从相机中取出的,但是当应用程序关闭或最小化时,下次应用程序启动时它们都会消失。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

不是将图像添加到数组中,而是将图像保存到应用文档文件夹中,而不是像这样:

//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:

好吧,假设您有多张图片,并且您不想覆盖保存在文档目录中的图像。我会做类似以下的事情:

首先创建一个返回当前日期和时间的方法

- (NSString *)currentDateandTime
{
    NSDate *today = [NSDate date];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"MMddyyyy_HHmmssSS"];
    NSString *dateString = [dateFormat stringFromDate:today];
    [dateFormat release];

    return dateString;
}

正如您所看到的,日期缩短到毫秒,这可以防止覆盖图像的任何可能性。要调用该方法,请参阅以下内容:

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

通过执行上述操作,您已为图像创建了唯一的文件名。例如:10212012_12182245_image.jpg

现在检索图像。在保存图像时,还需要将文件名保存为.PLIST文件。您可以创建文件名数组,并将其作为PLIST文件保存到磁盘。然后,您可以按日期对所有图像进行排序或按日期加载。

更新#2:

好的,所以你想要创建并保存到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];
        }
}

现在您已经创建了PLIST,您需要在保存图像时加载它,然后将数据写入其中。我建议创建一个单独的方法,每次拍照时都会调用它。将要发生的是:1。拍摄图片2.)保存带有附加到文件名的日期和时间的图片3.)将该日期对象传递给下面的方法。下面的方法将向字典添加值并将字典保存回文档目录。另外还要注意,因为我们将所有内容保存到文档文件夹中,所有信息都会备份,因此用户在升级应用程序时不会丢失图像。

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

摇滚。

答案 1 :(得分:2)

您可以将图像作为NSData对象保存在NSDictionary中,并将Pictue Name作为键,每当应用程序进入后台时,NSDictionary将保存在NSUserDefaults对象中,稍后将在app init上重新加载。

在AppDelegate.m中

-(void) applicationDidEnterBackground:(UIApplication*)application
{
    NSUserDefaults *infoSaved = [NSUserDefaults standardUserDefaults];
    [infoSaved setObject:imagesDictionary forKey:@"imagesFile"];
    [infoSaved:synchronize];
}

这会将您的NSDictionary保存在设备上app文件夹中的文件中。

从相机拍摄新照片后,使用新的图像对象“

更新imageDictionary 在viewController中

-(void) updateImageDictionary {
       NSData *imageNSData = UIImagePNGRepresentation(theUIImage);
       [imagesDictionary addObject:imageNSData forKey:@"TheImageName"];
}

当您需要刷新图像列表时,可能在您的app init中,从NSUserDefaults中的此对象加载它们:

在viewController中

-(void) loadImagesDictionary {
      imagesDictionary = [infoSaved objectForKey:@"imagesFile"];
}

您还需要找到一种方法,使用AppDelegate中的imagesDictionary对象在视图控制器中共享imagesDictionary对象。 一种方法是使用全局变量,更简单的方法是使用NSUserDefault对象。