2012-07-09 21 views
6

W mojej aplikacji zapisuję obrazy w albumie jako zasoby. Chcę też je odzyskać i wyświetlić na pełnym ekranie. Używam następujący kod:defaultRepresentation fullScreenImage na ALAsset nie zwraca pełnego obrazu ekranu

ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset]; 

ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation]; 

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

Problem polega na tym, że obraz zwrócony jest nil. Przeczytałem na stronie ALAssetRepresentation, że gdy obraz nie pasuje, jest zwracany zero.

Umieszczam ten obraz na UIImageView, który ma rozmiar ekranu iPada. Zastanawiam się, czy możesz mi pomóc w tym problemie?

Z góry dziękuję.

+0

Z tym kodem wszystko wygląda dobrze i działa również w mojej aplikacji ten kod dostarczyć wszystkie obrazy grzywny. Mogę powiedzieć, że odzyskane zasoby będą zerowe lub jest jakiś problem z tym kodem, a nie ten –

Odpowiedz

8

Nie jestem fanem fullScreenImage lub fullResolutionImage. Zauważyłem, że gdy robisz to w wielu zasobach w kolejce, nawet jeśli natychmiast zwolnisz UIImage, zużycie pamięci znacznie wzrośnie, podczas gdy nie powinno. Również przy korzystaniu z fullScreenImage lub fullResolutionImage zwrócony UIImage jest nadal kompresowany, co oznacza, że ​​zostanie on zdekompresowany przed pierwszym narysowaniem, a więc głównym wątkiem, który zablokuje twój interfejs użytkownika.

Wolę korzystać z tej metody.

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

Można go używać tak:

// 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 
    }); 
});