Правильное Swift 3.0 для iOS 10+ решение: Использование ImageRenderer
и синтаксис закрытия:
func imageWith(newSize: CGSize) -> UIImage {
let renderer = UIGraphicsImageRenderer(size: newSize)
let image = renderer.image { _ in
self.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
}
return image
}
А вот версия Objective C:
@implementation UIImage (ResizeCategory)
- (UIImage *)imageWithSize:(CGSize)newSize
{
UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newSize];
UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) {
[self drawInRect:(CGRect) {.origin = CGPointZero, .size = newSize}];
}];
return image;
}
@end
NSImage - это абстрактный тип данных, который может представлять множество различных типов изображений, а также несколько представлений изображения. Это часто бывает полезно, когда фактический тип изображения не важен для того, что вы пытаетесь сделать. Это также единственный класс изображений, который AppKit будет принимать в своих API (NSImageView и т. Д.).
CGImage может представлять только растровые изображения. Если вам нужно разобраться с фактическими данными растрового изображения, CGImage - подходящий тип для использования. Для операций в CoreGraphics, таких как режимы наложения и маскирование, требуется CGImageRefs. CGImageRefs может использоваться для создания NSBitmapImageRefs, которые затем могут быть добавлены к NSImage.
Я думаю, что документация описывает CIImage лучше всего:
Хотя объект CIImage имеет связанные с ним данные изображения, это не изображение. Вы можете думать об объекте CIImage как о «рецепте» изображения. Объект CIImage имеет всю информацию, необходимую для создания изображения, но Core Image фактически не отображает изображение, пока ему не будет дано указание сделать это. Этот метод «ленивой оценки» позволяет работать с Core Image с максимальной эффективностью.
CIImages - это тип, необходимый для использования различных фильтров Core Image, оптимизированных для GPU, которые поставляются с Mac OS X, но, как и CGImageRefs, они также могут быть преобразован в NSBitmapImageReps.