保存自定义相机捕获图像 iOS Xcode

Posted

技术标签:

【中文标题】保存自定义相机捕获图像 iOS Xcode【英文标题】:save custom camera capture image iOS Xcode 【发布时间】:2017-01-07 07:20:00 【问题描述】:

我是 iPhone 新手,我想将图像保存到相册中并且我想要那个图像路径。 我已经这样做了。

现在,我想要一个自定义的图像名称并使用该名称存储图像。 我使用了下面的代码,但我没有将任何图像放入相册。

谁能指导我哪里错了?

#pragma mark - Image Picker Controller delegate methods

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

     UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.imageView.image = chosenImage;

    [picker dismissViewControllerAnimated:YES completion:NULL];



// Todo to use custom name comment this line.
 //UIImageWriteToSavedPhotosAlbum(self.imageView.image,nil,nil,nil);

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



  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    );

【问题讨论】:

我认为这不可能。为什么你会这样做?你添加自定义图像名称的目标是什么? @sohil。这是客户要求将图像与cient1、client2 等一起存储。我应该遵循天气、建议但对图像的调用感到困惑。 您要将图像存储在照片库或个人文档目录中吗? 我想用自定义名称存储图像。哪种方式都很容易。个人或画廊。 如果您有自定义名称的存储图像,您希望将图像存储在文档目录中 【参考方案1】:

您可以像这样使用自定义名称存储图像:

UIImage *chosenImage = info[UIImagePickerControllerEditedImage];

//save image in Document Derectory
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSLog(@"Get Path : %@",documentsDirectory);

//create Folder if Not Exist
  NSError *error = nil;
  NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/MyFolder"];

  if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
       [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder

     NSString *customePhotoName=@"MyPhotoName";
     NSString* path= [dataPath stringByAppendingString:[NSString stringWithFormat:@"/%@.png",customePhotoName]];
     NSData* imageData = UIImagePNGRepresentation(chosenImage);

     [imageData writeToFile:path atomically:YES];
     NSLog(@"Save Image Path : %@",path);

【讨论】:

谢谢。我已经对此表示赞同。如果这行得通。我会接受的。 我检查了我的 iPhone。我没有得到照片。在哪里看捕获图像?我需要使用相同的 UIImageWriteToSavedPhotosAlbum ?? @NovusMobile 它不会存储在您的 iPhone 照片库中,而是存储在文档目录文件夹中。如果您想在照片库中存储图像而不是 'UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);'比编写此代码,但它不会在照片上显示图像名称。 你能解释一下自定义名称的要求吗? 谢谢@Sohil。接受答案。希望你也可以对问题做同样的事情。【参考方案2】:

在我的一个项目中,我这样做了:

let directory = "yourDirectoryName"
let fileName = "file.png"
let directoryPath = NSHomeDirectory() + "/Library/Caches/\(directory)"
do 
    try NSFileManager.defaultManager().createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)
    UIImagePNGRepresentation(image)?.writeToFile(directoryPath+fileName), atomically: true)
 catch let error as NSError 

代码在 Swift 2.3 中工作。我希望,这就是你想要的。

【讨论】:

是的。但是我应该在 didfinishPickingMediawithInfo 函数之后还是在其他任何地方调用它? 是的,我在 didfinishPickingMediawithInfo 函数中使用它【参考方案3】:

验证 NSData 和 UIImage 对象是否正确,将“原子”设置为 YES,查看我使用的以下代码:

//Save your image with a completion selector
 UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

 //Completion selector
- (void) image: (UIImage *) image
 didFinishSavingWithError: (NSError *) error
    contextInfo: (void *) contextInfo 
   
       if(error)
     
    NSLog(@"save error :%@", [error localizedDescription]);

     
      else if (!error)
     
            PHAsset *asset = [self fetchImageAsset];
     
 

    //Fetch image based on create date or whatever naming system you follow
- (nullable PHAsset *)fetchImageAsset
 
        PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
        fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
        PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
        PHAsset *lastAsset = [fetchResult lastObject];
        return lastAsset;

    

【讨论】:

我对此很陌生。但我没明白你的意思。我理解了保存 UIImageWriteToSavedPhotoAlbum 的第一部分,但没有得到其他任何东西。我想我需要先学习更多关于 iPhone 课程的知识。谢谢你的回答。这是否在 didfinishmetho 之后运行... “选择器”仅表示一个函数,“完成选择器”表示将在您的任务完成时运行的方法。您可以在“UIImageWriteToSavedPhotosAlbum”中将此方法名称作为参数传递,您将能够在将图像写入指定路径时得到错误(NSError),可能会知道什么是错误的。 PHAsset 也是一个客观的 c 类,用于保存和获取媒体资产。请投票。干杯! 你有 iPhone 初学者教程的参考吗? 转到 youtube 并查看“斯坦福大学 ios”频道,它们现在使用 Swift 语言,但是所有旧的“Objective-c”也可以在 iTunes 频道中免费获得。你应该对面向对象编程有一个基本的认识:链接:youtube.com/channel/UCYVp6suz7ztKAKY8jpfACXA

以上是关于保存自定义相机捕获图像 iOS Xcode的主要内容,如果未能解决你的问题,请参考以下文章

将捕获的图像从相机保存到自定义文件夹

iOS:自定义相机如何始终以正确的方向保存图像?

在ios5的自定义相册中保存多个图像但不在相机胶卷中?

如何使用自定义相机 API 制作圆形框架布局并捕获圆形图像?

如何在android中使用相机捕获自定义图像大小?

自定义相册中的图像保存问题以及 iphone 中的默认相机胶卷