Using ALAssetsLibrary and ALAsset take out Image as NSData

13,766
        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]);
        }];
Share:
13,766

Related videos on Youtube

Shishir Shetty
Author by

Shishir Shetty

javac HelloWorld.java

Updated on June 04, 2022

Comments

  • Shishir Shetty
    Shishir Shetty almost 2 years

    I wish to extract the image using ALAssetsLibrary and ALAsset directly in the form of a NSData object.

    Using a NSURL I take out the image in the following manner.

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

    Now here we take the image as a UIImage, but I need to take the image directly as NSData.

    I wish to do this because (I have read that) once you take the image in UIImage, then we lose all the EXIF details of the Image.

    That's the reason I want to extract the image directly as NSData, instead of doing this

    NSData *webUploadData=UIImageJPEGRepresentation(copyOfOriginalImage, 0.5);
    

    This step makes me lose all the EXIF details.

    Please Help.

  • Shishir Shetty
    Shishir Shetty over 12 years
    Thank you for your wonderful suggestion. But, is there any way I can compress the image ? Before using it as NSData.
  • HeikoG
    HeikoG over 12 years
    If I understand right, the image will already be compressed. The default presentation will probably be a jpeg or png
  • Nicolas Manzini
    Nicolas Manzini over 10 years
    i have a problem with this technique while importing multiple ALAssets at the same tim, it seems as if the buffer gets reused for the next item.
  • dreampowder
    dreampowder about 10 years
    this answer is just fantastic! thanks for the code! The CGImage method also has a huge memory footprint compared to this method.
  • Pankaj Bhardwaj
    Pankaj Bhardwaj almost 9 years
    I have used this code to get GIF image, this works but not properly the animation state is not staying with the GIF image and its size get compressed,any other option will be useful.
  • maddy
    maddy almost 9 years
    @PankajBhardwaj did you ever able to get succes in getting gif from alasset ?
  • Pankaj Bhardwaj
    Pankaj Bhardwaj almost 9 years
    No @Alok not gif I got PNG and JPG , Even i have tried to save in document directory but still its just a image without animation.
  • maddy
    maddy almost 9 years
    i have been able to do it successfully. will share code when on my mac.