Comment copyr un file image de la photothèque iOS (ALAssetsLibrary) dans le directory local d'une application?

Je peux get des images de la photothèque via ALAssetsLibrary:

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop){ if([[result valueForProperty:ALAssetPropertyType] isEqualToSsortingng:ALAssetTypePhoto]) { // Copy the photo image to the `/Documents` directory of this App here } }; void (^assetGroupEnumerator )(ALAssetsGroup*, BOOL*) = ^(ALAssetsGroup *group, BOOL *stop){ if (group != nil) { [group enumerateAssetsUsingBlock:assetEnumerator]; } }; // fetch ALAssetsLibrary *library = [ALAssetsLibrary new]; [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:^(NSError *error) { NSLog(@"failed"); }]; 

Je veux copyr des images spécifiques dans le directory local ( App_home/Documents ), mais je ne sais pas comment faire exactement ce travail en manipulant des objects ALAsset.

    Essayez avec le code suivant

     ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init]; [assetLibrary assetForURL:YourURL resultBlock:^(ALAsset *asset) { ALAssetRepresentation *rep = [asset defaultRepresentation]; Byte *buffer = (Byte*)malloc(rep.size); NSUInteger buffered = [rep getBytes:buffer fromOffset: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]); } ]; 

    Pour get l'image dans le directory du document

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDirectory = [paths objectAtIndex:0]; NSSsortingng *newPath = [documentsDirectory ssortingngByAppendingPathComponent:@"Your_Image_Name"]; UIImage *myImg = [UIImage imageWithContentsOfFile:newPath] 

    Cela peut vous être utile. En cela, le file outputFileURL est de type NSURL

      NSData *videoData = [NSData dataWithContentsOfURL:outputFileURL]; [data writeToFile:destinationPath atomically:YES];//you can save image later 

    Vous pouvez get une image binary brute avec l'implémentation ci-dessous et save dans votre file cible.

     + (NSData *)photoAssetRawData:(ALAsset *)photoAsset error:(NSError **)error { ALAssetRepresentation *rep = photoAsset.defaultRepresentation; NSMutableData *data = [NSMutableData new]; long long offset = 0; uint8_t dataBuffer[PHOTO_READ_CHUNK_SIZE]; NSError *internalError; do { NSUInteger readByteLength = [rep getBytes:dataBuffer fromOffset:offset length:sizeof(dataBuffer) error:&internalError]; if(internalError != nil) { if(error != NULL) { *error = internalError; } return nil; } offset += readByteLength; [data appendBytes:(void*)dataBuffer length:readByteLength]; } while (offset < rep.size); return data; } 

    Une chose doit être consciente, cette donnée brute n'a pas appliqué de filter iOS galerie ajouté par défaut, si vous voulez que ce filter appliqué, vous devriez get ce filter XMP aimé de [métadonnées ALAssetRepresentation] et créer des filters avec [CIFilter filterArrayFromSerializedXMP: inputImageExtent: erreur :], puis les appliquer sur une image en pleine résolution, enfin save cette image traitée au format JPEG ou PNG dans le file.

    Ci-dessous montre comment appliquer ces filters.

     + (CGImageRef)applyXMPFilter:(ALAsset *)asset{ ALAssetRepresentation *rep = [asset defaultRepresentation]; CGImageRef imageRef = [rep fullResolutionImage]; NSSsortingng *adjustmentXMP; NSData *adjustmentXMPData; NSError *__autoreleasing error = nil; NSArray *filters=nil; CGRect extend = CGRectZero; //add filter to image ALAssetRepresentation *representation = asset.defaultRepresentation; adjustmentXMP = [representation.metadata objectForKey:@"AdjustmentXMP"]; adjustmentXMPData = [adjustmentXMP dataUsingEncoding:NSUTF8SsortingngEncoding]; extend.size = representation.dimensions; filters = [CIFilter filterArrayFromSerializedXMP:adjustmentXMPData inputImageExtent:extend error:&error]; if(filters) { CIImage *image = [CIImage imageWithCGImage:imageRef]; CIContext *context = [CIContext contextWithOptions:nil]; for (CIFilter *filter in filters) { [filter setValue:image forKey:kCIInputImageKey]; image = [filter outputImage]; } imageRef = [context createCGImage:image fromRect:image.extent]; } return imageRef; }