【问题标题】:Unable to get File name of image captured with camera无法获取使用相机拍摄的图像的文件名
【发布时间】:2015-04-01 01:59:16
【问题描述】:

我正在尝试构建一个应用程序,我可以在该应用程序中使用相机捕获图像并保存到图库。但我无法获取图像的文件名。如果我从相机胶卷中选择图像,那么我可以获得所选图像的文件名。但是当我在我的应用程序中使用相机拍摄图像时,它返回文件名“null”。这是我使用UIImagePickerController从图库中保存和选择图像的代码

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

    UIImage *chosenImage = [self scaleAndRotateImage:[info valueForKey:UIImagePickerControllerOriginalImage]];
    NSString *mediaType = info[UIImagePickerControllerMediaType];
       self.userProfileImage.image = chosenImage;

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
        UIImage *image = info[UIImagePickerControllerOriginalImage];

        if (newMedia)
            UIImageWriteToSavedPhotosAlbum(image,
                                           self,
                                           @selector(image:finishedSavingWithError:contextInfo:),
                                           nil);
    }

    imageRotation=[NSString stringWithFormat:@"%f %f %f",acos (self.userProfileImage.transform.a), asin (self.userProfileImage.transform.b), atan2(self.userProfileImage.transform.b, self.userProfileImage.transform.a)];
    CGFloat angle = [(NSNumber *)[self.userProfileImage valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
    NSLog(@"%f", angle);

    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
    ALAssetsLibrary *assetLibrary = [ALAssetsLibrary new];

    [assetLibrary assetForURL:referenceURL
                  resultBlock:^(ALAsset *asset) {
                      ALAssetRepresentation *assetRep = [asset defaultRepresentation];
                     fileName = [assetRep filename];
                      NSLog(@"File name = %@", fileName);    
                  }

                 failureBlock:^(NSError *error) {
                     NSLog(@"%@", error);
                 }];

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
    imageChanged=TRUE;
}

这个代码保存捕获的图像

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    UIAlertView *alert;
    //NSLog(@"Image:%@", image);
      if (error) {
        alert = [[UIAlertView alloc] initWithTitle:@"Error!"
                                           message:[error localizedDescription]
                                          delegate:nil
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
        [alert show];

    }
}

我被困在如何获取捕获图像的文件名的问题上。 我在代码中做错了什么?请建议我任何更正或解决方案。任何帮助,将不胜感激 。提前致谢

【问题讨论】:

    标签: camera uiimagepickercontroller alassetslibrary ios8.1


    【解决方案1】:

    这是我获取文件、视频或照片的文件名的方法,这些文件名是使用 UIImagePickerController 挑选的:

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
        @try {
            self.myinfo = info;
            DDLogDebug(@"MediaListView - Dismissing camera ui...");
            [self.cameraUI dismissViewControllerAnimated:YES completion:nil];
    
            mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
            DDLogDebug(@"MediaListView - Media url = %@", mediaURL);
    
            NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
            DDLogDebug(@"MediaListView - Selected mediaType: %@", mediaType);
    
            // This is a video
            if(mediaURL) {
                DDLogDebug(@"MediaListView - This is a video");
    
                // Just recorded video
                if (self.source == UIImagePickerControllerSourceTypeCamera) {
                    DDLogDebug(@"MediaListView - This is a new video, saving to photos album...");
    
                    // Save video before getting its name
                    ALAssetsLibrary *library = [ALAssetsLibrary new];
    
                    [library writeVideoAtPathToSavedPhotosAlbum:mediaURL completionBlock:^(NSURL *assetURL, NSError *error){
                        if (error) {
                            DDLogDebug(@"MediaListView - Failed to save the photo to photos album...");
                        } else {
                            DDLogDebug(@"MediaListView - Video saved to photos album...");
    
                            // Video saved, we can get its name
                            [self getNameFromUrl:assetURL];
                        }
                    }];
                }
                else {
                    DDLogDebug(@"MediaListView - This is an existing video, getting name...");
                    // Get video name
                    [self getNameFromUrl:[info objectForKey:UIImagePickerControllerReferenceURL]];
                }
            }
            // This is a photo
            else {
                DDLogDebug(@"MediaListView - This is a photo...");
                self.originalImage = (UIImage*)[info objectForKey:UIImagePickerControllerOriginalImage];
    
                // Just taken photo
                if (self.source == UIImagePickerControllerSourceTypeCamera) {
                    DDLogDebug(@"MediaListView - This is a new photo, saving to photos album...");
    
                    // Save photo to album
                    ALAssetsLibrary *library = [ALAssetsLibrary new];
    
                    [library writeImageToSavedPhotosAlbum:[self.originalImage CGImage]
                                              orientation:(ALAssetOrientation)[self.originalImage imageOrientation]
                                          completionBlock:^(NSURL *assetURL, NSError *error){
                        if (error) {
                            DDLogDebug(@"MediaListView - Failed to save the vide to photos album...");
                        } else {
                            DDLogDebug(@"MediaListView - Photo saved to photos album...");
    
                            // Get photo name
                            [self getNameFromUrl:assetURL];
                        }
                    }];
                }
                else {
                    DDLogDebug(@"MediaListView - This is an existing image, getting name...");
                    // Get photo name
                    [self getNameFromUrl:[info objectForKey:@"UIImagePickerControllerReferenceURL"]];
                }
            }
        }
        @catch (NSException *exception) {
            DDLogError(@"MediaListView - Exception in picker didFinishPickingMediaWithInfo");
            DDLogError(@"MediaListView - %@", [exception description]);
        }
    }
    
    - (void)getNameFromUrl(NSURL*)url {
        @try {
            DDLogDebug(@"MediaListView - GetNameFromUrl");
    
            ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) {
    
                if (asset == nil) {
                    DDLogError(@"MediaListView - SaveAssetData - asset is nil!");
                    return;
                }
    
                DDLogDebug(@"MediaListView - SaveAssetData - Got asset data: %@", asset.description);
                ALAssetRepresentation *assetRep = [asset defaultRepresentation];
    
                NSString *fileName = [assetRep filename];
                DDLogDebug(@"MediaListView - SaveAssetData - File name = %@", fileName);
            };
    
            ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *error) {
                DDLogError(@"MediaListView - SaveAssetData - Failed to get name%@", error);
            };
    
            ALAssetsLibrary *library = [ALAssetsLibrary new];
            [library assetForURL:url resultBlock:resultblock failureBlock:failureblock];
        }
        @catch (NSException *exception) {
            DDLogError(@"MediaListView - Exception in saveAssetData");
            DDLogError(@"MediaListView - %@", [exception description]);
        }
    }
    

    【讨论】:

    • 即使将关闭选择器转移到代码块的第一行也不起作用。
    【解决方案2】:

    how to get path of picture taken by camera ios swift

    您拍摄的图像尚未保存,还没有任何名称。您需要先保存图像,然后才能获取图像的路径。这就是它返回 nil 的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多