2011-12-12 9 views
18

Tôi muốn trích xuất hình ảnh bằng cách sử dụng ALAssetsLibrary và ALAsset trực tiếp dưới dạng một đối tượng NSData.Sử dụng ALAssetsLibrary và ALAsset đưa ra Hình ảnh dưới dạng NSData

Sử dụng NSURL Tôi đưa ra hình ảnh theo cách sau.

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

Bây giờ, chúng tôi lấy hình ảnh là UIImage, nhưng tôi cần chụp ảnh trực tiếp dưới dạng NSData.

Tôi muốn làm điều này vì (tôi đã đọc) khi bạn chụp ảnh trong UIImage, sau đó chúng tôi mất tất cả chi tiết EXIF ​​của Hình ảnh.

Đó là lý do tôi muốn trích xuất các hình ảnh trực tiếp như NSData, thay vì làm điều này

NSData *webUploadData=UIImageJPEGRepresentation(copyOfOriginalImage, 0.5); 

Bước này làm cho tôi mất tất cả các chi tiết EXIF.

Vui lòng trợ giúp.

Trả lời

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

Cảm ơn bạn đã gợi ý tuyệt vời của bạn. Nhưng, có cách nào tôi có thể nén hình ảnh không? Trước khi sử dụng nó làm NSData. –

+0

Nếu tôi hiểu đúng, hình ảnh sẽ được nén. Bản trình bày mặc định có thể là jpeg hoặc png – HeikoG

+2

tôi gặp sự cố với kỹ thuật này trong khi nhập nhiều ALAssets cùng một lúc, có vẻ như bộ đệm được sử dụng lại cho mục tiếp theo. –

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

bạn có chắc chắn không? –

+0

Điều này hiệu quả với tôi. – mreynol

0

Sử dụng mã này:

+ (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; 
}