7

私のアプリケーションでは、画像をアセットとしてアルバムに保存します。また、それらを取得してフルスクリーンで表示したいと考えています。次のコードを使用します。

ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset]; 

ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation];

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

問題は、返される画像がnilであることです。ALAssetRepresentation参照で、画像が収まらない場合は nil が返されることを読みました。

この画像をUIImageViewiPad の画面サイズの に貼り付けました。この問題で私を助けてくれるかどうか疑問に思っていましたか?

前もって感謝します。

4

1 に答える 1

7

私は fullScreenImage や fullResolutionImage のファンではありません。キュー内の複数のアセットに対してこれを行うと、UIImage をすぐに解放しても、メモリ使用量が劇的に増加することがわかりました。また、fullScreenImage または fullResolutionImage を使用する場合、返される UIImage はまだ圧縮されています。つまり、最初に描画される前に解凍されるため、メイン スレッドで UI がブロックされます。

私はこの方法を使用することを好みます。

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

次のように使用できます。

// 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
    });
});
于 2013-05-05T08:54:43.040 に答える