2011-12-12 14 views
18

के रूप में छवि को बाहर निकालें IAssssetsLibrary और ALAsset का उपयोग करके छवि को एनएसडीटा ऑब्जेक्ट के रूप में सीधे निकालना चाहते हैं।एलासेट्स लाइब्रेरी और अलास्सेट का उपयोग एनएसडीटा

एनएसआरएल का उपयोग करके मैं छवि को निम्न तरीके से बाहर ले जाता हूं।

NSURL *referenceURL =newURL; 
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
[library assetForURL:referenceURL resultBlock:^(ALAsset *asset) 
{ 
    UIImage *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; 
} 

अब यहाँ हम एक UIImage के रूप में छवि ले, लेकिन मैं NSData के रूप में सीधे छवि लेने के लिए की जरूरत है।

मैं ऐसा करना चाहता हूं क्योंकि (जब मैंने UIImage में छवि ले ली है, तो हम छवि के सभी EXIF ​​विवरण खो देते हैं।

कारण मैं सीधे NSData के रूप में छवि को निकालने के लिए चाहते हैं यही कारण है, बजाय इस

NSData *webUploadData=UIImageJPEGRepresentation(copyOfOriginalImage, 0.5); 

यह कदम करने का मुझे सभी EXIF ​​विवरण खो देते हैं बनाता है।

कृपया मदद करें।

उत्तर

33
 ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init]; 
     [assetLibrary assetForURL:[[self.imagedata objectAtIndex:i] 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]); 
     }]; 
+1

अपने अद्भुत सुझाव के लिए धन्यवाद। लेकिन, क्या कोई तरीका है कि मैं छवि को संपीड़ित कर सकता हूं? इसे NSData के रूप में उपयोग करने से पहले। –

+0

यदि मैं सही समझता हूं, तो छवि पहले ही संकुचित हो जाएगी। डिफ़ॉल्ट प्रस्तुति शायद एक जेपीईजी या पीएनजी – HeikoG

+2

होगी, मुझे एक ही समय में एकाधिक एलासेट्स आयात करते समय इस तकनीक के साथ समस्या है, ऐसा लगता है जैसे बफर को अगले आइटम के लिए पुन: उपयोग किया जाता है। –

-1
UIImage * selImage = [UIImage imageWithCGImage:[asset thumbnail]];  
NSData *baseImage=UIImagePNGRepresentation(selImage); 
+0

क्या आप निश्चित हैं ???? –

+0

यह मेरे लिए बहुत अच्छा काम करता है। – mreynol

0

इस कोड का उपयोग करना:

+ (BOOL)exportDataToURL:(NSString *)filePath error:(NSError **)error andAsset:(ALAsset *)asset 
{ 
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil]; 
    NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath]; 

    if (!handle) 
     return NO; 

    static const NSUInteger BufferSize = 1024 * 1024; 

    ALAssetRepresentation *rep = [asset defaultRepresentation]; 
    uint8_t *buffer = calloc(BufferSize, sizeof(*buffer)); 
    NSUInteger offset = 0, bytesRead = 0; 

    do { 
     @try { 
      bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:error]; 
      [handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]]; 
      offset += bytesRead; 
     } @catch(NSException *exception) { 
      free(buffer); 

      return NO; 
     } 
    } while (bytesRead > 0); 

    free(buffer); 
    return YES; 
} 
संबंधित मुद्दे