CFImageSource считает, что мое изображение сетчатки в 2 раза больше, чем на самом деле
Когда я делаю NSLog для размера изображения после помещения его в UIImage, оно получается в ожидаемом размере. Однако, когда я пытаюсь сделать это с 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 ответ
Чтобы расширить то, что сказал Bnoble:
Здесь есть два разных понятия: размер изображения и количество пикселей в изображении. Эти два понятия связаны разрешением изображения.
Размер изображения указывается в таких единицах, как дюймы, сантиметры или точки принтера. На самом деле существуют разные определения точки принтера, но в ИТ обычно используется именно то, что продвигает Adobe, а именно: 72 точки = 1 дюйм.
В какао и ранее NeXTStep, size
изображения всегда было физического размера, количество пикселей было отдельной мерой. В независимой от устройства графической системе вы можете получить изображение размером 1 см x 1 см с разрешением 72 т / д, 150 т / д, 300 т / д или 2400 т / д. Количество пикселей в каждом из этих изображений будет разным, но размер всегда одинаков.
UIImage
класс на iOS, используемый для приравнивания двух, предполагая (как и многие люди), что размер пикселя = физический размер, или, другими словами, разрешение составляет 72 dpi.
Тем не менее, это изменилось с дисплеем сетчатки, документация для UIImage size
собственность теперь может сказать следующее:
В iOS 4.0 и более поздних версиях это значение отражает логический размер изображения и измеряется в точках. В iOS 3.x и более ранних версиях это значение всегда отражает размеры изображения в пикселях.
Итак size
собственность UIImage
дает вам физический размер. kCGImagePropertyPixelWidth
свойство, с другой стороны, дает вам количество пикселей, которое для 2-кратного изображения сетчатки должно быть в два раза больше количества точек размера.