【问题标题】:iOS - Saving multiple images to Documents folderiOS - 将多个图像保存到 Documents 文件夹
【发布时间】:2012-05-27 02:39:56
【问题描述】:

我有此代码,此代码用于将图像保存到 Documents 文件夹。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,        NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory  stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *image = imageView.image; // imageView is my image from camera
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:NO]; 

我正在寻找一种能够保存多张图片的方法,因为这张图片一直在写入 savedImage.png 名称。

我不介意在谷歌或其他网站上寻找它,但我需要知道它叫什么,因为用错误的关键字查找真的会耽误世界:-)

干杯

【问题讨论】:

  • 您希望将每张图片保存到不同的文件吗?

标签: ios camera nsdocumentdirectory


【解决方案1】:

您需要在第三行更改附加到图像文档目录路径的文件名。每次您都需要使用尚未使用的不同名称。 NSFileManager 具有查看文件是否存在的方法,因此您可以构造文件名,然后测试它是否存在于该位置,如果存在,则增加重复计数并尝试下一个。

如果num 是您在某处定义并保留的整数,以便您知道您认为自己使用的最后一个整数(并且您已在某处初始化为 1)。

// your code to get the directory here, as above

NSFileManager *fm = [NSFileManager ...]

do {
   savedImagePath = [documentsDirectory stringByAppendingPathComponent: 
        [NSString stringWithFormat: @"%@-%d.png", @"savedImage", num]];
   num += 1; // for next time

  if ( ![fm fileExistsAtPath: savedImagePath] )
  {
      // save your image here using savedImagePath
      exit;
  }
} while ( //some kind of test for maximum tries/time or whatever )

您必须查找语法以获取 NSFileManager 实例和确切的文件存在方法签名,但这就是它的要点。

【讨论】:

  • 没有采取简单的方法,但我不知道如何整理你给我的代码的 while 部分。我第一次遇到这个抱歉:-)
  • 想一想:在文件系统中,如果您将第二个同名文件放在同一位置,它将替换现有文件,对吗?如果要将其保存在同一位置,则必须为其指定另一个名称。在 Finder 中,Finder 将通过在文件名中附加一个数字或“副本”来自动执行此操作(当您复制它时)。上面的代码只是想向您展示这一点,并建议您在末尾添加一个数字。阅读您不理解的上述部分的文档。例如,stringWithFormat:NSFileManager 等。
  • 您必须学习阅读文档以了解现有类的作用以及它们的工作方式。 Rishi 上面关于附加日期的回答也是一个选项,并且可能会更容易,因为您不必测试它是否已经存在(如果您包括毫秒)。
  • 如果我们不理解您的问题,那么也许可以尝试澄清一下。
  • 您正在理解这个问题,我已经实施了您的解决方案。在while部分,我现在才输入(nil),直到我解决这个问题。
【解决方案2】:

如果您使用当前日期时间保存文件,则无需担心同名覆盖问题

-(NSString*)getCurrentDateTimeAsNSString
{
    NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
    [format setDateFormat:@"yyyyMMddHHmmss"];
    NSDate *now = [NSDate date];
    NSString *retStr = [format stringFromDate:now];
    [format release];

    return retStr;
}

【讨论】:

    【解决方案3】:

    您可以每次都创建一个新文件。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectory = [paths objectAtIndex:0]; 
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"YOURiMAGEfILE.IMAGEeXTENSION"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
        if (![fileManager fileExistsAtPath: path]) 
        {
            path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"YOURiMAGEfILE.IMAGEeXTENSION] ];
        }
    

    然后您就可以对创建的文件执行上述操作了。

    【讨论】:

    • 抱歉,我无法让这个解决方案发挥作用。也许我误解了它:-)
    【解决方案4】:

    希望它能帮助你为我工作!!

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage
        {
            let i = Int(arc4random())
    
            let str = String(i).appending(".png")
    
            let fileManager = FileManager.default
            let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(str)
    
            print(paths)
    
            let imageData = UIImagePNGRepresentation(image)
            fileManager.createFile(atPath: paths as String, contents: imageData, attributes: nil)
        }
        else{
            print("error")
    
        }
    

    【讨论】:

    • 虽然总是欢迎回答,但请简要说明上述如何解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多