Вот обновленная версия метода от ответа Alfons для учета масштаба экрана, а также некоторые глупые ошибки с десятичными числами в значениях размера с плавающей запятой, как описано в комментарии несинхронизированного из исходного ответа.
SCREEN_SCALE - это макрос, который возвращает либо 1,0, если масштаб не определен, либо независимо от того, масштаб устройства на самом деле ([UIScreen mainScreen] .scale).
- (UIImage *) normalize {
CGSize size = CGSizeMake(round(self.size.width*SCREEN_SCALE), round(self.size.height*SCREEN_SCALE));
CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL,
size.width,
size.height,
8, (4 * size.width),
genericColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(genericColorSpace);
CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
CGRect destRect = CGRectMake(0, 0, size.width, size.height);
CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
CGContextRelease(thumbBitmapCtxt);
UIImage *result = [UIImage imageWithCGImage:tmpThumbImage scale:SCREEN_SCALE orientation:UIImageOrientationUp];
CGImageRelease(tmpThumbImage);
return result;
}