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

Iphone CFImageSource认为我的视网膜图像是实际大小的2倍,iphone,objective-c,ios,uiimage,cgimagesource,Iphone,Objective C,Ios,Uiimage,Cgimagesource,当我在将图像放入UIImage后对图像的大小进行NSLog时,它会以预期的大小显示出来。但是,当我尝试使用CGImageSource时,得到的图像大小是我预期的两倍。这是我使用的代码: NSString *fullPath = [self fullPathForThumbnail]; NSURL *imageFileURL = [NSURL fileURLWithPath:fullPath]; CGImageSourceRef imageSource = CGImageSour

当我在将图像放入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);
    }

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

要进一步阐述bnoble所说的内容:

这里有两个不同的概念:图像的大小和图像中的像素数。这两个概念与图像的分辨率有关

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

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

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

但是,视网膜显示改变了这一点,
UIImage size
属性的文档现在有以下内容:

在iOS 4.0及更高版本中,此值反映了 图像和以点为单位测量。在iOS 3.x及更早版本中,此值 始终反映图像的尺寸(以像素为单位)


因此,
UIImage
size
属性为您提供了物理大小。另一方面,kCGImagePropertyPixelWidth属性提供了像素数,对于2x视网膜图像,像素数应该是该大小点数的两倍。

听起来像是点与像素的混合。这些方法明确表示它们正在返回像素。按比例分割将得到像素,并且在视网膜和非视网膜显示器上都应该匹配。2x是什么意思?假设A.png为100x100,A@2x.png是200x200。节目报道什么?200x200还是400x400?如果它报告200x200,我认为这是预期的行为。我在这里有点困惑。假设这样的场景:您输入一张100x100像素(正常大小)的图片。代码返回什么?现在输入200x200像素(100x100点)视网膜对应物,它返回什么?在100x100像素图像上,它返回100x100的尺寸。在200x200图像(在视网膜上)上,它返回400x400的尺寸。