ALAsset图像大小(ALAsset Image Size)

2019-09-16 09:43发布

鉴于表示相片的ALAsset,是有可能在不将图像加载到一个UIImageView并且也无需使用aspectRationThumnail方法检索照片(高度和宽度)的大小?

Answer 1:

刚一说明:的iOS 5.1引入了一个ALAssetRepresentation实例的新属性的尺寸。 这将返回一个CGSize结构与原始图像的尺寸,并可能在将来出现此问题的最佳解决方案。

干杯,

亨德里克



Answer 2:

float width = asset.defaultRepresentation.dimensions.width;
float height = asset.defaultRepresentation.dimensions.height;

它快速,稳定,并给出了实际尺寸。 我已经与视频ALAsset使用它。



Answer 3:

一个更简单的访问图像大小的方法是通过[ALAssetRepresentation metadata] 。 在图像上我测试了,这NSDictionary包含名为键PixelWidthPixelHeight ,这是NSNumber与你所期望的值的对象。

然而,似乎你会找到确切的键没有特别的保障,所以一定要确保你的应用程序可以处理其中那些键不是在元数据中的情况。 另请参见iOS的ALAsset图像元数据有关速度和线程安全的一些注意事项。

对照

我测试了这两种方法 - 在CGImageSourceRef加载图像数据或读取的元数据 - 在我的iPad上的整个资产库。 这两种方法都返回相同的尺寸,以FLT_EPSILON内。 除了2个离群历时双倍时间,运行时间16次重复的非常相似:

Method                     | Mean time +/- 95% confidence
Size from CGImageSourceRef |    0.1787 +/- 0.0004
Size from metadata         |    0.1789 +/- 0.0015

所以,无论是方法具有性能优势。 这是完全可能的是,元数据字典通过读取图像数据按需构建。



Answer 4:

更新

这并没有如最初提供的,如在评论中所指出的工作。 我已经解决了,但现在它加载所有的图像数据,其中OP试图避免。 它仍然避免了额外的,并且更糟糕的步骤数据解压缩为图像的,。

  1. 获取defaultRepresentation的ALAsset的。
  2. 查看该ALAssetRepresentation数据。
  3. 使用的适应这个方便sizeOfImageAtURL功能。 谢谢你,shpakovski。

下面的代码表示上述步骤。

// This method requires the ImageIO.framework
// This requires memory for the size of the image in bytes, but does not decompress it.
- (CGSize)sizeOfImageWithData:(NSData*) data;
{
    CGSize imageSize = CGSizeZero;
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL);
    if (source)
    {
        NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCGImageSourceShouldCache];

        NSDictionary *properties = (__bridge_transfer NSDictionary*) CGImageSourceCopyPropertiesAtIndex(source, 0, (__bridge CFDictionaryRef) options);

        if (properties)
        {
            NSNumber *width = [properties objectForKey:(NSString *)kCGImagePropertyPixelWidth];
            NSNumber *height = [properties objectForKey:(NSString *)kCGImagePropertyPixelHeight];
            if ((width != nil) && (height != nil))
                imageSize = CGSizeMake(width.floatValue, height.floatValue);
        }
        CFRelease(source);
    }
    return imageSize;
}

- (CGSize)sizeOfAssetRepresentation:(ALAssetRepresentation*) assetRepresentation;
{
    // It may be more efficient to read the [[[assetRepresentation] metadata] objectForKey:@"PixelWidth"] integerValue] and corresponding height instead.
    // Read all the bytes for the image into NSData.
    long long imageDataSize = [assetRepresentation size];
    uint8_t* imageDataBytes = malloc(imageDataSize);
    [assetRepresentation getBytes:imageDataBytes fromOffset:0 length:imageDataSize error:nil];
    NSData *data = [NSData dataWithBytesNoCopy:imageDataBytes length:imageDataSize freeWhenDone:YES];

    return [self sizeOfImageWithData:data];
}

- (CGSize)sizeOfAsset:(ALAsset*) asset;
{
    return [self sizeOfAssetRepresentation:[asset defaultRepresentation]];
}


Answer 5:

float width = CGImageGetWidth(asset.defaultRepresentation.fullResolutionImage);
float height = CGImageGetHeight(asset.defaultRepresentation.fullResolutionImage);

或同为asset.defaultRepresentation.fullScreenImage ...



文章来源: ALAsset Image Size