CFImageSource认为我的视网膜图像是实际大小的2倍

时间:2012-10-22 01:45:46

标签: iphone objective-c ios uiimage cgimagesource

当我在将图像放入UIImage后对图像的大小进行NSLog时,它会以预期的大小显示出来。然而,当我用CGImageSource尝试这个时,我得到的图像尺寸是我预期的两倍。这是我正在使用的代码:

NSString *fullPath = [self fullPathForThumbnail];

    NSURL *imageFileURL = [NSURL fileURLWithPath:fullPath];
    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageFileURL, NULL);

    if (imageSource == NULL) {
        // Error loading image
        return NO;
    }

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,
                             nil];
    CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (__bridge CFDictionaryRef)options);

    CGSize originalSize;

    if (imageProperties) {
        NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
        NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);

        originalSize = CGSizeMake(width.floatValue, height.floatValue);

        CFRelease(imageProperties);
    }

这只发生在视网膜图像上;非视网膜图像似乎是正确的大小。

1 个答案:

答案 0 :(得分:0)

扩大bnoble说的话:

这里有两个不同的概念:图像的尺寸和图像中像素的数量。这两个概念与图像的分辨率相关。

图像的大小以英寸,厘米或打印机的点为单位给出。实际上对打印机的定义有不同的定义,但IT中常用的是Adobe推广的定义,即72点= 1英寸。

在Cocoa和之前的NeXTStep中,图像的size始终是物理大小,像素数是一个单独的度量。在独立于设备的图形系统中,您可以使用72 dpi,150 dpi,300 dpi或2400 dpi的1 cm x 1 cm图像。每个图像中的像素数将不同,但大小始终相同。

iOS上的UIImage类用于将两者等同,假设(像许多人一样)像素大小=物理大小,或者换句话说分辨率是72 dpi。

然而,随着视网膜显示的变化,UIImage size属性的文档现在有以下说法:

  

在iOS 4.0及更高版本中,此值反映了该值的逻辑大小   图像并以点为单位进行测量。在iOS 3.x及更早版本中,此值   始终反映以像素为单位测量的图像尺寸。

因此size的{​​{1}}属性会为您提供物理尺寸。另一方面,UIImage属性为您提供像素数,对于2x视网膜图像,该像素数应为该尺寸点数的两倍。