2012-05-29 17 views
9

मैं अपने ऐप में ELCImagePickerController का उपयोग कर रहा हूं और मैं चयनित सरस्क्रीन इमेज को मेरी सरणी में सहेजना नहीं चाहता क्योंकि अगर मैंने 40 आईपैड छवियों का चयन किया तो यह अच्छा नहीं है।मैं UIImagePickerControllerReferenceURL से डेटा कैसे प्राप्त करूं?

मैं - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info के नियम से UIImagePickerControllerOriginalImage के बजाय UIImagePickerControllerReferenceURL से डेटा प्राप्त करना चाहता हूं।

मैं कोशिश की है:

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 बाइट्स हो रही है। मैंने फोरम में उपलब्ध सभी उत्तरों के साथ प्रयास किया है लेकिन कोई उपयोग नहीं है।

क्या कोई इसका उत्तर दे सकता है?

उत्तर

26

UIImagePickerControllerReferenceURLNSURL ऑब्जेक्ट स्ट्रिंग ऑब्जेक्ट नहीं देता है। Assets Library के लिए NSURL वस्तु

NSData *data = [NSData dataWithContentsOfURL:[dict objectForKey:@"UIImagePickerControllerReferenceURL"]]; 
NSLog(@"length %d",[data length]); 
imageview.image = [UIImage imageWithData:data]; 

UIImagePickerControllerReferenceURL रिटर्न है, तो आप के रूप में छवि प्राप्त कर सकते हैं - - कृपया करने के लिए अपने कोड बदलने

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 आईओएस 9.

+0

आपके उत्तर के लिए धन्यवाद ... मैंने ऐसा भी प्रयास किया है, भले ही मेरे लॉग में मुझे 0 की लंबाई हो रही है "2012-05-29 18: 32: 13.536 मायएप [17 9 3: 707] लंबाई 0" –

+1

यह 0 है क्योंकि UIImagePickerControllerReferenceURL एसेट्स लाइब्रेरी के लिए NSURL ऑब्जेक्ट लौटाता है। इसलिए आपको इस यूआरएल से छवि प्राप्त करने के लिए एसेट्स लाइब्रेरी का उपयोग करने की आवश्यकता है। के रूप में - NSURL * contextURL = [info objectForKey: UIImagePickerControllerReferenceURL]; अलास्सेट्स लाइब्रेरी * लाइब्रेरी = [[अलास्सेट्स लाइब्रेरी ऑलोक] init]; [पुस्तकालय संपत्तिफॉरर: संदर्भ URL परिणामब्लॉक:^(अलास्सेट * संपत्ति) {...} विफलताब्लॉक:^(एनएसईआरआर * त्रुटि) {...}]; – saadnib

+0

आईओएस 9 में एलासेट्स लाइब्रेरी को इसके लायक होने के लिए क्या किया गया है। मैंने नीचे एक अतिरिक्त उत्तर जोड़ा है। – Jessedc

1

में में हटा दिया गया है 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 

    } 
} 
} 
8

यह सवाल UIImagePickerControllerReferenceURL के लिए गूगल पर रैंक अच्छी इसलिए मैंने सोचा कि मैं iOS9 में UIImagePickerControllerReferenceURL उपयोग करने के लिए सही तरीका जोड़ना होगा और बाद में ALAssetLibrary के रूप में पदावनत किया गया है फोटो फ्रेमवर्क के पक्ष में

का उपयोग करके फोटो तक पहुंचने का सही तरीका imagePickerController(_:didFinishPickingMediaWithInfo:) से जानकारी शब्दकोश में प्रदान किया गया फ़ोटो किट PHAsset के माध्यम से है।

UIImagePickerControllerDelegate उपयोग तस्वीरें फ्रेमवर्क का एक बुनियादी कार्यान्वयन 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 शामिल नहीं है।

संबंधित मुद्दे