2012-07-09 18 views
6

Nella mia applicazione salvi le immagini su un album come risorse. Voglio anche recuperarli e visualizzarli a schermo intero. Io uso il seguente codice:defaultRepresentation fullScreenImage su ALAsset non restituisce l'immagine a schermo intero

ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset]; 

ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation]; 

UIImage *image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
              scale:[defaultRep scale] orientation: 
    (UIImageOrientation)[defaultRep orientation]]; 

Il problema è che l'immagine restituita è pari a zero . Ho letto al riferimento ALAssetRepresentation che quando l'immagine non si adatta viene restituito nullo.

Ho inserito questa immagine in un UIImageView che ha le dimensioni dello schermo dell'iPad. Mi stavo chiedendo se potessi aiutarmi con questo problema?

Grazie in anticipo.

+0

Da questo codice tutto sembra bene e lavorare anche in mia applicazione di questo codice fornire tutte le immagini bene. Posso dire che le risorse recuperate saranno nul o c'è qualche problema con quel codice, non questo –

risposta

8

Non sono un fan di fullScreenImage o fullResolutionImage. Ho scoperto che quando si esegue questa operazione su più risorse in una coda, anche se si rilascia immediatamente UIImage, l'utilizzo della memoria aumenterà notevolmente mentre non dovrebbe. Inoltre, quando si utilizza fullScreenImage o fullResolutionImage, UIImage restituito è ancora compresso, il che significa che verrà decompresso prima di essere disegnato per la prima volta, quindi sul thread principale che bloccherà l'interfaccia utente.

Preferisco utilizzare questo metodo.

-(UIImage *)fullSizeImageForAssetRepresentation:(ALAssetRepresentation *)assetRepresentation 
{ 
    UIImage *result = nil; 
    NSData *data = nil; 

    uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t)*[assetRepresentation size]); 
    if (buffer != NULL) { 
     NSError *error = nil; 
     NSUInteger bytesRead = [assetRepresentation getBytes:buffer fromOffset:0 length:[assetRepresentation size] error:&error]; 
     data = [NSData dataWithBytes:buffer length:bytesRead]; 

     free(buffer); 
    } 

    if ([data length]) 
    { 
     CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil); 

     NSMutableDictionary *options = [NSMutableDictionary dictionary]; 

     [options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceShouldAllowFloat]; 
     [options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceCreateThumbnailFromImageAlways]; 
     [options setObject:(id)[NSNumber numberWithFloat:640.0f] forKey:(id)kCGImageSourceThumbnailMaxPixelSize]; 
     //[options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceCreateThumbnailWithTransform]; 

     CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (__bridge CFDictionaryRef)options); 

     if (imageRef) { 
      result = [UIImage imageWithCGImage:imageRef scale:[assetRepresentation scale] orientation:(UIImageOrientation)[assetRepresentation orientation]]; 
      CGImageRelease(imageRef); 
     } 

     if (sourceRef) 
      CFRelease(sourceRef); 
    } 

    return result; 
} 

Si può usare in questo modo:

// Get the full image in a background thread 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

    UIImage* image = [self fullSizeImageForAssetRepresentation:asset.defaultRepresentation]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 

    // Do something with the UIImage 
    }); 
});