Getting the path of an ALAsset

前端 未结 3 433
温柔的废话
温柔的废话 2020-12-28 09:35

How can I get the path of each item in an array of ALAssets?

I would like to get the images so that I can add them to an email

e.g.

NSString         


        
相关标签:
3条回答
  • 2020-12-28 09:54

    Assuming you have the Asset URL, such as assets-library://asset/asset.JPG?id=1000000477&ext=JPG:

          ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
          {
                 // [[myasset defaultRepresentation] fullResolutionImage]
                 // is a CGImageRef so you can process it like you would any CGImageRef to save to disk, resize, etc. 
    
                    NSURL *urlPath = [[NSURL fileURLWithPath:[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]] URLByAppendingPathComponent:@"somefile.png"];
    
                    CGImageDestinationRef ref = CGImageDestinationCreateWithURL((CFURLRef)urlPath, kUTTypePNG, 1, NULL);
                    CGImageDestinationAddImage(ref, (CGImageRef)[[myasset defaultRepresentation] fullResolutionImage], NULL);
    
                    NSDictionary *props = [[NSDictionary dictionaryWithObjectsAndKeys:
                                            [NSNumber numberWithFloat:1.0], kCGImageDestinationLossyCompressionQuality,
                                            nil] retain];
    
                    CGImageDestinationSetProperties(ref, (CFDictionaryRef) props);
    
                    CGImageDestinationFinalize(ref);
                    CFRelease(ref);
    
            };
    
            NSURL *asseturl = [NSURL URLWithString:mediaurl];
            ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
    
            NSString *asseturl = @"assets-library://asset/asset.JPG?id=1000000477&ext=JPG";
    
            [assetslibrary assetForURL:asseturl 
                           resultBlock:resultblock
                          failureBlock:^(NSError *error) {
                              NSLog(@"error couldn't get photo");
                          }]; 
    
    0 讨论(0)
  • 2020-12-28 09:59

    Assuming you already have access to an array of ALAsset objects, you can retrieve their URL like this:

    someAsset.defaultRepresentation.url

    0 讨论(0)
  • 2020-12-28 10:12

    If you have an array of ALAssets then you can load the asset data.

    for (ALAsset *asset in assetsArray)
    {
        // You cannot use ALAsset URL for file access in NSFileManager or NSData.
        // Get asset data. But be careful with very large data:
        ALAssetRepresentation *rep = [asset defaultRepresentation];
        unsigned long repSize      = (unsigned long)rep.size;
    
        Byte *buffer      = (Byte *)malloc(repSize);
        NSUInteger length = [rep getBytes:buffer fromOffset:0 length:repSize error:nil];
    
        NSData *myData = [NSData dataWithBytesNoCopy:buffer length:length freeWhenDone:YES];
    
    
        // fileName parameter in addAttachmentData:mimeType:fileName: can be any string.
        // You can take asset file name:
        NSString *fileName = [rep filename];
    
        // Then use in call:
        [mailViewController addAttachmentData:myData mimeType:@"image/png" fileName:fileName];
    }
    
    0 讨论(0)
提交回复
热议问题