ios iPhone:如何获取使用 UIImageWriteToSavedPhotosAlbum() 保存的图像的文件路径?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4457904/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
iPhone: How do I get the file path of an image saved with UIImageWriteToSavedPhotosAlbum()?
提问by Ben
I'm saving a merged image to the iPhone photo library using:
我正在使用以下方法将合并的图像保存到 iPhone 照片库:
UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);
And getting the callback using:
并使用以下方法获取回调:
- (void) savedPhotoImage:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo { NSLog(@"%@", [error localizedDescription]);
NSLog(@"info: %@", contextInfo);}
What I would like to get is the path for where the image has been saved, so I can add it to an array which will be used to call up a list of saved items elsewhere in the app.
我想得到的是保存图像的路径,因此我可以将它添加到一个数组中,该数组将用于调用应用程序中其他位置的已保存项目列表。
When I load the image using the picker it displays the path info. However when I save a created image, I can't find where to pull the saved image path.
当我使用选择器加载图像时,它会显示路径信息。但是,当我保存创建的图像时,我找不到拉出保存的图像路径的位置。
I have search about the web, but most examples stop at the callback with a nice message to say the image was saved successfully. I would just like to be able to know where it was saved.
我在网上搜索过,但大多数示例都在回调处停止,并带有一条很好的消息,说明图像已成功保存。我只想知道它的保存位置。
I understand one method might be to start defining my own paths, but as the method does that for me, I was just hoping it could tell me where it saved to.
我知道一种方法可能是开始定义我自己的路径,但由于该方法为我这样做,我只是希望它可以告诉我它保存到哪里。
回答by Ben
I finally found out the answer. Apparently the UIImage methods strip out metadata and so using UIImageWriteToSavedPhotosAlbum is no good.
我终于找到了答案。显然 UIImage 方法会去除元数据,因此使用 UIImageWriteToSavedPhotosAlbum 是不好的。
However in ios4 Apple put in a new framework to handle the photo library called the ALAssetsLibrary.
然而,在 ios4 中,Apple 引入了一个新框架来处理名为 ALAssetsLibrary 的照片库。
First you need to right click on the Targets and in the build part, add the AlAsset Framework to your project with the little + icon in the bottom left.
首先,您需要右键单击目标,然后在构建部分中,使用左下角的小 + 图标将 AlAsset 框架添加到您的项目中。
Then add #import "AssetsLibrary/AssetsLibrary.h";
to the header file of your class.
然后添加#import "AssetsLibrary/AssetsLibrary.h";
到你的类的头文件中。
Finally you can use the following code:
最后,您可以使用以下代码:
UIImage *viewImage = YOUR UIIMAGE // --- mine was made from drawing context
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// Request to save the image to camera roll
[library writeImageToSavedPhotosAlbum:[viewImage CGImage] orientation:(ALAssetOrientation)[viewImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
NSLog(@"error");
} else {
NSLog(@"url %@", assetURL);
}
}];
[library release];
And that gets the path of the file you just saved.
这将获得您刚刚保存的文件的路径。
回答by driedler
OlivariesF's answer is missing the key part of this question, retrieve the path:
OlivariesF 的回答漏掉了这个问题的关键部分,找回路径:
Here's a code snippet that does everything:
这是一个可以完成所有操作的代码片段:
- (void)processImage:(UIImage*)image type:(NSString*)mimeType forCallbackId:(NSString*)callbackId
{
__block NSString* localId;
// Add it to the photo library
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier];
} completionHandler:^(BOOL success, NSError *err) {
if (!success) {
NSLog(@"Error saving image: %@", [err localizedDescription]);
} else {
PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil];
PHAsset *asset = [assetResult firstObject];
[[PHImageManager defaultManager] requestImageDataForAsset:asset
options:nil
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
NSURL *fileUrl = [info objectForKey:@"PHImageFileURLKey"];
if (fileUrl) {
NSLog(@"Image path: %@", [fileUrl relativePath]);
} else {
NSLog(@"Error retrieving image filePath, heres whats available: %@", info);
}
}];
}
}];
}
回答by Chalermchon Sommana
My code is
我的代码是
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
imageURL = nil;
ALAssetsLibraryWriteImageCompletionBlock completeBlock = ^(NSURL *assetURL, NSError *error){
if (!error) {
#pragma mark get image url from camera capture.
imageURL = [NSString stringWithFormat:@"%@",assetURL];
}
};
if(image){
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:[image CGImage]
orientation:(ALAssetOrientation)[image imageOrientation]
completionBlock:completeBlock];
}
}
in .h import Library and define type def of ALAssetsLibraryWriteImageCompletionBlock
在 .h 中导入库并定义 ALAssetsLibraryWriteImageCompletionBlock 的类型 def
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error);
if you don't know how to get <AssetsLibrary/AssetsLibrary.h>
, please add existing framework (AssetsLibrary.framework)
如果您不知道如何获取<AssetsLibrary/AssetsLibrary.h>
,请添加现有框架(AssetsLibrary.framework)
回答by Avijit Nagare
Swift Version will be
Swift 版本将是
ALAssetsLibrary().writeImageToSavedPhotosAlbum(editedImage.CGImage, orientation: ALAssetOrientation(rawValue: editedImage.imageOrientation.rawValue)!,
completionBlock:{ (path:NSURL!, error:NSError!) -> Void in
print("\(path)")
})
And "import ALAssetsLibrary" in your file.
并在您的文件中“导入 ALAssetsLibrary”。
Project-> Build Phases -> Link binary -> AssetsLibrary.framework
项目-> 构建阶段-> 链接二进制文件-> AssetsLibrary.framework
回答by Chris Van Buskirk
Swift 4.1 version of OlivaresF's answer
Swift 4.1 版本 OlivaresF 的回答
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAsset(from: image)
}) { (success, error) in
if success {
} else {
}
}
回答by olivaresF
ALAssetsLibrary has been deprecated.
ALAssetsLibrary 已被弃用。
This is the way you should do it:
这是你应该这样做的方式:
#import <Photos/Photos.h>
UIImage *yourImage;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest creationRequestForAssetFromImage:yourImage];
} completionHandler:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Success");
} else {
NSLog(@"write error : %@",error);
}
}];
回答by sandy
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
RandomIndexnew = arc4random() % 3;
if(RandomIndexnew == 0)
{
nameStr =[NSString stringWithFormat:@"jpg"];
textFieldNormalFile_type.text =[NSString stringWithFormat:@"jpg"];
}
else if(RandomIndexnew = 1)
{
nameStr =[NSString stringWithFormat:@"gif"];
textFieldNormalFile_type.text =[NSString stringWithFormat:@"GIF"];
}
else if(RandomIndexnew = 2)
{
nameStr =[NSString stringWithFormat:@"jpg"];
textFieldNormalFile_type.text =[NSString stringWithFormat:@"JPG"];
}
RandomIndex = arc4random() % 20;
NSString *nameStr1 =[NSString stringWithFormat:@"Image%i",RandomIndex];
textFieldNormalFile_name.text =[NSString stringWithFormat:@"%@.%@",nameStr1,nameStr];
newFilePath = [NSHomeDirectory() stringByAppendingPathComponent: textFieldNormalFile_name.text];
imageData = UIImageJPEGRepresentation(img, 1.0);
if (imageData != nil) {
NSLog(@"HERE [%@]", newFilePath);
[imageData writeToFile:newFilePath atomically:YES];
}
image.image =[UIImage imageNamed:newFilePath];
NSLog(@"newFilePath:%@",newFilePath);
path.text =[NSString stringWithFormat:newFilePath];
NSLog(@"path.text :%@",path.text);
}