Как получить данные из UIImagePickerControllerReferenceURL?
Я использую https://github.com/B-Sides/ELCImagePickerController в своем приложении, и я не хочу сохранять выбранный fullScreenImage в своем массиве, потому что, если я выбрал 40 изображений iPad, это не хорошо.
Я хочу получить данные от UIImagePickerControllerReferenceURL
вместо UIImagePickerControllerOriginalImage
с точки зрения метода - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info
,
Я пытался:
NSDictionary *dict = [info objectAtIndex:count];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[dict objectForKey:@"UIImagePickerControllerReferenceURL"]]]];//UIImagePNGRepresentation([UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@",[dict objectForKey:@"UIImagePickerControllerReferenceURL"]]] );
NSLog(@"length %d",[data length]);
imageview.image = [UIImage imageWithData:data];
Тем не менее, каждый раз, когда я получаю 0 байтов. Я пытался со всеми ответами, доступными на форуме, но бесполезно.
Кто-нибудь может ответить на это, пожалуйста?
3 ответа
UIImagePickerControllerReferenceURL
возвращается NSURL
объект не строковый объект. Пожалуйста, измените свой код на -
NSData *data = [NSData dataWithContentsOfURL:[dict objectForKey:@"UIImagePickerControllerReferenceURL"]];
NSLog(@"length %d",[data length]);
imageview.image = [UIImage imageWithData:data];
UIImagePickerControllerReferenceURL
возвращается NSURL
объект для Assets Library
, так что вы можете получить изображение как -
ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:[[self.imagedata objectAtIndex:i] valueForKey:UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];//this is NSData may be what you want
[data writeToFile:photoFile atomically:YES];//you can save image later
} failureBlock:^(NSError *err) {
NSLog(@"Error: %@",[err localizedDescription]);
}];
Примечание: ALAssetsLibrary устарела в iOS 9.
Этот вопрос хорошо в Google для UIImagePickerControllerReferenceURL
поэтому я решил добавить правильный способ использования UIImagePickerControllerReferenceURL
в iOS9 и более поздних версиях, поскольку ALAssetLibrary устарела в пользу Photos Framework.
Правильный способ доступа к фотографии с помощью UIImagePickerControllerReferenceURL
предоставляется в информационном словаре из imagePickerController(_:didFinishPickingMediaWithInfo:) - с помощью набора фотографий PHAsset.
Основная реализация UIImagePickerControllerDelegate
использование Photos Framework для получения UIImage будет выглядеть примерно так:
class YourViewController: UIViewController, UIImagePickerControllerDelegate
{
public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]?) {
guard let info = info, let url = info[UIImagePickerControllerReferenceURL] as? NSURL else {
// Using sourceType .Camea will end up in here as there is no UIImagePickerControllerReferenceURL
picker.dismissViewControllerAnimated(true) {}
return
}
let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([url], options: nil)
if let photo = fetchResult.firstObject as? PHAsset {
PHImageManager.defaultManager().requestImageForAsset(photo, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil) {
image, info in
// At this point you have a UIImage instance as image
}
}
}
}
Код выше не будет обрабатывать обратные вызовы, когда sourceType .Camera
поскольку информационный словарь не содержит UIImagePickerControllerReferenceURL
,
В ELCImagePickers "Выбранные активы" вы можете сделать
-(void)selectedAssets:(NSArray*)_assets {
"... your code .?.?."
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
for(ALAsset *asset in _assets) {
NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init];
[workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:@"UIImagePickerControllerReferenceURL"];
".. any other properties you need ?"
[returnArray addObject:workingDictionary];
}
}
Затем в вашем другом классе, чтобы сохранить из массива
- (void) importImagesFromArray:(NSArray *)_images toFolder:(NSString *)folderPath
{
if ([_images count] > 0) {
//... YOUR CODE HERE FOR CHECKING YOUR ARRAY...Maybe a loop or something//
//
//
//
//ex:
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
for (NSDictionary *dict in _images) {
[library assetForURL:[dict objectForKey:@"UIImagePickerControllerReferenceURL"]
resultBlock:^(ALAsset *asset){
//You Can Use This
UIImage *theImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]
scale:1.0
orientation:[[asset valueForProperty:@"ALAssetPropertyOrientation"] intValue]];
//[....save image blah blah blah...];
///////////////////////////////////////////////////
///////////////////////////////////////////////////
////// OR YOU CAN USE THIS////////////////////
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];//this is NSData may be what you want
[data writeToFile:[folderPath stringByAppendingPathComponent:@"Some Filename You Need To Assign"] atomically:YES];
}
failureBlock:^(NSError *error){
NSLog(@"Error saving image");
}];
// Dont forget to release library
}
}
}