IPhone: Как получить путь к файлу изображения, сохраненного с помощью UIImageWriteToSavedPhotosAlbum()?
Я сохраняю объединенное изображение в библиотеке фотографий iPhone, используя:
UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);
И получение обратного вызова с использованием:
- (void) savedPhotoImage:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo { NSLog(@"%@", [error localizedDescription]);
NSLog(@"info: %@", contextInfo);}
Я хотел бы получить путь для того, где изображение было сохранено, поэтому я могу добавить его в массив, который будет использоваться для вызова списка сохраненных элементов в другом месте приложения.
Когда я загружаю изображение с помощью сборщика, он отображает информацию о пути. Однако, когда я сохраняю созданное изображение, я не могу найти, куда тянуть сохраненный путь изображения.
У меня есть поиск в Интернете, но большинство примеров останавливаются на обратном вызове с хорошим сообщением, чтобы сказать, что изображение было успешно сохранено. Я просто хотел бы знать, где он был спасен.
Я понимаю, что одним из способов может быть определение моих собственных путей, но поскольку метод делает это для меня, я просто надеялся, что это может сказать мне, где он был сохранен.
Ответы
Ответ 1
Наконец-то я узнал ответ.
По-видимому, методы UIImage выделяют метаданные, поэтому использование UIImageWriteToSavedPhotosAlbum не является хорошим.
Однако в ios4 Apple добавлена новая фреймворк для обработки библиотеки фотографий, называемой ALAssetsLibrary.
Сначала вам нужно щелкнуть правой кнопкой мыши по объектам и в части сборки, добавить AlAsset Framework в свой проект с помощью значка "+" внизу слева.
Затем добавьте #import "AssetsLibrary/AssetsLibrary.h";
в заголовочный файл вашего класса.
Наконец, вы можете использовать следующий код:
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];
И это путь к файлу, который вы только что сохранили.
Ответ 2
Мой код
-(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];
}
}
в .h импортировать библиотеку и определить тип def из ALAssetsLibraryWriteImageCompletionBlock
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error);
если вы не знаете, как получить <AssetsLibrary/AssetsLibrary.h>
, добавьте существующую структуру (AssetsLibrary.framework)
Ответ 3
Быстрая версия версии OlivaresF версии 4.1
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAsset(from: image)
}) { (success, error) in
if success {
} else {
}
}
Ответ 4
Swift Version будет
ALAssetsLibrary().writeImageToSavedPhotosAlbum(editedImage.CGImage, orientation: ALAssetOrientation(rawValue: editedImage.imageOrientation.rawValue)!,
completionBlock:{ (path:NSURL!, error:NSError!) -> Void in
print("\(path)")
})
И "импортируйте ALAssetsLibrary" в свой файл.
Project- > Фазы сборки → Ссылка двоичный → AssetsLibrary.framework
Ответ 5
- (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);
}
Ответ 6
ALAssetsLibrary устарела.
Так вы должны это сделать:
#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);
}
}];
Ответ 7
Ответ OlivariesF отсутствует ключевая часть этого вопроса, получить путь:
Вот фрагмент кода, который делает все:
- (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);
}
}];
}
}];
}